Compare commits

..

14 Commits

Author SHA1 Message Date
Konstantin Pastbin
0ec4a4085d Try 20 Features threads
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-22 09:38:30 +07:00
Konstantin Pastbin
b36ffe72a9 [generator] Cleanup comments
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-22 09:38:30 +07:00
Konstantin Pastbin
4a3d15c453 [generator] Don't upload World* etc. to the dreamhost sftp
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-22 09:38:30 +07:00
Konstantin Pastbin
150607ac93 [generator] Download and convert planet only if not exists
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-22 09:38:29 +07:00
Konstantin Pastbin
15e0abfc49 [generator] Enable drules generation
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-22 09:38:29 +07:00
zyphlar
5308f02f4d Don't upload at the end, always convert planet to o5m
Signed-off-by: zyphlar <zyphlar@noreply.codeberg.org>
2025-08-22 09:38:29 +07:00
x7z4w
26be9a19dc [build] Remove redundant configure.sh
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-08-22 09:38:29 +07:00
zyphlar
2cb1ed517b [generator] Add sftp and protobuf deps
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-08-22 09:38:29 +07:00
zyphlar
db70b77054 Settings change
Signed-off-by: zyphlar <zyphlar@gmail.com>
2025-08-22 09:38:29 +07:00
Konstantin Pastbin
9f8d4c8bdb [generator] Skip World map download and symbols regen
Signed-off-by: zyphlar <zyphlar@gmail.com>
2025-08-22 09:38:29 +07:00
Konstantin Pastbin
fb92edd0f5 [generator] Update conf path
Signed-off-by: zyphlar <zyphlar@gmail.com>
2025-08-22 09:38:29 +07:00
zyphlar
463b2f0417 Update generator scripts for docker/prod
Signed-off-by: zyphlar <zyphlar@gmail.com>
2025-08-22 09:38:29 +07:00
zyphlar
73f2074c0b Add docker run script
Signed-off-by: zyphlar <zyphlar@gmail.com>
2025-08-22 09:38:29 +07:00
zyphlar
cc698dba49 Add files to automatically generate maps with Docker
Signed-off-by: zyphlar <zyphlar@gmail.com>
2025-08-22 09:38:29 +07:00
1150 changed files with 4484 additions and 6228 deletions

View File

@@ -1,9 +1,8 @@
name: DCO
name: dco
on: [pull_request]
jobs:
check:
runs-on: ubuntu-latest
runs-on: codeberg-tiny
steps:
- name: Check for Developer Certificate of Origin (DCO) compliance
uses: https://github.com/KineticCafe/actions-dco@fb284c903a7673a3d4b0bdd104479a6f0d46dae7 # v1.3.6
- uses: https://github.com/KineticCafe/actions-dco@v1

1
.gitignore vendored
View File

@@ -9,6 +9,7 @@ Makefile.Release
object_script.*.Debug
object_script.*.Release
compile_commands.json
*.local.*
stxxl.errlog
stxxl.log

View File

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

View File

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

View File

@@ -1,4 +1,4 @@
Una app realizzata dalla community gratuita e open-source, basata su OpenStreetMap e sull'impegno alla trasparenza, al rispetto della Privacy e senza scopo di lucro. CoMaps è uno spin-off di Organic Maps, che a sua volta deriva da Maps.ME.
Una app sviluppata dalla comunità, gratuita e open-source, basata su OpenStreetMap e sull'impegno alla trasparenza, al rispetto della Privacy senza scopo di lucro. CoMaps è uno spin-off di Organic Maps, che a sua volta deriva da Maps.ME.
Leggi delle ragioni del progetto e della sua direzione futura su <b><i>codeberg.org/comaps</i></b>.
Unisciti alla nostra comunità e aiutaci a creare la migliore app di mappe.
@@ -15,7 +15,7 @@ Unisciti alla nostra comunità e aiutaci a creare la migliore app di mappe.
<b>Funzionalità principali</b>:
• Scarica mappe dettagliate di luoghi che non sono disponibili su Google Maps
• Modalità Outdoor con percorsi escursionistici, campeggi, sorgenti d'acqua, picchi, dislivelli ed altri punti d'interesse evidenziati
• Modalità Outdoor con percorsi escursionistici, campeggi, sorgenti d'acqua, picchi, dislivelli ed altro evidenziati
• Strade pedonali e piste ciclabili
• Punti d'interesse come ristoranti, stazioni di benzina, hotel, negozi, luoghi turistici e molto altro
• Cerca per nome, indirizzo o categoria

View File

@@ -1 +1 @@
Navigazione semplice - Immergiti nella tua avventura - Realizzato dalla comunità
Navigazione semplice - Immergiti nella tua avventura - Sviluppato dalla comunità

View File

@@ -1,4 +1,4 @@
package app.organicmaps.location;
package app.organicmaps.sdk.location;
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
@@ -10,7 +10,6 @@ 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;

View File

@@ -1,25 +1,23 @@
package app.organicmaps.location;
package app.organicmaps.sdk.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 LocationProviderFactoryImpl implements LocationProviderFactory
public class LocationProviderFactory
{
private static final String TAG = LocationProviderFactoryImpl.class.getSimpleName();
private static final String TAG = LocationProviderFactory.class.getSimpleName();
public boolean isGoogleLocationAvailable(@NonNull Context context)
public static boolean isGoogleLocationAvailable(@NonNull Context context)
{
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS;
}
public BaseLocationProvider getProvider(@NonNull Context context, @NonNull BaseLocationProvider.Listener listener)
public static BaseLocationProvider getProvider(@NonNull Context context,
@NonNull BaseLocationProvider.Listener listener)
{
if (isGoogleLocationAvailable(context) && Config.useGoogleServices())
{

View File

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

View File

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

View File

@@ -10,8 +10,6 @@ import androidx.core.content.ContextCompat;
import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
import app.organicmaps.sdk.bookmarks.data.ElevationInfo;
import app.organicmaps.sdk.bookmarks.data.Track;
import app.organicmaps.sdk.bookmarks.data.TrackStatistics;
import app.organicmaps.util.ThemeUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.widget.placepage.AxisValueFormatter;
@@ -33,16 +31,17 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class ChartController implements OnChartValueSelectedListener
public class ChartController implements OnChartValueSelectedListener,
BookmarkManager.OnElevationActivePointChangedListener,
BookmarkManager.OnElevationCurrentPositionChangedListener
{
private static final int CHART_Y_LABEL_COUNT = 3;
private static final int CHART_X_LABEL_COUNT = 6;
private static final int CHART_ANIMATION_DURATION = 0;
private static final int CHART_ANIMATION_DURATION = 1500;
private static final int CHART_FILL_ALPHA = (int) (0.12 * 255);
private static final int CHART_AXIS_GRANULARITY = 100;
private static final float CUBIC_INTENSITY = 0.2f;
private static final int CURRENT_POSITION_OUT_OF_TRACK = -1;
private static final String ELEVATION_PROFILE_POINTS = "ELEVATION_PROFILE_POINTS";
@SuppressWarnings("NullableProblems")
@NonNull
@@ -63,7 +62,6 @@ public class ChartController implements OnChartValueSelectedListener
private final Context mContext;
private long mTrackId = Utils.INVALID_ID;
private boolean mCurrentPositionOutOfTrack = true;
private boolean mInformSelectedActivePointToCore = true;
public ChartController(@NonNull Context context)
{
@@ -72,6 +70,8 @@ public class ChartController implements OnChartValueSelectedListener
public void initialize(@NonNull View view)
{
BookmarkManager.INSTANCE.setElevationActivePointChangedListener(this);
BookmarkManager.INSTANCE.setElevationCurrentPositionChangedListener(this);
final Resources resources = mContext.getResources();
mChart = view.findViewById(R.id.elevation_profile_chart);
@@ -101,6 +101,13 @@ public class ChartController implements OnChartValueSelectedListener
initAxises();
}
@SuppressWarnings("unused")
public void destroy()
{
BookmarkManager.INSTANCE.setElevationActivePointChangedListener(null);
BookmarkManager.INSTANCE.setElevationCurrentPositionChangedListener(null);
}
private void highlightChartCurrentLocation()
{
mChart.highlightValues(Collections.singletonList(getCurrentPosHighlight()),
@@ -135,17 +142,15 @@ public class ChartController implements OnChartValueSelectedListener
mChart.getAxisRight().setEnabled(false);
}
public void setData(Track track)
public void setData(@NonNull ElevationInfo info)
{
mTrackId = track.getTrackId();
ElevationInfo info = track.getElevationInfo();
TrackStatistics stats = track.getTrackStatistics();
mTrackId = info.getId();
List<Entry> values = new ArrayList<>();
for (ElevationInfo.Point point : info.getPoints())
values.add(new Entry((float) point.getDistance(), point.getAltitude(), point));
values.add(new Entry((float) point.getDistance(), point.getAltitude()));
LineDataSet set = new LineDataSet(values, ELEVATION_PROFILE_POINTS);
LineDataSet set = new LineDataSet(values, "Elevation_profile_points");
set.setMode(LineDataSet.Mode.CUBIC_BEZIER);
set.setCubicIntensity(CUBIC_INTENSITY);
set.setDrawFilled(true);
@@ -168,8 +173,8 @@ public class ChartController implements OnChartValueSelectedListener
mChart.setData(data);
mChart.animateX(CHART_ANIMATION_DURATION);
mMinAltitude.setText(Framework.nativeFormatAltitude(stats.getMinElevation()));
mMaxAltitude.setText(Framework.nativeFormatAltitude(stats.getMaxElevation()));
mMinAltitude.setText(Framework.nativeFormatAltitude(info.getMinAltitude()));
mMaxAltitude.setText(Framework.nativeFormatAltitude(info.getMaxAltitude()));
highlightActivePointManually();
}
@@ -187,9 +192,7 @@ public class ChartController implements OnChartValueSelectedListener
if (mTrackId == Utils.INVALID_ID)
return;
if (mInformSelectedActivePointToCore)
BookmarkManager.INSTANCE.setElevationActivePoint(mTrackId, e.getX(), (ElevationInfo.Point) e.getData());
mInformSelectedActivePointToCore = true;
BookmarkManager.INSTANCE.setElevationActivePoint(mTrackId, e.getX());
}
@NonNull
@@ -208,6 +211,7 @@ public class ChartController implements OnChartValueSelectedListener
highlightChartCurrentLocation();
}
@Override
public void onCurrentPositionChanged()
{
if (mTrackId == Utils.INVALID_ID)
@@ -218,6 +222,7 @@ public class ChartController implements OnChartValueSelectedListener
highlightActivePointManually();
}
@Override
public void onElevationActivePointChanged()
{
if (mTrackId == Utils.INVALID_ID)
@@ -229,7 +234,6 @@ public class ChartController implements OnChartValueSelectedListener
private void highlightActivePointManually()
{
Highlight highlight = getActivePoint();
mInformSelectedActivePointToCore = false;
mChart.highlightValue(highlight, true);
}

View File

@@ -27,7 +27,6 @@ import androidx.annotation.StringRes;
import androidx.annotation.StyleRes;
import androidx.core.view.ViewCompat;
import app.organicmaps.base.BaseMwmFragmentActivity;
import app.organicmaps.downloader.MapManagerHelper;
import app.organicmaps.intent.Factory;
import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.downloader.CountryItem;
@@ -36,7 +35,7 @@ import app.organicmaps.sdk.location.LocationListener;
import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.ConnectionState;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
import com.google.android.material.button.MaterialButton;
@@ -117,10 +116,10 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
private final app.organicmaps.sdk.DownloadResourcesLegacyActivity.Listener mResourcesDownloadListener =
new app.organicmaps.sdk.DownloadResourcesLegacyActivity.Listener() {
@Override
public void onProgress(final int bytesDownloaded)
public void onProgress(final int percent)
{
if (!isFinishing())
mProgress.setProgressCompat(bytesDownloaded, true);
mProgress.setProgressCompat(percent, true);
}
@Override
@@ -156,9 +155,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
showMap();
return;
case CountryItem.STATUS_FAILED:
MapManagerHelper.showError(DownloadResourcesLegacyActivity.this, item, null);
return;
case CountryItem.STATUS_FAILED: MapManager.showError(DownloadResourcesLegacyActivity.this, item, null); return;
}
}
}
@@ -253,8 +250,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
setDownloadMessage(bytes);
mProgress.setMax(bytes);
// Start progress at 1% according to M3 guidelines
mProgress.setProgressCompat(bytes/100, true);
mProgress.setProgressCompat(0, true);
}
else
finishFilesDownload(bytes);
@@ -372,11 +368,10 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
String fileSizeString = StringUtils.getFileSizeString(this, item.totalSize);
mTvMessage.setText(getString(R.string.downloading_country_can_proceed, item.name, fileSizeString));
mProgress.setMax((int) item.totalSize);
// Start progress at 1% according to M3 guidelines
mProgress.setProgressCompat((int) (item.totalSize/100), true);
mProgress.setProgressCompat(0, true);
mCountryDownloadListenerSlot = MapManager.nativeSubscribe(mCountryDownloadListener);
MapManagerHelper.startDownload(mCurrentCountry);
MapManager.startDownload(mCurrentCountry);
setAction(PROCEED_TO_MAP);
}
else

View File

@@ -12,7 +12,6 @@ import static app.organicmaps.sdk.location.LocationState.FOLLOW;
import static app.organicmaps.sdk.location.LocationState.FOLLOW_AND_ROTATE;
import static app.organicmaps.sdk.location.LocationState.LOCATION_TAG;
import static app.organicmaps.sdk.util.PowerManagment.POWER_MANAGEMENT_TAG;
import static app.organicmaps.sdk.util.Utils.dimen;
import android.annotation.SuppressLint;
import android.app.Activity;
@@ -112,6 +111,7 @@ import app.organicmaps.sdk.settings.UnitLocale;
import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.LocationUtils;
import app.organicmaps.sdk.util.PowerManagment;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.log.Logger;
import app.organicmaps.sdk.widget.placepage.PlacePageData;
import app.organicmaps.search.FloatingSearchToolbarController;
@@ -122,7 +122,6 @@ import app.organicmaps.settings.SettingsActivity;
import app.organicmaps.util.SharingUtils;
import app.organicmaps.util.ThemeSwitcher;
import app.organicmaps.util.ThemeUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
import app.organicmaps.util.bottomsheet.MenuBottomSheetItem;
@@ -458,10 +457,12 @@ public class MwmActivity extends BaseMwmFragmentActivity
@StyleRes
protected int getThemeResourceId(@NonNull String theme)
{
if (Config.UiTheme.isDefault(theme))
Context context = getApplicationContext();
if (ThemeUtils.isDefaultTheme(context, theme))
return R.style.MwmTheme_MainActivity;
if (Config.UiTheme.isNight(theme))
if (ThemeUtils.isNightTheme(context, theme))
return R.style.MwmTheme_Night_MainActivity;
return super.getThemeResourceId(theme);
@@ -583,7 +584,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
private void refreshLightStatusBar()
{
UiUtils.setLightStatusBar(this, !(ThemeUtils.isNightTheme() || RoutingController.get().isPlanning()
UiUtils.setLightStatusBar(this, !(ThemeUtils.isNightTheme(this) || RoutingController.get().isPlanning()
|| ChoosePositionMode.get() != ChoosePositionMode.None));
}
@@ -593,7 +594,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
UiUtils.setViewInsetsPaddingBottom(mPointChooser, windowInsets);
UiUtils.setViewInsetsPaddingNoBottom(mPointChooserToolbar, windowInsets);
final int trackRecorderOffset =
TrackRecorder.nativeIsTrackRecordingEnabled() ? dimen(this, R.dimen.map_button_size) : 0;
TrackRecorder.nativeIsTrackRecordingEnabled() ? UiUtils.dimen(this, R.dimen.map_button_size) : 0;
mNavBarHeight = isFullscreen() ? 0 : windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom;
// For the first loading, set compass top margin to status bar size
// The top inset will be then be updated by the routing controller
@@ -1647,17 +1648,17 @@ public class MwmActivity extends BaseMwmFragmentActivity
final int orientation = getResources().getConfiguration().orientation;
final boolean isTrackRecordingEnabled = TrackRecorder.nativeIsTrackRecordingEnabled();
if (isTrackRecordingEnabled && (orientation != Configuration.ORIENTATION_LANDSCAPE))
offsetY += dimen(this, R.dimen.map_button_size);
offsetY += UiUtils.dimen(this, R.dimen.map_button_size);
if (orientation == Configuration.ORIENTATION_LANDSCAPE)
{
if (show)
{
final boolean isSmallScreen = UiUtils.getDisplayTotalHeight(this) < dimen(this, R.dimen.dp_400);
final boolean isSmallScreen = UiUtils.getDisplayTotalHeight(this) < UiUtils.dimen(this, R.dimen.dp_400);
if (!isSmallScreen || TrackRecorder.nativeIsTrackRecordingEnabled())
offsetX += dimen(this, R.dimen.map_button_size);
offsetX += UiUtils.dimen(this, R.dimen.map_button_size);
}
else if (isTrackRecordingEnabled)
offsetY += dimen(this, R.dimen.map_button_size);
offsetY += UiUtils.dimen(this, R.dimen.map_button_size);
}
updateCompassOffset(offsetY, offsetX);
}
@@ -2456,7 +2457,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
if (mCurrentWindowInsets != null)
{
final int offset = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top;
updateCompassOffset(offset + dimen(this, R.dimen.map_button_size));
updateCompassOffset(offset + UiUtils.dimen(this, R.dimen.map_button_size));
}
Toast.makeText(this, R.string.track_recording, Toast.LENGTH_SHORT).show();
TrackRecordingService.startForegroundService(getApplicationContext());
@@ -2549,7 +2550,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
items.add(new MenuBottomSheetItem(R.string.download_maps, R.drawable.ic_download, getDownloadMapsCounter(),
this::onDownloadMapsOptionSelected));
mDonatesUrl = Utils.getDonateUrl(getApplicationContext());
mDonatesUrl = Config.getDonateUrl(getApplicationContext());
if (!mDonatesUrl.isEmpty())
items.add(new MenuBottomSheetItem(R.string.donate, R.drawable.ic_donate, this::onDonateOptionSelected));

View File

@@ -14,10 +14,8 @@ import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
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;
@@ -43,9 +41,6 @@ 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;
@@ -104,12 +99,6 @@ public class MwmApplication extends Application implements Application.ActivityL
return mOrganicMaps;
}
@NonNull
public LocationProviderFactoryImpl getLocationProviderFactory()
{
return mLocationProviderFactory;
}
@NonNull
public static MwmApplication from(@NonNull Context context)
{
@@ -130,10 +119,7 @@ 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, mLocationProviderFactory);
mOrganicMaps = new OrganicMaps(getApplicationContext());
ConnectionState.INSTANCE.initialize(this);

View File

@@ -9,8 +9,7 @@ import androidx.annotation.IntegerRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import app.organicmaps.sdk.util.Utils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import org.chromium.base.ObserverList;
class PanelAnimator
@@ -27,7 +26,7 @@ class PanelAnimator
PanelAnimator(MwmActivity activity)
{
mActivity = activity;
mWidth = Utils.dimen(activity.getApplicationContext(), R.dimen.panel_width);
mWidth = UiUtils.dimen(activity.getApplicationContext(), R.dimen.panel_width);
mPanel = mActivity.findViewById(R.id.fragment_container);
mDuration = mActivity.getResources().getInteger(R.integer.anim_panel);
}

View File

@@ -60,10 +60,11 @@ public class SplashActivity extends AppCompatActivity
{
super.onCreate(savedInstanceState);
final String theme = Config.UiTheme.getCurrent();
if (Config.UiTheme.isDefault(theme))
final Context context = getApplicationContext();
final String theme = Config.getCurrentUiTheme(context);
if (ThemeUtils.isDefaultTheme(context, theme))
setTheme(R.style.MwmTheme_Splash);
else if (Config.UiTheme.isNight(theme))
else if (ThemeUtils.isNightTheme(context, theme))
setTheme(R.style.MwmTheme_Night_Splash);
else
throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme);

View File

@@ -9,7 +9,7 @@ import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.annotation.NonNull;
import app.organicmaps.base.OnBackPressListener;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
public abstract class WebContainerDelegate implements OnBackPressListener
{

View File

@@ -1,7 +1,6 @@
package app.organicmaps.backup;
import static app.organicmaps.sdk.util.StorageUtils.isFolderWritable;
import static app.organicmaps.sdk.util.Utils.dimen;
import static app.organicmaps.settings.BackupSettingsFragment.MAX_BACKUPS_DEFAULT_COUNT;
import static app.organicmaps.settings.BackupSettingsFragment.MAX_BACKUPS_KEY;
@@ -16,8 +15,8 @@ import android.text.style.AbsoluteSizeSpan;
import androidx.annotation.NonNull;
import androidx.documentfile.provider.DocumentFile;
import app.organicmaps.R;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.log.Logger;
import app.organicmaps.util.UiUtils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
@@ -51,14 +50,14 @@ public class BackupUtils
String volumeName;
if ("primary".equalsIgnoreCase(volumeId))
volumeName = context.getString(app.organicmaps.sdk.R.string.maps_storage_shared);
volumeName = context.getString(R.string.maps_storage_shared);
else
volumeName = context.getString(app.organicmaps.sdk.R.string.maps_storage_removable);
volumeName = context.getString(R.string.maps_storage_removable);
SpannableStringBuilder sb = new SpannableStringBuilder();
sb.append(volumeName + ": \n", new AbsoluteSizeSpan(dimen(context, R.dimen.text_size_body_3)),
sb.append(volumeName + ": \n", new AbsoluteSizeSpan(UiUtils.dimen(context, R.dimen.text_size_body_3)),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
sb.append("/" + subPath, new AbsoluteSizeSpan(dimen(context, R.dimen.text_size_body_4)),
sb.append("/" + subPath, new AbsoluteSizeSpan(UiUtils.dimen(context, R.dimen.text_size_body_4)),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return sb;
}

View File

@@ -15,7 +15,7 @@ public class BaseMwmDialogFragment extends DialogFragment
@StyleRes
protected final int getFullscreenTheme()
{
return ThemeUtils.isNightTheme() ? getFullscreenDarkTheme() : getFullscreenLightTheme();
return ThemeUtils.isNightTheme(requireContext()) ? getFullscreenDarkTheme() : getFullscreenLightTheme();
}
protected int getStyle()

View File

@@ -1,6 +1,7 @@
package app.organicmaps.base;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.media.AudioManager;
@@ -23,6 +24,7 @@ import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.concurrency.UiThread;
import app.organicmaps.sdk.util.log.Logger;
import app.organicmaps.util.RtlUtils;
import app.organicmaps.util.ThemeUtils;
import com.google.android.material.appbar.MaterialToolbar;
import java.util.Objects;
@@ -38,10 +40,12 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
@StyleRes
protected int getThemeResourceId(@NonNull String theme)
{
if (Config.UiTheme.isDefault(theme))
Context context = getApplicationContext();
if (ThemeUtils.isDefaultTheme(context, theme))
return R.style.MwmTheme;
if (Config.UiTheme.isNight(theme))
if (ThemeUtils.isNightTheme(context, theme))
return R.style.MwmTheme_Night;
throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme);
@@ -58,7 +62,7 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
protected final void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
mThemeName = Config.UiTheme.getCurrent();
mThemeName = Config.getCurrentUiTheme(getApplicationContext());
setTheme(getThemeResourceId(mThemeName));
EdgeToEdge.enable(this, SystemBarStyle.dark(Color.TRANSPARENT));
RtlUtils.manageRtl(this);
@@ -118,7 +122,7 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
public void onPostResume()
{
super.onPostResume();
if (!mThemeName.equals(Config.UiTheme.getCurrent()))
if (!mThemeName.equals(Config.getCurrentUiTheme(getApplicationContext())))
{
// Workaround described in https://code.google.com/p/android/issues/detail?id=93731
UiThread.runLater(this::recreate);

View File

@@ -14,7 +14,7 @@ import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils.ScrollableContentInsetsListener;
import app.organicmaps.widget.PlaceholderView;

View File

@@ -10,7 +10,7 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentFactory;
import androidx.fragment.app.FragmentManager;
import app.organicmaps.R;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
import com.google.android.material.appbar.MaterialToolbar;

View File

@@ -42,7 +42,7 @@ public class BookmarkCategoriesActivity extends BaseToolbarActivity
@StyleRes
public int getThemeResourceId(@NonNull String theme)
{
return ThemeUtils.getWindowBgThemeResourceId(theme);
return ThemeUtils.getWindowBgThemeResourceId(getApplicationContext(), theme);
}
@Override

View File

@@ -11,7 +11,7 @@ import app.organicmaps.R;
import app.organicmaps.adapter.OnItemClickListener;
import app.organicmaps.sdk.bookmarks.data.BookmarkCategory;
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;

View File

@@ -41,7 +41,7 @@ public class BookmarkListActivity extends BaseToolbarActivity
@StyleRes
public int getThemeResourceId(@NonNull String theme)
{
return ThemeUtils.getCardBgThemeResourceId(theme);
return ThemeUtils.getCardBgThemeResourceId(getApplicationContext(), theme);
}
@Override

View File

@@ -33,15 +33,16 @@ import app.organicmaps.sdk.bookmarks.data.BookmarkInfo;
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
import app.organicmaps.sdk.bookmarks.data.BookmarkSharingResult;
import app.organicmaps.sdk.bookmarks.data.CategoryDataSource;
import app.organicmaps.sdk.bookmarks.data.Icon;
import app.organicmaps.sdk.bookmarks.data.KmlFileType;
import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
import app.organicmaps.sdk.bookmarks.data.SortedBlock;
import app.organicmaps.sdk.bookmarks.data.Track;
import app.organicmaps.sdk.search.BookmarkSearchListener;
import app.organicmaps.sdk.search.SearchEngine;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.Graphics;
import app.organicmaps.util.SharingUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils;
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;

View File

@@ -13,7 +13,7 @@ import androidx.fragment.app.FragmentManager;
import app.organicmaps.R;
import app.organicmaps.base.BaseMwmDialogFragment;
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
public class ChooseBookmarksSortingTypeFragment
extends BaseMwmDialogFragment implements RadioGroup.OnCheckedChangeListener

View File

@@ -18,8 +18,8 @@ import app.organicmaps.sdk.bookmarks.data.BookmarkInfo;
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
import app.organicmaps.sdk.bookmarks.data.IconClickListener;
import app.organicmaps.sdk.bookmarks.data.Track;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.Graphics;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.widget.recycler.RecyclerClickListener;
import app.organicmaps.widget.recycler.RecyclerLongClickListener;

View File

@@ -12,7 +12,6 @@ import androidx.lifecycle.LifecycleOwner;
import app.organicmaps.R;
import app.organicmaps.car.screens.ErrorScreen;
import app.organicmaps.car.screens.base.BaseScreen;
import app.organicmaps.downloader.MapManagerHelper;
import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.util.StringUtils;
@@ -170,7 +169,7 @@ class DownloaderScreen extends BaseScreen
mIsDownloadFailed = true;
final ErrorScreen.Builder builder = new ErrorScreen.Builder(getCarContext())
.setTitle(R.string.country_status_download_failed)
.setErrorMessage(MapManagerHelper.getErrorCodeStrRes(data.errorCode))
.setErrorMessage(MapManager.getErrorCodeStrRes(data.errorCode))
.setPositiveButton(R.string.downloader_retry, null);
if (!mIsCancelActionDisabled)
builder.setNegativeButton(R.string.cancel, this::finish);

View File

@@ -10,20 +10,19 @@ import androidx.car.app.CarContext;
import app.organicmaps.R;
import app.organicmaps.sdk.MapStyle;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.Config;
public final class ThemeUtils
{
public enum ThemeMode
{
AUTO(R.string.auto, Config.UiTheme.AUTO),
LIGHT(R.string.off, Config.UiTheme.DEFAULT),
NIGHT(R.string.on, Config.UiTheme.NIGHT);
AUTO(R.string.auto, R.string.theme_auto),
LIGHT(R.string.off, R.string.theme_default),
NIGHT(R.string.on, R.string.theme_night);
ThemeMode(@StringRes int titleId, @NonNull String config)
ThemeMode(@StringRes int titleId, @StringRes int prefsKeyId)
{
mTitleId = titleId;
mConfig = config;
mPrefsKeyId = prefsKeyId;
}
@StringRes
@@ -32,16 +31,16 @@ public final class ThemeUtils
return mTitleId;
}
@NonNull
public String getConfig()
@StringRes
public int getPrefsKeyId()
{
return mConfig;
return mPrefsKeyId;
}
@StringRes
private final int mTitleId;
@NonNull
private final String mConfig;
@StringRes
private final int mPrefsKeyId;
}
private static final String ANDROID_AUTO_PREFERENCES_FILE_KEY = "ANDROID_AUTO_PREFERENCES_FILE_KEY";
@@ -80,20 +79,23 @@ public final class ThemeUtils
@UiThread
public static void setThemeMode(@NonNull CarContext context, @NonNull ThemeMode themeMode)
{
getSharedPreferences(context).edit().putString(THEME_KEY, themeMode.getConfig()).commit();
getSharedPreferences(context).edit().putString(THEME_KEY, context.getString(themeMode.getPrefsKeyId())).commit();
update(context, themeMode);
}
@NonNull
public static ThemeMode getThemeMode(@NonNull CarContext context)
{
final String themeMode = getSharedPreferences(context).getString(THEME_KEY, ThemeMode.AUTO.getConfig());
final String autoTheme = context.getString(R.string.theme_auto);
final String lightTheme = context.getString(R.string.theme_default);
final String nightTheme = context.getString(R.string.theme_night);
final String themeMode = getSharedPreferences(context).getString(THEME_KEY, autoTheme);
if (themeMode.equals(ThemeMode.AUTO.getConfig()))
if (themeMode.equals(autoTheme))
return ThemeMode.AUTO;
else if (themeMode.equals(ThemeMode.LIGHT.getConfig()))
else if (themeMode.equals(lightTheme))
return ThemeMode.LIGHT;
else if (themeMode.equals(ThemeMode.NIGHT.getConfig()))
else if (themeMode.equals(nightTheme))
return ThemeMode.NIGHT;
else
throw new IllegalArgumentException("Unsupported value");

View File

@@ -15,7 +15,7 @@ import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.downloader.UpdateInfo;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
@@ -29,7 +29,7 @@ class BottomPanel
@Override
public void onClick(View v)
{
MapManagerHelper.warn3gAndDownload(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
MapManager.warn3gAndDownload(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
}
};
@@ -38,10 +38,7 @@ class BottomPanel
public void onClick(View v)
{
final String country = mFragment.getCurrentRoot();
MapManagerHelper.warnOn3gUpdate(mFragment.requireActivity(), country, () -> {
DownloaderService.startForegroundService();
MapManagerHelper.startUpdate(country);
});
MapManager.warnOn3gUpdate(mFragment.requireActivity(), country, () -> MapManager.startUpdate(country));
}
};
@@ -58,7 +55,7 @@ class BottomPanel
@Override
public void onClick(View v)
{
MapManagerHelper.warn3gAndRetry(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
MapManager.warn3gAndRetry(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
}
};

View File

@@ -16,7 +16,7 @@ import app.organicmaps.base.BaseMwmFragmentActivity;
import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.widget.WheelProgressView;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.textview.MaterialTextView;
@@ -198,8 +198,7 @@ public class CountrySuggestFragment extends BaseMwmFragment implements View.OnCl
final int id = v.getId();
if (id == R.id.btn__download_map)
{
MapManagerHelper.warn3gAndDownload(requireActivity(), mCurrentCountry.id,
() -> mDownloadingCountry = mCurrentCountry);
MapManager.warn3gAndDownload(requireActivity(), mCurrentCountry.id, () -> mDownloadingCountry = mCurrentCountry);
}
else if (id == R.id.btn__select_map)
{

View File

@@ -24,7 +24,7 @@ import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
import app.organicmaps.util.bottomsheet.MenuBottomSheetItem;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
@@ -93,7 +93,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
private void onDownloadActionSelected(final CountryItem item, DownloaderAdapter adapter)
{
MapManagerHelper.warn3gAndDownload(adapter.mActivity, item.id, null);
MapManager.warn3gAndDownload(adapter.mActivity, item.id, null);
}
private void onUpdateActionSelected(final CountryItem item, DownloaderAdapter adapter)
@@ -101,7 +101,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
item.update();
if (item.status != CountryItem.STATUS_UPDATABLE)
return;
MapManagerHelper.warnOn3gUpdate(adapter.mActivity, item.id, () -> MapManagerHelper.startUpdate(item.id));
MapManager.warnOn3gUpdate(adapter.mActivity, item.id, () -> MapManager.startUpdate(item.id));
}
private void onExploreActionSelected(CountryItem item, DownloaderAdapter adapter)
@@ -206,7 +206,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
{
if (item.isLeafNode && item.newStatus == CountryItem.STATUS_FAILED)
{
MapManagerHelper.showError(mActivity, item, null);
MapManager.showError(mActivity, item, null);
break;
}
}
@@ -382,12 +382,9 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
else
processLongClick();
}
case CountryItem.STATUS_FAILED ->
{
MapManagerHelper.warn3gAndRetry(mActivity, mItem.id, null);
}
case CountryItem.STATUS_FAILED -> MapManager.warn3gAndRetry(mActivity, mItem.id, null);
case CountryItem.STATUS_UPDATABLE ->
MapManagerHelper.warnOn3gUpdate(mActivity, mItem.id, () -> MapManagerHelper.startUpdate(mItem.id));
MapManager.warnOn3gUpdate(mActivity, mItem.id, () -> MapManager.startUpdate(mItem.id));
default -> throw new IllegalArgumentException("Inappropriate item status: " + mItem.status);
}
}

View File

@@ -9,8 +9,7 @@ import androidx.core.view.OnApplyWindowInsetsListener;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R;
import app.organicmaps.sdk.util.Utils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.WindowInsetUtils;
final class DownloaderInsetsListener implements OnApplyWindowInsetsListener
@@ -56,7 +55,7 @@ final class DownloaderInsetsListener implements OnApplyWindowInsetsListener
private void applyInsetsToButtons(Insets insets)
{
int baseMargin = Utils.dimen(mContext, R.dimen.margin_base);
int baseMargin = UiUtils.dimen(mContext, R.dimen.margin_base);
ViewGroup.MarginLayoutParams fabParams = (ViewGroup.MarginLayoutParams) mFab.getLayoutParams();
ViewGroup.MarginLayoutParams buttonParams = (ViewGroup.MarginLayoutParams) mButton.getLayoutParams();

View File

@@ -20,7 +20,6 @@ import app.organicmaps.R;
import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.log.Logger;
import java.util.Objects;
public class DownloaderNotifier
{
@@ -30,8 +29,7 @@ public class DownloaderNotifier
public static final int NOTIFICATION_ID = 1;
private final Context mContext;
private NotificationCompat.Builder mProgressNotificationBuilder = null;
private String mNotificationCountryId = null;
private NotificationCompat.Builder mProgressNotificationBuilder;
public DownloaderNotifier(Context context)
{
@@ -47,7 +45,6 @@ public class DownloaderNotifier
.setShowBadge(true)
.setVibrationEnabled(false)
.setLightsEnabled(false)
.setSound(null, null)
.build();
notificationManager.createNotificationChannel(channel);
}
@@ -65,6 +62,8 @@ public class DownloaderNotifier
final String countryName = MapManager.nativeGetName(countryId);
final String content = mContext.getString(R.string.download_country_failed, countryName);
var contentPendingIntent = getNotificationPendingIntent(countryId);
final Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID)
.setAutoCancel(true)
.setCategory(NotificationCompat.CATEGORY_ERROR)
@@ -75,7 +74,7 @@ public class DownloaderNotifier
.setContentText(content)
.setShowWhen(true)
.setTicker(getTicker(mContext, title, content))
.setContentIntent(getNotificationPendingIntent(countryId))
.setContentIntent(contentPendingIntent)
.setOnlyAlertOnce(true)
.build();
@@ -111,41 +110,32 @@ public class DownloaderNotifier
@NonNull
public Notification buildProgressNotification(@Nullable String countryId, int maxProgress, int progress)
{
var builder = getNotificationBuilder(countryId);
/// @todo Doesn't work properly .. Bad input sizes?
// builder.setProgress(maxProgress, progress, maxProgress == 0);
builder.setProgress(maxProgress, progress, true);
var builder = startNotification(countryId);
builder.setProgress(maxProgress, progress, maxProgress == 0);
builder.setContentText("Download in progress");
return builder.build();
}
@NonNull
private NotificationCompat.Builder getNotificationBuilder(@Nullable String countryId)
private NotificationCompat.Builder startNotification(@Nullable String countryId)
{
if (mProgressNotificationBuilder == null || !Objects.equals(countryId, mNotificationCountryId))
{
mNotificationCountryId = countryId;
final String countryName = countryId != null ? MapManager.nativeGetName(countryId) : "";
final String title = mContext.getString(R.string.app_name);
mProgressNotificationBuilder =
new NotificationCompat.Builder(mContext, CHANNEL_ID)
.setAutoCancel(true)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setSmallIcon(R.drawable.ic_logo_small)
.setColor(ContextCompat.getColor(mContext, R.color.notification))
.setShowWhen(true)
.setContentTitle(mContext.getString(R.string.app_name))
.setContentIntent(getNotificationPendingIntent(countryId))
.setContentText(mContext.getString(R.string.downloader_downloading) + " " + countryName)
.setSound(null);
}
return mProgressNotificationBuilder;
return new NotificationCompat.Builder(mContext, CHANNEL_ID)
.setAutoCancel(true)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setSmallIcon(R.drawable.ic_logo_small)
.setColor(ContextCompat.getColor(mContext, R.color.notification))
.setShowWhen(true)
.setContentTitle(title)
.setContentIntent(getNotificationPendingIntent(countryId));
}
@NonNull
private PendingIntent getNotificationPendingIntent(@Nullable String countryId)
{
/// @todo Zooming to the countryId when tapping on the notification?
/// Shows very low zoom level, need z=9/10, I suppose ...
final int FLAG_IMMUTABLE = Build.VERSION.SDK_INT < Build.VERSION_CODES.M ? 0 : PendingIntent.FLAG_IMMUTABLE;
final Intent contentIntent = MwmActivity.createShowMapIntent(mContext, countryId);
contentIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

View File

@@ -97,7 +97,7 @@ public class DownloaderService extends Service implements MapManager.StorageCall
}
@Override
public void onProgress(String countryId, long bytesDownloaded, long bytesTotal)
public void onProgress(String countryId, long localSize, long remoteSize)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
&& ContextCompat.checkSelfPermission(this, POST_NOTIFICATIONS) != PERMISSION_GRANTED)
@@ -106,7 +106,8 @@ public class DownloaderService extends Service implements MapManager.StorageCall
return;
}
mNotifier.notifyProgress(countryId, (int) bytesTotal, (int) bytesDownloaded);
// TODO: How to calculate progress?
mNotifier.notifyProgress();
}
@Override

View File

@@ -6,8 +6,8 @@ import androidx.annotation.AttrRes;
import androidx.annotation.DrawableRes;
import app.organicmaps.R;
import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.ThemeUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.widget.WheelProgressView;
import com.google.android.material.imageview.ShapeableImageView;

View File

@@ -5,7 +5,7 @@ import android.content.Intent;
import android.text.TextUtils;
import android.view.View;
import app.organicmaps.R;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.widget.SearchToolbarController;
class DownloaderToolbarController extends SearchToolbarController

View File

@@ -1,223 +0,0 @@
package app.organicmaps.downloader;
import android.app.Activity;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import androidx.core.util.Consumer;
import app.organicmaps.R;
import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.downloader.ExpandRetryConfirmationListener;
import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.util.ConnectionState;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.lang.ref.WeakReference;
public class MapManagerHelper
{
private static WeakReference<AlertDialog> sCurrentErrorDialog;
@StringRes
public static int getErrorCodeStrRes(final int errorCode)
{
return switch (errorCode)
{
case CountryItem.ERROR_NO_INTERNET -> R.string.common_check_internet_connection_dialog;
case CountryItem.ERROR_OOM -> R.string.downloader_no_space_title;
default -> throw new IllegalArgumentException("Given error can not be displayed: " + errorCode);
};
}
public static void showError(final Activity activity, final MapManager.StorageCallbackData errorData,
@Nullable final Consumer<Boolean> dialogClickListener)
{
if (!MapManager.nativeIsAutoretryFailed())
return;
showErrorDialog(activity, errorData, dialogClickListener);
}
public static void showErrorDialog(final Activity activity, final MapManager.StorageCallbackData errorData,
@Nullable final Consumer<Boolean> dialogClickListener)
{
if (sCurrentErrorDialog != null)
{
AlertDialog dlg = sCurrentErrorDialog.get();
if (dlg != null && dlg.isShowing())
return;
}
final AlertDialog dlg = new MaterialAlertDialogBuilder(activity, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.country_status_download_failed)
.setMessage(getErrorCodeStrRes(errorData.errorCode))
.setNegativeButton(R.string.cancel,
(dialog, which) -> {
sCurrentErrorDialog = null;
if (dialogClickListener != null)
dialogClickListener.accept(false);
})
.setPositiveButton(R.string.downloader_retry,
(dialog, which) -> {
ExpandRetryConfirmationListener listener =
new ExpandRetryConfirmationListener(dialogClickListener);
warn3gAndRetry(activity, errorData.countryId, listener);
})
.create();
dlg.setCanceledOnTouchOutside(false);
dlg.show();
sCurrentErrorDialog = new WeakReference<>(dlg);
}
private static void notifyNoSpaceInternal(Activity activity)
{
new MaterialAlertDialogBuilder(activity, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.downloader_no_space_title)
.setMessage(R.string.downloader_no_space_message)
.setPositiveButton(android.R.string.ok, null)
.show();
}
/**
* @return true if there is no space to update the given {@code root}, so the alert dialog will be shown.
*/
private static boolean notifyNoSpaceToUpdate(Activity activity, String root)
{
if (MapManager.nativeHasSpaceToUpdate(root))
return false;
notifyNoSpaceInternal(activity);
return true;
}
/**
* @return true if there is no space to download the given {@code root}, so the alert dialog will be shown.
*/
private static boolean notifyNoSpace(Activity activity, String root)
{
if (MapManager.nativeHasSpaceToDownloadCountry(root))
return false;
notifyNoSpaceInternal(activity);
return true;
}
/**
* @return true if there is no space to download {@code size} bytes, so the alert dialog will be shown.
*/
private static boolean notifyNoSpace(Activity activity, long size)
{
if (MapManager.nativeHasSpaceToDownloadAmount(size))
return false;
notifyNoSpaceInternal(activity);
return true;
}
private static boolean warnOn3gInternal(Activity activity, @NonNull final Runnable onAcceptListener)
{
if (MapManager.nativeIsDownloadOn3gEnabled() || !ConnectionState.INSTANCE.isMobileConnected())
{
onAcceptListener.run();
return false;
}
new MaterialAlertDialogBuilder(activity, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.download_over_mobile_header)
.setMessage(R.string.download_over_mobile_message)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(R.string.ok,
(dlg, which) -> {
MapManager.nativeEnableDownloadOn3g();
onAcceptListener.run();
})
.show();
return true;
}
public static boolean warnOn3gUpdate(Activity activity, @Nullable String countryId,
@NonNull final Runnable onAcceptListener)
{
// noinspection SimplifiableIfStatement
if (TextUtils.isEmpty(countryId) || !notifyNoSpaceToUpdate(activity, countryId))
return warnOn3gInternal(activity, onAcceptListener);
return true;
}
public static boolean warnOn3g(Activity activity, @Nullable String countryId,
@NonNull final Runnable onAcceptListener)
{
// noinspection SimplifiableIfStatement
if (TextUtils.isEmpty(countryId) || !notifyNoSpace(activity, countryId))
return warnOn3gInternal(activity, onAcceptListener);
return true;
}
public static boolean warnOn3g(Activity activity, long size, @NonNull Runnable onAcceptListener)
{
return !notifyNoSpace(activity, size) && warnOn3gInternal(activity, onAcceptListener);
}
public static boolean warn3gAndDownload(Activity activity, final String countryId,
@Nullable final Runnable onAcceptListener)
{
return warnOn3g(activity, countryId, () -> {
if (onAcceptListener != null)
onAcceptListener.run();
startDownload(countryId);
});
}
public static boolean warn3gAndRetry(Activity activity, final String countryId,
@Nullable final Runnable onAcceptListener)
{
return warnOn3g(activity, countryId, () -> {
if (onAcceptListener != null)
onAcceptListener.run();
retryDownload(countryId);
});
}
/**
* Enqueues failed items under given {@code root} node in downloader.
*/
public static void retryDownload(@NonNull String countryId)
{
DownloaderService.startForegroundService();
MapManager.retryDownload(countryId);
}
/**
* Enqueues given {@code root} node with its children in downloader.
*/
public static void startUpdate(@NonNull String root)
{
DownloaderService.startForegroundService();
MapManager.startUpdate(root);
}
/**
* Enqueues the given list of nodes and its children in downloader.
*/
public static void startDownload(String... countries)
{
DownloaderService.startForegroundService();
for (var countryId : countries)
{
MapManager.startDownload(countryId);
}
}
/**
* Enqueues given {@code root} node and its children in downloader.
*/
public static void startDownload(@NonNull String countryId)
{
DownloaderService.startForegroundService();
MapManager.startDownload(countryId);
}
}

View File

@@ -15,7 +15,7 @@ import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.ConnectionState;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
import app.organicmaps.widget.WheelProgressView;
import com.google.android.material.button.MaterialButton;
@@ -52,7 +52,7 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
continue;
if (item.newStatus == CountryItem.STATUS_FAILED)
MapManagerHelper.showError(mActivity, item, null);
MapManager.showError(mActivity, item, null);
if (mCurrentCountry.id.equals(item.countryId))
{
@@ -163,7 +163,7 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
if (TextUtils.equals(mCurrentCountry.id, country)
&& MapManager.nativeHasSpaceToDownloadCountry(country))
{
MapManagerHelper.startDownload(mCurrentCountry.id);
MapManager.startDownload(mCurrentCountry.id);
}
}
}
@@ -199,18 +199,18 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
setAutodownloadLocked(true);
});
mButton.setOnClickListener(
v -> MapManagerHelper.warnOn3g(mActivity, mCurrentCountry == null ? null : mCurrentCountry.id, () -> {
v -> MapManager.warnOn3g(mActivity, mCurrentCountry == null ? null : mCurrentCountry.id, () -> {
if (mCurrentCountry == null)
return;
boolean retry = (mCurrentCountry.status == CountryItem.STATUS_FAILED);
if (retry)
{
MapManagerHelper.retryDownload(mCurrentCountry.id);
MapManager.retryDownload(mCurrentCountry.id);
}
else
{
MapManagerHelper.startDownload(mCurrentCountry.id);
MapManager.startDownload(mCurrentCountry.id);
mActivity.requestPostNotificationsPermission();
}
}));

View File

@@ -14,9 +14,9 @@ import app.organicmaps.R;
import app.organicmaps.base.BaseMwmFragment;
import app.organicmaps.sdk.editor.OpeningHours;
import app.organicmaps.sdk.util.Constants;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.Graphics;
import app.organicmaps.util.InputUtils;
import app.organicmaps.util.UiUtils;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textview.MaterialTextView;

View File

@@ -29,10 +29,10 @@ import app.organicmaps.sdk.editor.data.LocalizedName;
import app.organicmaps.sdk.editor.data.LocalizedStreet;
import app.organicmaps.sdk.editor.data.Timetable;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.Utils;
import app.organicmaps.util.Graphics;
import app.organicmaps.util.InputUtils;
import app.organicmaps.util.UiUtils;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textfield.TextInputEditText;
@@ -287,8 +287,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
return validateNames();
}
private boolean beforeSavingValidation()
{
private boolean beforeSavingValidation() {
// Validation to make sure address features have a house number
if (!Editor.nativeCheckHouseNumberWhenIsAddress())
{

View File

@@ -1,5 +1,6 @@
package app.organicmaps.editor;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
@@ -24,7 +25,7 @@ import app.organicmaps.sdk.editor.data.Language;
import app.organicmaps.sdk.editor.data.LocalizedName;
import app.organicmaps.sdk.editor.data.LocalizedStreet;
import app.organicmaps.sdk.editor.data.NamesDataSource;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
import app.organicmaps.widget.SearchToolbarController;

View File

@@ -10,7 +10,7 @@ import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R;
import app.organicmaps.sdk.editor.data.FeatureCategory;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textview.MaterialTextView;

View File

@@ -79,8 +79,8 @@ public class HoursMinutesPickerFragment extends BaseMwmDialogFragment
mTabs.getTabAt(mSelectedTab).select();
@StyleRes
final int theme = ThemeUtils.isNightTheme() ? R.style.MwmMain_DialogFragment_TimePicker_Night
: R.style.MwmMain_DialogFragment_TimePicker;
final int theme = ThemeUtils.isNightTheme(requireContext()) ? R.style.MwmMain_DialogFragment_TimePicker_Night
: R.style.MwmMain_DialogFragment_TimePicker;
final AlertDialog dialog = new MaterialAlertDialogBuilder(requireActivity(), theme)
.setView(root)
.setNegativeButton(R.string.cancel, null)
@@ -141,8 +141,8 @@ public class HoursMinutesPickerFragment extends BaseMwmDialogFragment
MaterialTextView tabView = (MaterialTextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
tabView.setText(getResources().getString(R.string.editor_time_from));
final ColorStateList textColor = AppCompatResources.getColorStateList(
requireContext(),
ThemeUtils.isNightTheme() ? R.color.accent_color_selector_night : R.color.accent_color_selector);
requireContext(), ThemeUtils.isNightTheme(requireContext()) ? R.color.accent_color_selector_night
: R.color.accent_color_selector);
tabView.setTextColor(textColor);
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
tabView = (MaterialTextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);

View File

@@ -10,7 +10,7 @@ import app.organicmaps.sdk.editor.Editor;
import app.organicmaps.sdk.editor.data.Language;
import app.organicmaps.sdk.editor.data.LocalizedName;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.Utils;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;

View File

@@ -1,4 +1,4 @@
package app.organicmaps.sdk.editor;
package app.organicmaps.editor;
import androidx.annotation.Keep;

View File

@@ -15,11 +15,10 @@ import app.organicmaps.R;
import app.organicmaps.base.BaseMwmToolbarFragment;
import app.organicmaps.sdk.editor.OsmOAuth;
import app.organicmaps.sdk.util.Constants;
import app.organicmaps.sdk.util.DateUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.concurrency.ThreadPool;
import app.organicmaps.sdk.util.concurrency.UiThread;
import app.organicmaps.util.InputUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils.ScrollableContentInsetsListener;
import com.google.android.material.button.MaterialButton;

View File

@@ -9,7 +9,7 @@ import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R;
import app.organicmaps.sdk.editor.Editor;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;

View File

@@ -11,17 +11,14 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.FragmentManager;
import app.organicmaps.R;
import app.organicmaps.base.BaseMwmToolbarFragment;
import app.organicmaps.sdk.editor.OsmOAuth;
import app.organicmaps.sdk.util.NetworkPolicy;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.concurrency.ThreadPool;
import app.organicmaps.sdk.util.concurrency.UiThread;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils;
import app.organicmaps.widget.StackedButtonDialogFragment;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textview.MaterialTextView;
@@ -29,24 +26,6 @@ import java.text.NumberFormat;
public class ProfileFragment extends BaseMwmToolbarFragment
{
@NonNull
private static final NetworkPolicy.DialogPresenter mDialogPresenter = new NetworkPolicy.DialogPresenter() {
@Override
public void showDialogIfNeeded(@NonNull FragmentManager fragmentManager,
@NonNull NetworkPolicy.NetworkPolicyListener listener, @NonNull NetworkPolicy policy,
boolean isToday)
{
StackedButtonDialogFragment.showDialogIfNeeded(fragmentManager, listener, policy, isToday);
}
@Override
public void showDialog(@NonNull FragmentManager fragmentManager,
@NonNull NetworkPolicy.NetworkPolicyListener listener)
{
StackedButtonDialogFragment.showDialog(fragmentManager, listener);
}
};
private View mUserInfoBlock;
private MaterialTextView mEditsSent;
private MaterialTextView mProfileName;
@@ -105,7 +84,7 @@ public class ProfileFragment extends BaseMwmToolbarFragment
UiUtils.show(mProfileInfoLoading);
UiUtils.hide(mUserInfoBlock);
}
final int profileEditCount = OsmOAuth.getOsmChangesetsCount(mDialogPresenter, getParentFragmentManager());
final int profileEditCount = OsmOAuth.getOsmChangesetsCount(getParentFragmentManager());
final String profileUsername = OsmOAuth.getUsername();
final Bitmap profilePicture = OsmOAuth.getProfilePicture();

View File

@@ -11,7 +11,7 @@ import androidx.core.view.ViewCompat;
import app.organicmaps.R;
import app.organicmaps.base.BaseMwmToolbarFragment;
import app.organicmaps.sdk.editor.Editor;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.WindowInsetUtils.ScrollableContentInsetsListener;
import com.google.android.material.textfield.TextInputEditText;

View File

@@ -18,8 +18,7 @@ import app.organicmaps.sdk.editor.OpeningHours;
import app.organicmaps.sdk.editor.data.HoursMinutes;
import app.organicmaps.sdk.editor.data.Timespan;
import app.organicmaps.sdk.editor.data.Timetable;
import app.organicmaps.sdk.util.Utils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.checkbox.MaterialCheckBox;
import com.google.android.material.textview.MaterialTextView;
@@ -225,7 +224,7 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
LayoutInflater.from(itemView.getContext()).inflate(R.layout.item_timetable_closed_hours, closedHost, false);
closedHost.addView(
span, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
Utils.dimen(closedHost.getContext(), R.dimen.editor_height_closed)));
UiUtils.dimen(closedHost.getContext(), R.dimen.editor_height_closed)));
closedHours[i] = span;
final int finalI = i;
span.findViewById(R.id.iv__remove_closed)

View File

@@ -10,7 +10,7 @@ import app.organicmaps.MwmApplication;
import app.organicmaps.R;
import app.organicmaps.dialog.EditTextDialogFragment;
import app.organicmaps.sdk.editor.data.LocalizedStreet;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.radiobutton.MaterialRadioButton;
import com.google.android.material.textview.MaterialTextView;

View File

@@ -15,7 +15,7 @@ import androidx.fragment.app.FragmentActivity;
import app.organicmaps.R;
import app.organicmaps.base.BaseMwmFragment;
import app.organicmaps.sdk.editor.OpeningHours;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textview.MaterialTextView;

View File

@@ -24,8 +24,6 @@ import app.organicmaps.util.Graphics;
import app.organicmaps.util.SharingUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils.ScrollableContentInsetsListener;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.textview.MaterialTextView;
public class HelpFragment extends BaseMwmFragment implements View.OnClickListener
{
@@ -43,15 +41,15 @@ public class HelpFragment extends BaseMwmFragment implements View.OnClickListene
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
mDonateUrl = Utils.getDonateUrl(requireContext());
mDonateUrl = Config.getDonateUrl(requireContext());
View root = inflater.inflate(R.layout.about, container, false);
((MaterialTextView) root.findViewById(R.id.version)).setText(BuildConfig.VERSION_NAME);
((TextView) root.findViewById(R.id.version)).setText(BuildConfig.VERSION_NAME);
final boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
final String dataVersion = DateUtils.getShortDateFormatter().format(Framework.getDataVersion());
final MaterialTextView osmPresentationView = root.findViewById(R.id.osm_presentation);
final TextView osmPresentationView = root.findViewById(R.id.osm_presentation);
if (osmPresentationView != null)
{
osmPresentationView.setText(getString(R.string.osm_presentation, dataVersion));
@@ -73,13 +71,13 @@ public class HelpFragment extends BaseMwmFragment implements View.OnClickListene
setupItem(R.id.report, isLandscape, root);
setupItem(R.id.copyright, false, root);
final MaterialTextView supportUsView = root.findViewById(R.id.support_us);
final TextView supportUsView = root.findViewById(R.id.support_us);
if (BuildConfig.FLAVOR.equals("google") && !TextUtils.isEmpty(mDonateUrl))
supportUsView.setVisibility(View.GONE);
else
setupItem(R.id.support_us, true, root);
final MaterialButton donateView = root.findViewById(R.id.donate);
final TextView donateView = root.findViewById(R.id.donate);
if (TextUtils.isEmpty(mDonateUrl))
donateView.setVisibility(View.GONE);
else

View File

@@ -8,7 +8,7 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R;
import app.organicmaps.sdk.util.SharedPropertiesUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import java.util.List;
public class LayersAdapter extends RecyclerView.Adapter<LayerHolder>

View File

@@ -36,9 +36,8 @@ import app.organicmaps.sdk.maplayer.subway.SubwayManager;
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.ThemeUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils;
import app.organicmaps.widget.menu.MyPositionButton;
import app.organicmaps.widget.placepage.PlacePageViewModel;
@@ -215,7 +214,7 @@ public class MapButtonsController extends Fragment
// helpButton.setImageResource(R.drawable.ic_launcher);
// }
// // Keep this button colorful in normal theme.
// if (!ThemeUtils.isNightTheme())
// if (!ThemeUtils.isNightTheme(requireContext()))
// helpButton.getDrawable().setTintList(null);
}
else if (leftButtonView != null)

View File

@@ -16,9 +16,9 @@ import androidx.annotation.StringRes;
import app.organicmaps.R;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.search.SearchEngine;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.concurrency.UiThread;
import app.organicmaps.util.Graphics;
import app.organicmaps.util.UiUtils;
public class SearchWheel implements View.OnClickListener
{

View File

@@ -10,8 +10,8 @@ import android.widget.RelativeLayout;
import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
import app.organicmaps.R;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.ThemeUtils;
import app.organicmaps.util.UiUtils;
import java.util.Objects;
@SuppressWarnings("unused")
@@ -43,20 +43,22 @@ public class TrafficButton
void turnOff()
{
stopWaitingAnimation();
mButton.setImageResource(ThemeUtils.isNightTheme() ? R.drawable.ic_traffic_on_night : R.drawable.ic_traffic_on);
mButton.setImageResource(ThemeUtils.isNightTheme(mButton.getContext()) ? R.drawable.ic_traffic_on_night
: R.drawable.ic_traffic_on);
}
void turnOn()
{
stopWaitingAnimation();
mButton.setImageResource(ThemeUtils.isNightTheme() ? R.drawable.ic_traffic_on_night : R.drawable.ic_traffic_on);
mButton.setImageResource(ThemeUtils.isNightTheme(mButton.getContext()) ? R.drawable.ic_traffic_on_night
: R.drawable.ic_traffic_on);
}
void markAsOutdated()
{
stopWaitingAnimation();
mButton.setImageResource(ThemeUtils.isNightTheme() ? R.drawable.ic_traffic_outdated_night
: R.drawable.ic_traffic_outdated);
mButton.setImageResource(ThemeUtils.isNightTheme(mButton.getContext()) ? R.drawable.ic_traffic_outdated_night
: R.drawable.ic_traffic_outdated);
}
void startWaitingAnimation()

View File

@@ -12,14 +12,14 @@ import android.widget.ExpandableListView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
import app.organicmaps.R;
import app.organicmaps.adapter.DisabledChildSimpleExpandableListAdapter;
import app.organicmaps.base.BaseMwmDialogFragment;
import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.Utils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textview.MaterialTextView;
import java.util.ArrayList;
@@ -128,7 +128,7 @@ abstract class BaseRoutingErrorDialogFragment extends BaseMwmDialogFragment
UiUtils.waitLayout(listView, () -> {
final int width = listView.getWidth();
final int indicatorWidth = Utils.dimen(requireContext(), R.dimen.margin_quadruple);
final int indicatorWidth = UiUtils.dimen(requireContext(), R.dimen.margin_quadruple);
listView.setIndicatorBounds(width - indicatorWidth, width);
listView.setIndicatorBoundsRelative(width - indicatorWidth, width);
});

View File

@@ -16,7 +16,7 @@ import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.routing.RouteMarkData;
import app.organicmaps.sdk.routing.RouteMarkType;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textview.MaterialTextView;
import java.util.ArrayList;
@@ -94,7 +94,7 @@ public class ManageRouteAdapter extends RecyclerView.Adapter<ManageRouteAdapter.
if (mRoutePoints.get(position).mIsMyPosition)
{
// My position point.
title = mContext.getString(app.organicmaps.sdk.R.string.core_my_position);
title = mContext.getString(R.string.core_my_position);
if (mRoutePoints.get(position).mPointType != RouteMarkType.Start)
subtitle = mRoutePoints.get(position).mTitle;

View File

@@ -23,7 +23,7 @@ import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.routing.RouteMarkData;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;

View File

@@ -1,7 +1,5 @@
package app.organicmaps.routing;
import static app.organicmaps.sdk.util.Utils.dimen;
import android.location.Location;
import android.text.TextUtils;
import android.view.View;
@@ -23,7 +21,7 @@ import app.organicmaps.sdk.routing.CarDirection;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.routing.RoutingInfo;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils;
import app.organicmaps.widget.LanesView;
@@ -168,7 +166,7 @@ public class NavigationController implements TrafficManager.TrafficCallback, Nav
UiUtils.visibleIf(hasStreet, mStreetFrame);
if (!TextUtils.isEmpty(info.nextStreet))
mNextStreet.setText(info.nextStreet);
int margin = dimen(mFrame.getContext(), R.dimen.nav_frame_padding);
int margin = UiUtils.dimen(mFrame.getContext(), R.dimen.nav_frame_padding);
if (hasStreet)
margin += mStreetFrame.getHeight();
mMapButtonsViewModel.setTopButtonsMarginTop(margin);

View File

@@ -1,7 +1,5 @@
package app.organicmaps.routing;
import static app.organicmaps.sdk.util.Utils.dimen;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
@@ -39,9 +37,9 @@ import app.organicmaps.sdk.routing.RoutingInfo;
import app.organicmaps.sdk.routing.TransitRouteInfo;
import app.organicmaps.sdk.routing.TransitStepInfo;
import app.organicmaps.sdk.util.Distance;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.util.Graphics;
import app.organicmaps.util.ThemeUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.widget.recycler.DotDividerItemDecoration;
import app.organicmaps.widget.recycler.MultilineLayoutManager;
@@ -347,17 +345,16 @@ final class RoutingBottomMenuController implements View.OnClickListener
UiUtils.hide(mTimeVehicle);
int chartWidth = dimen(mContext, R.dimen.altitude_chart_image_width);
int chartHeight = dimen(mContext, R.dimen.altitude_chart_image_height);
int chartWidth = UiUtils.dimen(mContext, R.dimen.altitude_chart_image_width);
int chartHeight = UiUtils.dimen(mContext, R.dimen.altitude_chart_image_height);
Framework.RouteAltitudeLimits limits = new Framework.RouteAltitudeLimits();
Bitmap bm = Framework.generateRouteAltitudeChart(chartWidth, chartHeight, limits);
if (bm != null)
{
mAltitudeChart.setImageBitmap(bm);
UiUtils.show(mAltitudeChart);
final String unit = limits.isMetricUnits
? mAltitudeDifference.getResources().getString(app.organicmaps.sdk.R.string.m)
: mAltitudeDifference.getResources().getString(app.organicmaps.sdk.R.string.ft);
final String unit = limits.isMetricUnits ? mAltitudeDifference.getResources().getString(R.string.m)
: mAltitudeDifference.getResources().getString(R.string.ft);
mAltitudeDifference.setText("" + limits.totalAscentString + " " + unit + "" + limits.totalDescentString + " "
+ unit);
UiUtils.show(mAltitudeDifference);

View File

@@ -14,10 +14,9 @@ import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.FragmentFactory;
import androidx.fragment.app.FragmentManager;
import app.organicmaps.R;
import app.organicmaps.downloader.MapManagerHelper;
import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import com.google.android.material.textview.MaterialTextView;
public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
@@ -109,7 +108,7 @@ public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
}
}
MapManagerHelper.warnOn3g(requireActivity(), size, () -> {
MapManager.warnOn3g(requireActivity(), size, () -> {
final FragmentManager manager = requireActivity().getSupportFragmentManager();
RoutingMapsDownloadFragment downloader =
RoutingMapsDownloadFragment.create(manager.getFragmentFactory(), getAppContextOrThrow(), mMapsArray);

View File

@@ -9,11 +9,10 @@ import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.FragmentFactory;
import app.organicmaps.R;
import app.organicmaps.downloader.MapManagerHelper;
import app.organicmaps.sdk.downloader.CountryItem;
import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.widget.WheelProgressView;
import java.util.HashSet;
import java.util.List;
@@ -41,7 +40,7 @@ public class RoutingMapsDownloadFragment extends BaseRoutingErrorDialogFragment
mMapsArray[i] = item.id;
}
MapManagerHelper.startDownload(mMapsArray);
MapManager.startDownload(mMapsArray);
}
private View setupFrame(View frame)

View File

@@ -21,8 +21,8 @@ import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.routing.RoutingInfo;
import app.organicmaps.sdk.routing.RoutingOptions;
import app.organicmaps.sdk.routing.TransitRouteInfo;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.settings.DrivingOptionsActivity;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
import app.organicmaps.widget.RoutingToolbarButton;
import app.organicmaps.widget.ToolbarController;
@@ -141,8 +141,7 @@ public class RoutingPlanController extends ToolbarController
setupRouterButton(R.id.vehicle, R.drawable.ic_car, this::onVehicleModeSelected);
setupRouterButton(R.id.pedestrian, R.drawable.ic_pedestrian, this::onPedestrianModeSelected);
// setupRouterButton(R.id.taxi, R.drawable.ic_taxi, this::onTaxiModeSelected);
setupRouterButton(R.id.transit, app.organicmaps.sdk.R.drawable.ic_route_planning_metro_40px,
this::onTransitModeSelected);
setupRouterButton(R.id.transit, R.drawable.ic_route_planning_metro_40px, this::onTransitModeSelected);
setupRouterButton(R.id.bicycle, R.drawable.ic_bike, this::onBicycleModeSelected);
setupRouterButton(R.id.ruler, app.organicmaps.sdk.R.drawable.ic_ruler_route, this::onRulerModeSelected);
}

View File

@@ -9,7 +9,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import app.organicmaps.MwmActivity;
import app.organicmaps.R;
import app.organicmaps.util.UiUtils;
import app.organicmaps.sdk.util.UiUtils;
public class RoutingPlanInplaceController extends RoutingPlanController
{

View File

@@ -90,7 +90,7 @@ public class TransitStepView extends View implements MultilineLayoutManager.Sque
{
mDrawable = null;
mText = info.getDistance() + " " + info.getDistanceUnits();
mTextPaint.setColor(ThemeUtils.isDefaultTheme() ? Color.BLACK : Color.WHITE);
mTextPaint.setColor(ThemeUtils.isDefaultTheme(getContext()) ? Color.BLACK : Color.WHITE);
}
else
{

View File

@@ -17,7 +17,7 @@ public class DownloadResourcesLegacyActivity
{
// Called by JNI.
@Keep
void onProgress(int bytesDownloaded);
void onProgress(int percent);
// Called by JNI.
@Keep

View File

@@ -6,11 +6,13 @@ import android.view.MotionEvent;
import android.view.Surface;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import app.organicmaps.BuildConfig;
import app.organicmaps.R;
import app.organicmaps.sdk.display.DisplayType;
import app.organicmaps.sdk.location.LocationHelper;
import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.ROMUtils;
import app.organicmaps.sdk.util.Utils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.concurrency.UiThread;
import app.organicmaps.sdk.util.log.Logger;
@@ -100,9 +102,9 @@ public final class Map
{
final int x = offsetX < 0 ? mCurrentCompassOffsetX : offsetX;
final int y = offsetY < 0 ? mCurrentCompassOffsetY : offsetY;
final int navPadding = Utils.dimen(context, R.dimen.nav_frame_padding);
final int marginX = Utils.dimen(context, R.dimen.margin_compass) + navPadding;
final int marginY = Utils.dimen(context, R.dimen.margin_compass_top) + navPadding;
final int navPadding = UiUtils.dimen(context, R.dimen.nav_frame_padding);
final int marginX = UiUtils.dimen(context, R.dimen.margin_compass) + navPadding;
final int marginY = UiUtils.dimen(context, R.dimen.margin_compass_top) + navPadding;
nativeSetupWidget(WIDGET_COMPASS, mWidth - x - marginX, y + marginY, ANCHOR_CENTER);
if (forceRedraw && mSurfaceCreated)
nativeApplyWidgets();
@@ -146,7 +148,7 @@ public final class Map
{
assert mLocationHelper != null : "LocationHelper must be initialized before calling onSurfaceCreated";
if (isThemeChangingProcess())
if (isThemeChangingProcess(context))
{
Logger.d(TAG, "Theme changing process, skip 'onSurfaceCreated' callback");
return;
@@ -179,7 +181,7 @@ public final class Map
setupWidgets(context, surfaceFrame.width(), surfaceFrame.height());
final boolean firstStart = mLocationHelper.isInFirstRun();
if (!nativeCreateEngine(surface, surfaceDpi, firstStart, mLaunchByDeepLink, Config.getVersionCode(),
if (!nativeCreateEngine(surface, surfaceDpi, firstStart, mLaunchByDeepLink, BuildConfig.VERSION_CODE,
ROMUtils.isCustomROM()))
{
if (mCallbackUnsupported != null)
@@ -201,7 +203,7 @@ public final class Map
public void onSurfaceChanged(final Context context, final Surface surface, Rect surfaceFrame,
boolean isSurfaceCreating)
{
if (isThemeChangingProcess())
if (isThemeChangingProcess(context))
{
Logger.d(TAG, "Theme changing process, skip 'onSurfaceChanged' callback");
return;
@@ -263,7 +265,7 @@ public final class Map
public void onPause(final Context context)
{
mUiThemeOnPause = Config.UiTheme.getCurrent();
mUiThemeOnPause = Config.getCurrentUiTheme(context);
// Pause/Resume can be called without surface creation/destroy.
if (mSurfaceAttached)
@@ -340,37 +342,37 @@ public final class Map
updateBottomWidgetsOffset(context, mBottomWidgetOffsetX, mBottomWidgetOffsetY);
if (mDisplayType == DisplayType.Device)
{
nativeSetupWidget(WIDGET_SCALE_FPS_LABEL, Utils.dimen(context, R.dimen.margin_base),
Utils.dimen(context, R.dimen.margin_base) * 2, ANCHOR_LEFT_TOP);
nativeSetupWidget(WIDGET_SCALE_FPS_LABEL, UiUtils.dimen(context, R.dimen.margin_base),
UiUtils.dimen(context, R.dimen.margin_base) * 2, ANCHOR_LEFT_TOP);
updateCompassOffset(context, mCurrentCompassOffsetX, mCurrentCompassOffsetY, false);
}
else
{
nativeSetupWidget(WIDGET_SCALE_FPS_LABEL, (float) mWidth / 2 + Utils.dimen(context, R.dimen.margin_base) * 2,
Utils.dimen(context, R.dimen.margin_base), ANCHOR_LEFT_TOP);
nativeSetupWidget(WIDGET_SCALE_FPS_LABEL, (float) mWidth / 2 + UiUtils.dimen(context, R.dimen.margin_base) * 2,
UiUtils.dimen(context, R.dimen.margin_base), ANCHOR_LEFT_TOP);
updateCompassOffset(context, mWidth, mCurrentCompassOffsetY, true);
}
}
private void updateRulerOffset(final Context context, int offsetX, int offsetY)
{
nativeSetupWidget(WIDGET_RULER, Utils.dimen(context, R.dimen.margin_ruler) + offsetX,
mHeight - Utils.dimen(context, R.dimen.margin_ruler) - offsetY, ANCHOR_LEFT_BOTTOM);
nativeSetupWidget(WIDGET_RULER, UiUtils.dimen(context, R.dimen.margin_ruler) + offsetX,
mHeight - UiUtils.dimen(context, R.dimen.margin_ruler) - offsetY, ANCHOR_LEFT_BOTTOM);
if (mSurfaceCreated)
nativeApplyWidgets();
}
private void updateAttributionOffset(final Context context, int offsetX, int offsetY)
{
nativeSetupWidget(WIDGET_COPYRIGHT, Utils.dimen(context, R.dimen.margin_ruler) + offsetX,
mHeight - Utils.dimen(context, R.dimen.margin_ruler) - offsetY, ANCHOR_LEFT_BOTTOM);
nativeSetupWidget(WIDGET_COPYRIGHT, UiUtils.dimen(context, R.dimen.margin_ruler) + offsetX,
mHeight - UiUtils.dimen(context, R.dimen.margin_ruler) - offsetY, ANCHOR_LEFT_BOTTOM);
if (mSurfaceCreated)
nativeApplyWidgets();
}
private boolean isThemeChangingProcess()
private boolean isThemeChangingProcess(final Context context)
{
return mUiThemeOnPause != null && !mUiThemeOnPause.equals(Config.UiTheme.getCurrent());
return mUiThemeOnPause != null && !mUiThemeOnPause.equals(Config.getCurrentUiTheme(context));
}
// Engine

View File

@@ -6,12 +6,12 @@ import androidx.annotation.NonNull;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ProcessLifecycleOwner;
import app.organicmaps.R;
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
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;
@@ -23,6 +23,7 @@ import app.organicmaps.sdk.sound.TtsPlayer;
import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.SharedPropertiesUtils;
import app.organicmaps.sdk.util.StorageUtils;
import app.organicmaps.sdk.util.UiUtils;
import app.organicmaps.sdk.util.log.Logger;
import app.organicmaps.sdk.util.log.LogsManager;
import java.io.IOException;
@@ -31,9 +32,6 @@ public final class OrganicMaps implements DefaultLifecycleObserver
{
private static final String TAG = OrganicMaps.class.getSimpleName();
@NonNull
private final String mFlavor;
@NonNull
private final Context mContext;
@@ -77,13 +75,11 @@ public final class OrganicMaps implements DefaultLifecycleObserver
return mIsolinesManager;
}
public OrganicMaps(@NonNull Context context, @NonNull String flavor, @NonNull String applicationId, int versionCode,
@NonNull String versionName, @NonNull String fileProviderAuthority,
@NonNull LocationProviderFactory locationProviderFactory)
public OrganicMaps(@NonNull Context context)
{
mFlavor = flavor;
mContext = context.getApplicationContext();
mPreferences = mContext.getSharedPreferences(context.getString(R.string.pref_file_name), Context.MODE_PRIVATE);
mPreferences = mContext.getSharedPreferences(context.getString(app.organicmaps.sdk.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.
@@ -93,7 +89,7 @@ public final class OrganicMaps implements DefaultLifecycleObserver
Logger.d(TAG, "Settings path = " + settingsPath);
nativeSetSettingsDir(settingsPath);
Config.init(mContext, mPreferences, flavor, applicationId, versionCode, versionName, fileProviderAuthority);
Config.init(mContext, mPreferences);
OsmOAuth.init(mPreferences);
SharedPropertiesUtils.init(mPreferences);
LogsManager.INSTANCE.initFileLogging(mContext, mPreferences);
@@ -103,7 +99,7 @@ public final class OrganicMaps implements DefaultLifecycleObserver
Icon.loadDefaultIcons(mContext.getResources(), mContext.getPackageName());
mSensorHelper = new SensorHelper(mContext);
mLocationHelper = new LocationHelper(mContext, mSensorHelper, locationProviderFactory);
mLocationHelper = new LocationHelper(mContext, mSensorHelper);
mIsolinesManager = new IsolinesManager();
mSubwayManager = new SubwayManager(mContext);
}
@@ -163,8 +159,8 @@ public final class OrganicMaps implements DefaultLifecycleObserver
// external storage is damaged or not available (read-only).
createPlatformDirectories(writablePath, privatePath, tempPath);
nativeInitPlatform(mContext, apkPath, writablePath, privatePath, tempPath, mFlavor, BuildConfig.BUILD_TYPE,
/* isTablet */ false);
nativeInitPlatform(mContext, apkPath, writablePath, privatePath, tempPath, app.organicmaps.BuildConfig.FLAVOR,
app.organicmaps.BuildConfig.BUILD_TYPE, UiUtils.isTablet(mContext));
Config.setStoragePath(writablePath);
Config.setStatisticsEnabled(SharedPropertiesUtils.isStatisticsEnabled());

View File

@@ -2,7 +2,6 @@ package app.organicmaps.sdk.bookmarks.data;
import android.annotation.SuppressLint;
import android.os.Parcel;
import androidx.annotation.ColorInt;
import androidx.annotation.IntRange;
import androidx.annotation.Keep;
import androidx.annotation.NonNull;
@@ -111,14 +110,6 @@ public class Bookmark extends MapObject
mCategoryId = catId;
}
public void setIconColor(@ColorInt int color)
{
Icon icon = new Icon(PredefinedColors.getPredefinedColorIndex(color),
BookmarkManager.INSTANCE.getBookmarkIcon(mBookmarkId));
BookmarkManager.INSTANCE.notifyParametersUpdating(this, getName(), icon, getBookmarkDescription());
mIcon = icon;
}
public void setParams(@NonNull String title, @Nullable Icon icon, @NonNull String description)
{
BookmarkManager.INSTANCE.notifyParametersUpdating(this, title, icon, description);

View File

@@ -162,10 +162,10 @@ public class BookmarkCategory implements Parcelable
public enum AccessRules
{
ACCESS_RULES_LOCAL(R.string.not_shared, R.drawable.ic_lock),
ACCESS_RULES_PUBLIC(R.string.public_access, R.drawable.ic_public_inline),
ACCESS_RULES_DIRECT_LINK(R.string.limited_access, R.drawable.ic_link_inline),
ACCESS_RULES_AUTHOR_ONLY(R.string.access_rules_author_only, R.drawable.ic_lock);
ACCESS_RULES_LOCAL(app.organicmaps.R.string.not_shared, R.drawable.ic_lock),
ACCESS_RULES_PUBLIC(app.organicmaps.R.string.public_access, R.drawable.ic_public_inline),
ACCESS_RULES_DIRECT_LINK(app.organicmaps.R.string.limited_access, R.drawable.ic_link_inline),
ACCESS_RULES_AUTHOR_ONLY(app.organicmaps.R.string.access_rules_author_only, R.drawable.ic_lock);
private final int mResId;
private final int mDrawableResId;

View File

@@ -263,12 +263,6 @@ public enum BookmarkManager {
return nativeUpdateBookmarkPlacePage(bmkId);
}
@Nullable
public void updateTrackPlacePage()
{
nativeUpdateTrackPlacePage();
}
@Nullable
public BookmarkInfo getBookmarkInfo(long bmkId)
{
@@ -735,9 +729,9 @@ public enum BookmarkManager {
return nativeGetElevationCurPositionDistance(trackId);
}
public void setElevationActivePoint(long trackId, double distance, ElevationInfo.Point point)
public void setElevationActivePoint(long trackId, double distance)
{
nativeSetElevationActivePoint(trackId, distance, point.getLatitude(), point.getLongitude());
nativeSetElevationActivePoint(trackId, distance);
}
public double getElevationActivePointDistance(long trackId)
@@ -745,14 +739,9 @@ public enum BookmarkManager {
return nativeGetElevationActivePointDistance(trackId);
}
private static native ElevationInfo.Point nativeGetElevationActivePointCoordinates(long trackId);
@Nullable
private native Bookmark nativeUpdateBookmarkPlacePage(long bmkId);
@Nullable
private native void nativeUpdateTrackPlacePage();
@Nullable
private native BookmarkInfo nativeGetBookmarkInfo(long bmkId);
@@ -903,23 +892,14 @@ public enum BookmarkManager {
public static native void nativeRemoveElevationCurrentPositionChangedListener();
private static native void nativeSetElevationActivePoint(long trackId, double distanceInMeters, double latitude,
double longitude);
private static native void nativeSetElevationActivePoint(long trackId, double distanceInMeters);
private static native double nativeGetElevationActivePointDistance(long trackId);
public ElevationInfo.Point getElevationActivePointCoordinates(long trackId)
{
return nativeGetElevationActivePointCoordinates(trackId);
}
private static native void nativeSetElevationActiveChangedListener();
public static native void nativeRemoveElevationActiveChangedListener();
public static native ElevationInfo nativeGetTrackElevationInfo(long trackId);
public static native TrackStatistics nativeGetTrackStatistics(long trackId);
public interface BookmarksLoadingListener
{
default void onBookmarksLoadingStarted() {}

View File

@@ -15,19 +15,42 @@ import java.util.List;
@SuppressWarnings("unused")
public class ElevationInfo implements PlacePageData
{
private final long mId;
@NonNull
private final String mName;
@NonNull
private final List<Point> mPoints;
private final int mAscent;
private final int mDescent;
private final int mMinAltitude;
private final int mMaxAltitude;
private final int mDifficulty;
private final long mDuration;
public ElevationInfo(@NonNull Point[] points, int difficulty)
public ElevationInfo(long trackId, @NonNull String name, @NonNull Point[] points, int ascent, int descent,
int minAltitude, int maxAltitude, int difficulty, long duration)
{
mId = trackId;
mName = name;
mPoints = Arrays.asList(points);
mAscent = ascent;
mDescent = descent;
mMinAltitude = minAltitude;
mMaxAltitude = maxAltitude;
mDifficulty = difficulty;
mDuration = duration;
}
protected ElevationInfo(Parcel in)
{
mId = in.readLong();
mName = in.readString();
mAscent = in.readInt();
mDescent = in.readInt();
mMinAltitude = in.readInt();
mMaxAltitude = in.readInt();
mDifficulty = in.readInt();
mDuration = in.readLong();
mPoints = readPoints(in);
}
@@ -39,17 +62,53 @@ public class ElevationInfo implements PlacePageData
return points;
}
public long getId()
{
return mId;
}
@NonNull
public String getName()
{
return mName;
}
@NonNull
public List<Point> getPoints()
{
return Collections.unmodifiableList(mPoints);
}
public int getAscent()
{
return mAscent;
}
public int getDescent()
{
return mDescent;
}
public int getMinAltitude()
{
return mMinAltitude;
}
public int getMaxAltitude()
{
return mMaxAltitude;
}
public int getDifficulty()
{
return mDifficulty;
}
public long getDuration()
{
return mDuration;
}
@Override
public int describeContents()
{
@@ -59,7 +118,14 @@ public class ElevationInfo implements PlacePageData
@Override
public void writeToParcel(Parcel dest, int flags)
{
dest.writeLong(mId);
dest.writeString(mName);
dest.writeInt(mAscent);
dest.writeInt(mDescent);
dest.writeInt(mMinAltitude);
dest.writeInt(mMaxAltitude);
dest.writeInt(mDifficulty);
dest.writeLong(mDuration);
// All collections are deserialized AFTER non-collection and primitive type objects,
// so collections must be always serialized at the end.
dest.writeTypedList(mPoints);
@@ -72,23 +138,17 @@ public class ElevationInfo implements PlacePageData
{
private final double mDistance;
private final int mAltitude;
private final double mLatitude;
private final double mLongitude;
public Point(double distance, int altitude, double latitude, double longitude)
public Point(double distance, int altitude)
{
mDistance = distance;
mAltitude = altitude;
mLatitude = latitude;
mLongitude = longitude;
}
protected Point(Parcel in)
{
mDistance = in.readDouble();
mAltitude = in.readInt();
mLatitude = in.readDouble();
mLongitude = in.readDouble();
}
public static final Creator<Point> CREATOR = new Creator<>() {
@@ -115,16 +175,6 @@ public class ElevationInfo implements PlacePageData
return mAltitude;
}
public double getLatitude()
{
return mLatitude;
}
public double getLongitude()
{
return mLongitude;
}
@Override
public int describeContents()
{

View File

@@ -27,7 +27,7 @@ public class FeatureId implements Parcelable
};
@NonNull
public static final FeatureId EMPTY = new FeatureId("", -1L, 0);
public static final FeatureId EMPTY = new FeatureId("", 0L, 0);
@NonNull
private final String mMwmName;

View File

@@ -6,12 +6,11 @@ import android.os.Parcelable;
import androidx.annotation.ColorInt;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import app.organicmaps.sdk.BuildConfig;
import app.organicmaps.sdk.R;
import app.organicmaps.BuildConfig;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.log.Logger;
import com.google.common.base.Objects;
import dalvik.annotation.optimization.FastNative;
import java.util.Arrays;
public class Icon implements Parcelable
{
@@ -87,7 +86,7 @@ public class Icon implements Parcelable
@Override
public int hashCode()
{
return Arrays.hashCode(new int[] {mColor, mType});
return Objects.hashCode(mColor, mType);
}
public static final Parcelable.Creator<Icon> CREATOR = new Parcelable.Creator<>() {
@@ -116,7 +115,7 @@ public class Icon implements Parcelable
// Force devs to add an icon for each bookmark type.
if (BuildConfig.DEBUG)
throw new RuntimeException("Error getting icon for " + name);
icons[i] = R.drawable.ic_bookmark_none; // Fallback icon
icons[i] = app.organicmaps.sdk.R.drawable.ic_bookmark_none; // Fallback icon
}
}

View File

@@ -25,7 +25,7 @@ import java.util.Objects;
public class MapObject implements PlacePageData
{
@Retention(RetentionPolicy.SOURCE)
@IntDef({POI, API_POINT, BOOKMARK, MY_POSITION, SEARCH, TRACK})
@IntDef({POI, API_POINT, BOOKMARK, MY_POSITION, SEARCH})
public @interface MapObjectType
{}
@@ -34,7 +34,6 @@ public class MapObject implements PlacePageData
public static final int BOOKMARK = 2;
public static final int MY_POSITION = 3;
public static final int SEARCH = 4;
public static final int TRACK = 5;
@Retention(RetentionPolicy.SOURCE)
@IntDef({OPENING_MODE_PREVIEW, OPENING_MODE_PREVIEW_PLUS, OPENING_MODE_DETAILS, OPENING_MODE_FULL})
@@ -316,11 +315,6 @@ public class MapObject implements PlacePageData
return mMapObjectType == BOOKMARK;
}
public final boolean isTrack()
{
return mMapObjectType == TRACK;
}
@Nullable
public RoutePointInfo getRoutePointInfo()
{

Some files were not shown because too many files have changed in this diff Show More