mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-24 15:03:47 +00:00
Compare commits
82 Commits
test/2025.
...
test/2025.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d36a0d8f0d | ||
|
|
68781adccb | ||
|
|
73cfd3a6dc | ||
|
|
439babe056 | ||
|
|
a69e68fb9f | ||
|
|
c2bef3bd45 | ||
|
|
33ad35206f | ||
|
|
234f13abcc | ||
|
|
5e7bc37fb5 | ||
|
|
08abddc7fc | ||
|
|
ef9f4ceb1e | ||
|
|
6c75604c38 | ||
|
|
5edaa05129 | ||
|
|
c4491563b7 | ||
|
|
c3d8f948ce | ||
|
|
008387b0cf | ||
|
|
3d450433e7 | ||
|
|
58cb8ecd9d | ||
|
|
3e9b507acd | ||
|
|
c9a261dee5 | ||
|
|
d609876c2d | ||
|
|
80b616daf2 | ||
|
|
4dca45f74a | ||
|
|
f5037a5ee2 | ||
|
|
802f54494a | ||
|
|
d4863643f7 | ||
|
|
431e305a48 | ||
|
|
d3c64a262b | ||
|
|
06c35e729f | ||
|
|
b2743ab2ad | ||
|
|
c004f2ed7e | ||
|
|
abcc95710d | ||
|
|
3a90f9783d | ||
|
|
a8353a6a80 | ||
|
|
dc8d4e7da9 | ||
|
|
6a85526ac9 | ||
|
|
447266c328 | ||
|
|
886d569895 | ||
|
|
c6cd23fb24 | ||
|
|
c6040d8ce6 | ||
|
|
0f5125c61c | ||
|
|
512475ec5c | ||
|
|
66d5306717 | ||
|
|
265e94edc3 | ||
|
|
4d6cecd9ba | ||
|
|
46c9a015e5 | ||
|
|
2e3efc0597 | ||
|
|
0b65c2ebff | ||
|
|
96a7b31f4b | ||
|
|
c11f007012 | ||
|
|
977a3b6734 | ||
|
|
c27b0dc6fb | ||
|
|
e367fa6792 | ||
|
|
06b6c3f794 | ||
|
|
ca720d7712 | ||
|
|
661445a053 | ||
|
|
c616e235a1 | ||
|
|
d1f9806901 | ||
|
|
795fe0ee09 | ||
|
|
ea588e7ece | ||
|
|
053855bd97 | ||
|
|
f485830c51 | ||
|
|
debea83908 | ||
|
|
729808fd14 | ||
|
|
b85c11ea5a | ||
|
|
315bba2a22 | ||
|
|
550455a14a | ||
|
|
588028c9eb | ||
|
|
6beabb2fe1 | ||
|
|
25a4a3b76f | ||
|
|
111e913478 | ||
|
|
632d9c0d1d | ||
|
|
1e729e980d | ||
|
|
339eca0bca | ||
|
|
ac453e36ac | ||
|
|
4052f0481e | ||
|
|
89d82be2b9 | ||
|
|
e98ecce375 | ||
|
|
0eee3c4bf4 | ||
|
|
2684e2b278 | ||
|
|
bb88861256 | ||
|
|
f1628c70bc |
1
android/app/src/fdroid/java/app/organicmaps/location
Symbolic link
1
android/app/src/fdroid/java/app/organicmaps/location
Symbolic link
@@ -0,0 +1 @@
|
||||
../../../../google/java/app/organicmaps/location
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../google/java/app/organicmaps/sdk/location
|
||||
@@ -0,0 +1,32 @@
|
||||
A CoMaps egy közösség által létrehozott, ingyenes és nyílt forráskódú térképalkalmazás, amely az OpenStreetMap térképadatain alapul, és amelyet az átláthatóság, a magánélet védelme és a nonprofit jelleg iránti elkötelezettség erősít. A CoMaps az Organic Maps villája, amely viszont a Maps.ME villája.
|
||||
|
||||
A projekt előzményeiről és az irányáról a <b><i>codeberg.org/comaps</i></b> oldalon olvashatsz.
|
||||
Csatlakozz ott a közösséghez, és segíts a legjobb térképalkalmazás elkészítésében.
|
||||
• Használd az alkalmazást és terjeszd a hírét
|
||||
• Adj visszajelzést és jelentsd a problémákat
|
||||
• Frissítsd és javítsd a térképadatokat az alkalmazásban vagy az OpenStreetMap weboldalán.
|
||||
|
||||
‣ <b>Offline-fókuszú:</b> Tervezd meg és navigáld külföldi útad mobilszolgáltatás nélkül, keress útpontokat egy távoli túra során stb. Az alkalmazás minden funkcióját úgy terveztük, hogy internetkapcsolat nélkül is működjön.
|
||||
‣ <b>A magánélet tiszteletben tartása:</b> Az alkalmazás az adatvédelem szem előtt tartásával készült, nem azonosítja az embereket, nem követi nyomon és nem gyűjt személyes adatokat, és reklámmentes.
|
||||
‣ <b>Takarékosdik az akkumulátorral és a tárhellyel:</b> Nem meríti le az akkumulátort, mint más navigációs alkalmazások. A jól összeállítot kis méretű térképek értékes helyet takarítanak meg a telefonon.
|
||||
‣ <b>Egyszerű és szép grafikus felület,</b> nagyszerű és könnyen használható funkciók, amelyek egyszerűen működnek.
|
||||
‣ <b>Ingyenes és a közösség által készített:</b> A hozzád hasonló emberek segítettek az alkalmazás létrehozásában azáltal, hogy hozzáadtak helyeket az OpenStreetMap térképhez, tesztelték és visszajelzést adtak a funkciókról, valamint hozzájárultak a fejlesztői képességeikkel és a pénzükkel.
|
||||
‣ <b>Nyílt és átlátható döntéshozatal és pénzügyek, nonprofit és teljesen nyílt forráskódú.</b>
|
||||
|
||||
<b>Főbb jellemzők:</b>
|
||||
• Letölthető részletes térképek olyan helyekkel, amelyek sok kereskedelmi térképen nem állnak rendelkezésre.
|
||||
• Szabadtéri üzemmód kiemelt túraútvonalakkal, táborhelyekkel, vízforrásokkal, csúcsokkal, szintvonalakkal stb.
|
||||
• Sétaútvonalak és kerékpárutak
|
||||
• Érdekes pontok, mint például éttermek, benzinkutak, szállodák, üzletek, látnivalók és még sok minden más
|
||||
• Keresés név, cím vagy az érdekes pontok kategóriája alapján
|
||||
• Navigáció hangutasításokkal gyalogláshoz, kerékpározáshoz vagy vezetéshez
|
||||
• Kedvenc helyeid könyvjelzővel láthatod el egyetlen érintéssel
|
||||
• Wikipedia szócikkek internetkapcsolat nélkül
|
||||
• Metró tranzit réteg és irányok
|
||||
• Útvonal mentése
|
||||
• Könyvjelzők és nyomvonalak exportálása és importálása KML, KMZ, GPX formátumokban
|
||||
• Sötét üzemmód az éjszakai használathoz
|
||||
• Térképadatok javítása mindenki számára egy alapvető beépített szerkesztő segítségével
|
||||
|
||||
<b>Itt van a szabadság</b>
|
||||
Fedezd fel az utadat, navigálj a világban úgy, hogy a magánélet és a közösség kerüljön előtérbe!
|
||||
@@ -1,4 +1,4 @@
|
||||
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.
|
||||
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.
|
||||
|
||||
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 altro evidenziati
|
||||
• Modalità Outdoor con percorsi escursionistici, campeggi, sorgenti d'acqua, picchi, dislivelli ed altri punti d'interesse 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
|
||||
|
||||
@@ -1 +1 @@
|
||||
Navigazione semplice - Immergiti nella tua avventura - Sviluppato dalla comunità
|
||||
Navigazione semplice - Immergiti nella tua avventura - Realizzato dalla comunità
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.organicmaps.sdk.location;
|
||||
package app.organicmaps.location;
|
||||
|
||||
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
|
||||
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
|
||||
@@ -10,6 +10,7 @@ import android.location.Location;
|
||||
import android.os.Looper;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.RequiresPermission;
|
||||
import app.organicmaps.sdk.location.BaseLocationProvider;
|
||||
import app.organicmaps.sdk.util.LocationUtils;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import com.google.android.gms.common.api.ApiException;
|
||||
@@ -1,23 +1,25 @@
|
||||
package app.organicmaps.sdk.location;
|
||||
package app.organicmaps.location;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.annotation.NonNull;
|
||||
import app.organicmaps.sdk.location.AndroidNativeProvider;
|
||||
import app.organicmaps.sdk.location.BaseLocationProvider;
|
||||
import app.organicmaps.sdk.location.LocationProviderFactory;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import com.google.android.gms.common.ConnectionResult;
|
||||
import com.google.android.gms.common.GoogleApiAvailability;
|
||||
|
||||
public class LocationProviderFactory
|
||||
public class LocationProviderFactoryImpl implements LocationProviderFactory
|
||||
{
|
||||
private static final String TAG = LocationProviderFactory.class.getSimpleName();
|
||||
private static final String TAG = LocationProviderFactoryImpl.class.getSimpleName();
|
||||
|
||||
public static boolean isGoogleLocationAvailable(@NonNull Context context)
|
||||
public boolean isGoogleLocationAvailable(@NonNull Context context)
|
||||
{
|
||||
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS;
|
||||
}
|
||||
|
||||
public static BaseLocationProvider getProvider(@NonNull Context context,
|
||||
@NonNull BaseLocationProvider.Listener listener)
|
||||
public BaseLocationProvider getProvider(@NonNull Context context, @NonNull BaseLocationProvider.Listener listener)
|
||||
{
|
||||
if (isGoogleLocationAvailable(context) && Config.useGoogleServices())
|
||||
{
|
||||
1
android/app/src/huawei/java/app/organicmaps/location
Symbolic link
1
android/app/src/huawei/java/app/organicmaps/location
Symbolic link
@@ -0,0 +1 @@
|
||||
../../../../google/java/app/organicmaps/location
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../google/java/app/organicmaps/sdk/location
|
||||
@@ -10,6 +10,8 @@ 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;
|
||||
@@ -31,17 +33,16 @@ import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class ChartController implements OnChartValueSelectedListener,
|
||||
BookmarkManager.OnElevationActivePointChangedListener,
|
||||
BookmarkManager.OnElevationCurrentPositionChangedListener
|
||||
public class ChartController implements OnChartValueSelectedListener
|
||||
{
|
||||
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 = 1500;
|
||||
private static final int CHART_ANIMATION_DURATION = 0;
|
||||
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
|
||||
@@ -62,6 +63,7 @@ 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)
|
||||
{
|
||||
@@ -70,8 +72,6 @@ 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,13 +101,6 @@ 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()),
|
||||
@@ -142,15 +135,17 @@ public class ChartController implements OnChartValueSelectedListener,
|
||||
mChart.getAxisRight().setEnabled(false);
|
||||
}
|
||||
|
||||
public void setData(@NonNull ElevationInfo info)
|
||||
public void setData(Track track)
|
||||
{
|
||||
mTrackId = info.getId();
|
||||
mTrackId = track.getTrackId();
|
||||
ElevationInfo info = track.getElevationInfo();
|
||||
TrackStatistics stats = track.getTrackStatistics();
|
||||
List<Entry> values = new ArrayList<>();
|
||||
|
||||
for (ElevationInfo.Point point : info.getPoints())
|
||||
values.add(new Entry((float) point.getDistance(), point.getAltitude()));
|
||||
values.add(new Entry((float) point.getDistance(), point.getAltitude(), point));
|
||||
|
||||
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);
|
||||
@@ -173,8 +168,8 @@ public class ChartController implements OnChartValueSelectedListener,
|
||||
mChart.setData(data);
|
||||
mChart.animateX(CHART_ANIMATION_DURATION);
|
||||
|
||||
mMinAltitude.setText(Framework.nativeFormatAltitude(info.getMinAltitude()));
|
||||
mMaxAltitude.setText(Framework.nativeFormatAltitude(info.getMaxAltitude()));
|
||||
mMinAltitude.setText(Framework.nativeFormatAltitude(stats.getMinElevation()));
|
||||
mMaxAltitude.setText(Framework.nativeFormatAltitude(stats.getMaxElevation()));
|
||||
|
||||
highlightActivePointManually();
|
||||
}
|
||||
@@ -192,7 +187,9 @@ public class ChartController implements OnChartValueSelectedListener,
|
||||
if (mTrackId == Utils.INVALID_ID)
|
||||
return;
|
||||
|
||||
BookmarkManager.INSTANCE.setElevationActivePoint(mTrackId, e.getX());
|
||||
if (mInformSelectedActivePointToCore)
|
||||
BookmarkManager.INSTANCE.setElevationActivePoint(mTrackId, e.getX(), (ElevationInfo.Point) e.getData());
|
||||
mInformSelectedActivePointToCore = true;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@@ -211,7 +208,6 @@ public class ChartController implements OnChartValueSelectedListener,
|
||||
highlightChartCurrentLocation();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCurrentPositionChanged()
|
||||
{
|
||||
if (mTrackId == Utils.INVALID_ID)
|
||||
@@ -222,7 +218,6 @@ public class ChartController implements OnChartValueSelectedListener,
|
||||
highlightActivePointManually();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onElevationActivePointChanged()
|
||||
{
|
||||
if (mTrackId == Utils.INVALID_ID)
|
||||
@@ -234,6 +229,7 @@ public class ChartController implements OnChartValueSelectedListener,
|
||||
private void highlightActivePointManually()
|
||||
{
|
||||
Highlight highlight = getActivePoint();
|
||||
mInformSelectedActivePointToCore = false;
|
||||
mChart.highlightValue(highlight, true);
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@ 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;
|
||||
@@ -35,7 +36,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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
@@ -116,10 +117,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 percent)
|
||||
public void onProgress(final int bytesDownloaded)
|
||||
{
|
||||
if (!isFinishing())
|
||||
mProgress.setProgressCompat(percent, true);
|
||||
mProgress.setProgressCompat(bytesDownloaded, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -155,7 +156,9 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
showMap();
|
||||
return;
|
||||
|
||||
case CountryItem.STATUS_FAILED: MapManager.showError(DownloadResourcesLegacyActivity.this, item, null); return;
|
||||
case CountryItem.STATUS_FAILED:
|
||||
MapManagerHelper.showError(DownloadResourcesLegacyActivity.this, item, null);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -250,7 +253,8 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
setDownloadMessage(bytes);
|
||||
|
||||
mProgress.setMax(bytes);
|
||||
mProgress.setProgressCompat(0, true);
|
||||
// Start progress at 1% according to M3 guidelines
|
||||
mProgress.setProgressCompat(bytes/100, true);
|
||||
}
|
||||
else
|
||||
finishFilesDownload(bytes);
|
||||
@@ -368,10 +372,11 @@ 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);
|
||||
mProgress.setProgressCompat(0, true);
|
||||
// Start progress at 1% according to M3 guidelines
|
||||
mProgress.setProgressCompat((int) (item.totalSize/100), true);
|
||||
|
||||
mCountryDownloadListenerSlot = MapManager.nativeSubscribe(mCountryDownloadListener);
|
||||
MapManager.startDownload(mCurrentCountry);
|
||||
MapManagerHelper.startDownload(mCurrentCountry);
|
||||
setAction(PROCEED_TO_MAP);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -12,6 +12,7 @@ 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;
|
||||
@@ -111,7 +112,6 @@ 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,6 +122,7 @@ 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;
|
||||
@@ -457,12 +458,10 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
@StyleRes
|
||||
protected int getThemeResourceId(@NonNull String theme)
|
||||
{
|
||||
Context context = getApplicationContext();
|
||||
|
||||
if (ThemeUtils.isDefaultTheme(context, theme))
|
||||
if (Config.UiTheme.isDefault(theme))
|
||||
return R.style.MwmTheme_MainActivity;
|
||||
|
||||
if (ThemeUtils.isNightTheme(context, theme))
|
||||
if (Config.UiTheme.isNight(theme))
|
||||
return R.style.MwmTheme_Night_MainActivity;
|
||||
|
||||
return super.getThemeResourceId(theme);
|
||||
@@ -584,7 +583,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
|
||||
private void refreshLightStatusBar()
|
||||
{
|
||||
UiUtils.setLightStatusBar(this, !(ThemeUtils.isNightTheme(this) || RoutingController.get().isPlanning()
|
||||
UiUtils.setLightStatusBar(this, !(ThemeUtils.isNightTheme() || RoutingController.get().isPlanning()
|
||||
|| ChoosePositionMode.get() != ChoosePositionMode.None));
|
||||
}
|
||||
|
||||
@@ -594,7 +593,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
UiUtils.setViewInsetsPaddingBottom(mPointChooser, windowInsets);
|
||||
UiUtils.setViewInsetsPaddingNoBottom(mPointChooserToolbar, windowInsets);
|
||||
final int trackRecorderOffset =
|
||||
TrackRecorder.nativeIsTrackRecordingEnabled() ? UiUtils.dimen(this, R.dimen.map_button_size) : 0;
|
||||
TrackRecorder.nativeIsTrackRecordingEnabled() ? 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
|
||||
@@ -1648,17 +1647,17 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
final int orientation = getResources().getConfiguration().orientation;
|
||||
final boolean isTrackRecordingEnabled = TrackRecorder.nativeIsTrackRecordingEnabled();
|
||||
if (isTrackRecordingEnabled && (orientation != Configuration.ORIENTATION_LANDSCAPE))
|
||||
offsetY += UiUtils.dimen(this, R.dimen.map_button_size);
|
||||
offsetY += dimen(this, R.dimen.map_button_size);
|
||||
if (orientation == Configuration.ORIENTATION_LANDSCAPE)
|
||||
{
|
||||
if (show)
|
||||
{
|
||||
final boolean isSmallScreen = UiUtils.getDisplayTotalHeight(this) < UiUtils.dimen(this, R.dimen.dp_400);
|
||||
final boolean isSmallScreen = UiUtils.getDisplayTotalHeight(this) < dimen(this, R.dimen.dp_400);
|
||||
if (!isSmallScreen || TrackRecorder.nativeIsTrackRecordingEnabled())
|
||||
offsetX += UiUtils.dimen(this, R.dimen.map_button_size);
|
||||
offsetX += dimen(this, R.dimen.map_button_size);
|
||||
}
|
||||
else if (isTrackRecordingEnabled)
|
||||
offsetY += UiUtils.dimen(this, R.dimen.map_button_size);
|
||||
offsetY += dimen(this, R.dimen.map_button_size);
|
||||
}
|
||||
updateCompassOffset(offsetY, offsetX);
|
||||
}
|
||||
@@ -2457,7 +2456,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
if (mCurrentWindowInsets != null)
|
||||
{
|
||||
final int offset = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top;
|
||||
updateCompassOffset(offset + UiUtils.dimen(this, R.dimen.map_button_size));
|
||||
updateCompassOffset(offset + dimen(this, R.dimen.map_button_size));
|
||||
}
|
||||
Toast.makeText(this, R.string.track_recording, Toast.LENGTH_SHORT).show();
|
||||
TrackRecordingService.startForegroundService(getApplicationContext());
|
||||
@@ -2550,7 +2549,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
items.add(new MenuBottomSheetItem(R.string.download_maps, R.drawable.ic_download, getDownloadMapsCounter(),
|
||||
this::onDownloadMapsOptionSelected));
|
||||
|
||||
mDonatesUrl = Config.getDonateUrl(getApplicationContext());
|
||||
mDonatesUrl = Utils.getDonateUrl(getApplicationContext());
|
||||
if (!mDonatesUrl.isEmpty())
|
||||
items.add(new MenuBottomSheetItem(R.string.donate, R.drawable.ic_donate, this::onDonateOptionSelected));
|
||||
|
||||
|
||||
@@ -14,8 +14,10 @@ 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;
|
||||
@@ -41,6 +43,9 @@ public class MwmApplication extends Application implements Application.ActivityL
|
||||
@NonNull
|
||||
private static final String TAG = MwmApplication.class.getSimpleName();
|
||||
|
||||
@NonNull
|
||||
private final LocationProviderFactoryImpl mLocationProviderFactory = new LocationProviderFactoryImpl();
|
||||
|
||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||
@NonNull
|
||||
private OrganicMaps mOrganicMaps;
|
||||
@@ -99,6 +104,12 @@ public class MwmApplication extends Application implements Application.ActivityL
|
||||
return mOrganicMaps;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public LocationProviderFactoryImpl getLocationProviderFactory()
|
||||
{
|
||||
return mLocationProviderFactory;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static MwmApplication from(@NonNull Context context)
|
||||
{
|
||||
@@ -119,7 +130,10 @@ public class MwmApplication extends Application implements Application.ActivityL
|
||||
|
||||
sInstance = this;
|
||||
|
||||
mOrganicMaps = new OrganicMaps(getApplicationContext());
|
||||
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);
|
||||
|
||||
ConnectionState.INSTANCE.initialize(this);
|
||||
|
||||
|
||||
@@ -9,7 +9,8 @@ import androidx.annotation.IntegerRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.Utils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import org.chromium.base.ObserverList;
|
||||
|
||||
class PanelAnimator
|
||||
@@ -26,7 +27,7 @@ class PanelAnimator
|
||||
PanelAnimator(MwmActivity activity)
|
||||
{
|
||||
mActivity = activity;
|
||||
mWidth = UiUtils.dimen(activity.getApplicationContext(), R.dimen.panel_width);
|
||||
mWidth = Utils.dimen(activity.getApplicationContext(), R.dimen.panel_width);
|
||||
mPanel = mActivity.findViewById(R.id.fragment_container);
|
||||
mDuration = mActivity.getResources().getInteger(R.integer.anim_panel);
|
||||
}
|
||||
|
||||
@@ -60,11 +60,10 @@ public class SplashActivity extends AppCompatActivity
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
final Context context = getApplicationContext();
|
||||
final String theme = Config.getCurrentUiTheme(context);
|
||||
if (ThemeUtils.isDefaultTheme(context, theme))
|
||||
final String theme = Config.UiTheme.getCurrent();
|
||||
if (Config.UiTheme.isDefault(theme))
|
||||
setTheme(R.style.MwmTheme_Splash);
|
||||
else if (ThemeUtils.isNightTheme(context, theme))
|
||||
else if (Config.UiTheme.isNight(theme))
|
||||
setTheme(R.style.MwmTheme_Night_Splash);
|
||||
else
|
||||
throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme);
|
||||
|
||||
@@ -9,7 +9,7 @@ import android.webkit.WebView;
|
||||
import android.webkit.WebViewClient;
|
||||
import androidx.annotation.NonNull;
|
||||
import app.organicmaps.base.OnBackPressListener;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
|
||||
public abstract class WebContainerDelegate implements OnBackPressListener
|
||||
{
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
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;
|
||||
|
||||
@@ -15,8 +16,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;
|
||||
@@ -50,14 +51,14 @@ public class BackupUtils
|
||||
|
||||
String volumeName;
|
||||
if ("primary".equalsIgnoreCase(volumeId))
|
||||
volumeName = context.getString(R.string.maps_storage_shared);
|
||||
volumeName = context.getString(app.organicmaps.sdk.R.string.maps_storage_shared);
|
||||
else
|
||||
volumeName = context.getString(R.string.maps_storage_removable);
|
||||
volumeName = context.getString(app.organicmaps.sdk.R.string.maps_storage_removable);
|
||||
|
||||
SpannableStringBuilder sb = new SpannableStringBuilder();
|
||||
sb.append(volumeName + ": \n", new AbsoluteSizeSpan(UiUtils.dimen(context, R.dimen.text_size_body_3)),
|
||||
sb.append(volumeName + ": \n", new AbsoluteSizeSpan(dimen(context, R.dimen.text_size_body_3)),
|
||||
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
sb.append("/" + subPath, new AbsoluteSizeSpan(UiUtils.dimen(context, R.dimen.text_size_body_4)),
|
||||
sb.append("/" + subPath, new AbsoluteSizeSpan(dimen(context, R.dimen.text_size_body_4)),
|
||||
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
return sb;
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ public class BaseMwmDialogFragment extends DialogFragment
|
||||
@StyleRes
|
||||
protected final int getFullscreenTheme()
|
||||
{
|
||||
return ThemeUtils.isNightTheme(requireContext()) ? getFullscreenDarkTheme() : getFullscreenLightTheme();
|
||||
return ThemeUtils.isNightTheme() ? getFullscreenDarkTheme() : getFullscreenLightTheme();
|
||||
}
|
||||
|
||||
protected int getStyle()
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package app.organicmaps.base;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Color;
|
||||
import android.media.AudioManager;
|
||||
@@ -24,7 +23,6 @@ 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;
|
||||
|
||||
@@ -40,12 +38,10 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
|
||||
@StyleRes
|
||||
protected int getThemeResourceId(@NonNull String theme)
|
||||
{
|
||||
Context context = getApplicationContext();
|
||||
|
||||
if (ThemeUtils.isDefaultTheme(context, theme))
|
||||
if (Config.UiTheme.isDefault(theme))
|
||||
return R.style.MwmTheme;
|
||||
|
||||
if (ThemeUtils.isNightTheme(context, theme))
|
||||
if (Config.UiTheme.isNight(theme))
|
||||
return R.style.MwmTheme_Night;
|
||||
|
||||
throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme);
|
||||
@@ -62,7 +58,7 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
|
||||
protected final void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
mThemeName = Config.getCurrentUiTheme(getApplicationContext());
|
||||
mThemeName = Config.UiTheme.getCurrent();
|
||||
setTheme(getThemeResourceId(mThemeName));
|
||||
EdgeToEdge.enable(this, SystemBarStyle.dark(Color.TRANSPARENT));
|
||||
RtlUtils.manageRtl(this);
|
||||
@@ -122,7 +118,7 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
|
||||
public void onPostResume()
|
||||
{
|
||||
super.onPostResume();
|
||||
if (!mThemeName.equals(Config.getCurrentUiTheme(getApplicationContext())))
|
||||
if (!mThemeName.equals(Config.UiTheme.getCurrent()))
|
||||
{
|
||||
// Workaround described in https://code.google.com/p/android/issues/detail?id=93731
|
||||
UiThread.runLater(this::recreate);
|
||||
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils.ScrollableContentInsetsListener;
|
||||
import app.organicmaps.widget.PlaceholderView;
|
||||
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ public class BookmarkCategoriesActivity extends BaseToolbarActivity
|
||||
@StyleRes
|
||||
public int getThemeResourceId(@NonNull String theme)
|
||||
{
|
||||
return ThemeUtils.getWindowBgThemeResourceId(getApplicationContext(), theme);
|
||||
return ThemeUtils.getWindowBgThemeResourceId(theme);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.List;
|
||||
|
||||
@@ -41,7 +41,7 @@ public class BookmarkListActivity extends BaseToolbarActivity
|
||||
@StyleRes
|
||||
public int getThemeResourceId(@NonNull String theme)
|
||||
{
|
||||
return ThemeUtils.getCardBgThemeResourceId(getApplicationContext(), theme);
|
||||
return ThemeUtils.getCardBgThemeResourceId(theme);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -33,16 +33,15 @@ 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;
|
||||
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
|
||||
public class ChooseBookmarksSortingTypeFragment
|
||||
extends BaseMwmDialogFragment implements RadioGroup.OnCheckedChangeListener
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -12,6 +12,7 @@ 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;
|
||||
@@ -169,7 +170,7 @@ class DownloaderScreen extends BaseScreen
|
||||
mIsDownloadFailed = true;
|
||||
final ErrorScreen.Builder builder = new ErrorScreen.Builder(getCarContext())
|
||||
.setTitle(R.string.country_status_download_failed)
|
||||
.setErrorMessage(MapManager.getErrorCodeStrRes(data.errorCode))
|
||||
.setErrorMessage(MapManagerHelper.getErrorCodeStrRes(data.errorCode))
|
||||
.setPositiveButton(R.string.downloader_retry, null);
|
||||
if (!mIsCancelActionDisabled)
|
||||
builder.setNegativeButton(R.string.cancel, this::finish);
|
||||
|
||||
@@ -10,19 +10,20 @@ 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, R.string.theme_auto),
|
||||
LIGHT(R.string.off, R.string.theme_default),
|
||||
NIGHT(R.string.on, R.string.theme_night);
|
||||
AUTO(R.string.auto, Config.UiTheme.AUTO),
|
||||
LIGHT(R.string.off, Config.UiTheme.DEFAULT),
|
||||
NIGHT(R.string.on, Config.UiTheme.NIGHT);
|
||||
|
||||
ThemeMode(@StringRes int titleId, @StringRes int prefsKeyId)
|
||||
ThemeMode(@StringRes int titleId, @NonNull String config)
|
||||
{
|
||||
mTitleId = titleId;
|
||||
mPrefsKeyId = prefsKeyId;
|
||||
mConfig = config;
|
||||
}
|
||||
|
||||
@StringRes
|
||||
@@ -31,16 +32,16 @@ public final class ThemeUtils
|
||||
return mTitleId;
|
||||
}
|
||||
|
||||
@StringRes
|
||||
public int getPrefsKeyId()
|
||||
@NonNull
|
||||
public String getConfig()
|
||||
{
|
||||
return mPrefsKeyId;
|
||||
return mConfig;
|
||||
}
|
||||
|
||||
@StringRes
|
||||
private final int mTitleId;
|
||||
@StringRes
|
||||
private final int mPrefsKeyId;
|
||||
@NonNull
|
||||
private final String mConfig;
|
||||
}
|
||||
|
||||
private static final String ANDROID_AUTO_PREFERENCES_FILE_KEY = "ANDROID_AUTO_PREFERENCES_FILE_KEY";
|
||||
@@ -79,23 +80,20 @@ public final class ThemeUtils
|
||||
@UiThread
|
||||
public static void setThemeMode(@NonNull CarContext context, @NonNull ThemeMode themeMode)
|
||||
{
|
||||
getSharedPreferences(context).edit().putString(THEME_KEY, context.getString(themeMode.getPrefsKeyId())).commit();
|
||||
getSharedPreferences(context).edit().putString(THEME_KEY, themeMode.getConfig()).commit();
|
||||
update(context, themeMode);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ThemeMode getThemeMode(@NonNull CarContext context)
|
||||
{
|
||||
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);
|
||||
final String themeMode = getSharedPreferences(context).getString(THEME_KEY, ThemeMode.AUTO.getConfig());
|
||||
|
||||
if (themeMode.equals(autoTheme))
|
||||
if (themeMode.equals(ThemeMode.AUTO.getConfig()))
|
||||
return ThemeMode.AUTO;
|
||||
else if (themeMode.equals(lightTheme))
|
||||
else if (themeMode.equals(ThemeMode.LIGHT.getConfig()))
|
||||
return ThemeMode.LIGHT;
|
||||
else if (themeMode.equals(nightTheme))
|
||||
else if (themeMode.equals(ThemeMode.NIGHT.getConfig()))
|
||||
return ThemeMode.NIGHT;
|
||||
else
|
||||
throw new IllegalArgumentException("Unsupported value");
|
||||
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.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)
|
||||
{
|
||||
MapManager.warn3gAndDownload(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
|
||||
MapManagerHelper.warn3gAndDownload(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -38,7 +38,10 @@ class BottomPanel
|
||||
public void onClick(View v)
|
||||
{
|
||||
final String country = mFragment.getCurrentRoot();
|
||||
MapManager.warnOn3gUpdate(mFragment.requireActivity(), country, () -> MapManager.startUpdate(country));
|
||||
MapManagerHelper.warnOn3gUpdate(mFragment.requireActivity(), country, () -> {
|
||||
DownloaderService.startForegroundService();
|
||||
MapManagerHelper.startUpdate(country);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@@ -55,7 +58,7 @@ class BottomPanel
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
MapManager.warn3gAndRetry(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
|
||||
MapManagerHelper.warn3gAndRetry(mFragment.requireActivity(), mFragment.getCurrentRoot(), null);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.widget.WheelProgressView;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
@@ -198,7 +198,8 @@ public class CountrySuggestFragment extends BaseMwmFragment implements View.OnCl
|
||||
final int id = v.getId();
|
||||
if (id == R.id.btn__download_map)
|
||||
{
|
||||
MapManager.warn3gAndDownload(requireActivity(), mCurrentCountry.id, () -> mDownloadingCountry = mCurrentCountry);
|
||||
MapManagerHelper.warn3gAndDownload(requireActivity(), mCurrentCountry.id,
|
||||
() -> mDownloadingCountry = mCurrentCountry);
|
||||
}
|
||||
else if (id == R.id.btn__select_map)
|
||||
{
|
||||
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.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)
|
||||
{
|
||||
MapManager.warn3gAndDownload(adapter.mActivity, item.id, null);
|
||||
MapManagerHelper.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;
|
||||
MapManager.warnOn3gUpdate(adapter.mActivity, item.id, () -> MapManager.startUpdate(item.id));
|
||||
MapManagerHelper.warnOn3gUpdate(adapter.mActivity, item.id, () -> MapManagerHelper.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)
|
||||
{
|
||||
MapManager.showError(mActivity, item, null);
|
||||
MapManagerHelper.showError(mActivity, item, null);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -382,9 +382,12 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
||||
else
|
||||
processLongClick();
|
||||
}
|
||||
case CountryItem.STATUS_FAILED -> MapManager.warn3gAndRetry(mActivity, mItem.id, null);
|
||||
case CountryItem.STATUS_FAILED ->
|
||||
{
|
||||
MapManagerHelper.warn3gAndRetry(mActivity, mItem.id, null);
|
||||
}
|
||||
case CountryItem.STATUS_UPDATABLE ->
|
||||
MapManager.warnOn3gUpdate(mActivity, mItem.id, () -> MapManager.startUpdate(mItem.id));
|
||||
MapManagerHelper.warnOn3gUpdate(mActivity, mItem.id, () -> MapManagerHelper.startUpdate(mItem.id));
|
||||
default -> throw new IllegalArgumentException("Inappropriate item status: " + mItem.status);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,8 @@ import androidx.core.view.OnApplyWindowInsetsListener;
|
||||
import androidx.core.view.WindowInsetsCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.Utils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.WindowInsetUtils;
|
||||
|
||||
final class DownloaderInsetsListener implements OnApplyWindowInsetsListener
|
||||
@@ -55,7 +56,7 @@ final class DownloaderInsetsListener implements OnApplyWindowInsetsListener
|
||||
|
||||
private void applyInsetsToButtons(Insets insets)
|
||||
{
|
||||
int baseMargin = UiUtils.dimen(mContext, R.dimen.margin_base);
|
||||
int baseMargin = Utils.dimen(mContext, R.dimen.margin_base);
|
||||
|
||||
ViewGroup.MarginLayoutParams fabParams = (ViewGroup.MarginLayoutParams) mFab.getLayoutParams();
|
||||
ViewGroup.MarginLayoutParams buttonParams = (ViewGroup.MarginLayoutParams) mButton.getLayoutParams();
|
||||
|
||||
@@ -20,6 +20,7 @@ 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
|
||||
{
|
||||
@@ -29,7 +30,8 @@ public class DownloaderNotifier
|
||||
public static final int NOTIFICATION_ID = 1;
|
||||
|
||||
private final Context mContext;
|
||||
private NotificationCompat.Builder mProgressNotificationBuilder;
|
||||
private NotificationCompat.Builder mProgressNotificationBuilder = null;
|
||||
private String mNotificationCountryId = null;
|
||||
|
||||
public DownloaderNotifier(Context context)
|
||||
{
|
||||
@@ -45,6 +47,7 @@ public class DownloaderNotifier
|
||||
.setShowBadge(true)
|
||||
.setVibrationEnabled(false)
|
||||
.setLightsEnabled(false)
|
||||
.setSound(null, null)
|
||||
.build();
|
||||
notificationManager.createNotificationChannel(channel);
|
||||
}
|
||||
@@ -62,8 +65,6 @@ 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)
|
||||
@@ -74,7 +75,7 @@ public class DownloaderNotifier
|
||||
.setContentText(content)
|
||||
.setShowWhen(true)
|
||||
.setTicker(getTicker(mContext, title, content))
|
||||
.setContentIntent(contentPendingIntent)
|
||||
.setContentIntent(getNotificationPendingIntent(countryId))
|
||||
.setOnlyAlertOnce(true)
|
||||
.build();
|
||||
|
||||
@@ -110,32 +111,41 @@ public class DownloaderNotifier
|
||||
@NonNull
|
||||
public Notification buildProgressNotification(@Nullable String countryId, int maxProgress, int progress)
|
||||
{
|
||||
var builder = startNotification(countryId);
|
||||
|
||||
builder.setProgress(maxProgress, progress, maxProgress == 0);
|
||||
builder.setContentText("Download in progress");
|
||||
|
||||
var builder = getNotificationBuilder(countryId);
|
||||
/// @todo Doesn't work properly .. Bad input sizes?
|
||||
// builder.setProgress(maxProgress, progress, maxProgress == 0);
|
||||
builder.setProgress(maxProgress, progress, true);
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private NotificationCompat.Builder startNotification(@Nullable String countryId)
|
||||
private NotificationCompat.Builder getNotificationBuilder(@Nullable String countryId)
|
||||
{
|
||||
final String title = mContext.getString(R.string.app_name);
|
||||
if (mProgressNotificationBuilder == null || !Objects.equals(countryId, mNotificationCountryId))
|
||||
{
|
||||
mNotificationCountryId = countryId;
|
||||
final String countryName = countryId != null ? MapManager.nativeGetName(countryId) : "";
|
||||
|
||||
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));
|
||||
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;
|
||||
}
|
||||
|
||||
@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);
|
||||
|
||||
@@ -97,7 +97,7 @@ public class DownloaderService extends Service implements MapManager.StorageCall
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProgress(String countryId, long localSize, long remoteSize)
|
||||
public void onProgress(String countryId, long bytesDownloaded, long bytesTotal)
|
||||
{
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
|
||||
&& ContextCompat.checkSelfPermission(this, POST_NOTIFICATIONS) != PERMISSION_GRANTED)
|
||||
@@ -106,8 +106,7 @@ public class DownloaderService extends Service implements MapManager.StorageCall
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: How to calculate progress?
|
||||
mNotifier.notifyProgress();
|
||||
mNotifier.notifyProgress(countryId, (int) bytesTotal, (int) bytesDownloaded);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import android.content.Intent;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.widget.SearchToolbarController;
|
||||
|
||||
class DownloaderToolbarController extends SearchToolbarController
|
||||
|
||||
@@ -0,0 +1,223 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.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)
|
||||
MapManager.showError(mActivity, item, null);
|
||||
MapManagerHelper.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))
|
||||
{
|
||||
MapManager.startDownload(mCurrentCountry.id);
|
||||
MapManagerHelper.startDownload(mCurrentCountry.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -199,18 +199,18 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
|
||||
setAutodownloadLocked(true);
|
||||
});
|
||||
mButton.setOnClickListener(
|
||||
v -> MapManager.warnOn3g(mActivity, mCurrentCountry == null ? null : mCurrentCountry.id, () -> {
|
||||
v -> MapManagerHelper.warnOn3g(mActivity, mCurrentCountry == null ? null : mCurrentCountry.id, () -> {
|
||||
if (mCurrentCountry == null)
|
||||
return;
|
||||
|
||||
boolean retry = (mCurrentCountry.status == CountryItem.STATUS_FAILED);
|
||||
if (retry)
|
||||
{
|
||||
MapManager.retryDownload(mCurrentCountry.id);
|
||||
MapManagerHelper.retryDownload(mCurrentCountry.id);
|
||||
}
|
||||
else
|
||||
{
|
||||
MapManager.startDownload(mCurrentCountry.id);
|
||||
MapManagerHelper.startDownload(mCurrentCountry.id);
|
||||
mActivity.requestPostNotificationsPermission();
|
||||
}
|
||||
}));
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,7 +287,8 @@ 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())
|
||||
{
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package app.organicmaps.editor;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
@@ -25,7 +24,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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
import app.organicmaps.widget.SearchToolbarController;
|
||||
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
|
||||
@@ -79,8 +79,8 @@ public class HoursMinutesPickerFragment extends BaseMwmDialogFragment
|
||||
mTabs.getTabAt(mSelectedTab).select();
|
||||
|
||||
@StyleRes
|
||||
final int theme = ThemeUtils.isNightTheme(requireContext()) ? R.style.MwmMain_DialogFragment_TimePicker_Night
|
||||
: R.style.MwmMain_DialogFragment_TimePicker;
|
||||
final int theme = ThemeUtils.isNightTheme() ? 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(requireContext()) ? R.color.accent_color_selector_night
|
||||
: R.color.accent_color_selector);
|
||||
requireContext(),
|
||||
ThemeUtils.isNightTheme() ? 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);
|
||||
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
|
||||
@@ -15,10 +15,11 @@ 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.UiUtils;
|
||||
import app.organicmaps.sdk.util.DateUtils;
|
||||
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;
|
||||
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
|
||||
@@ -11,14 +11,17 @@ 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.UiUtils;
|
||||
import app.organicmaps.sdk.util.NetworkPolicy;
|
||||
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;
|
||||
@@ -26,6 +29,24 @@ 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;
|
||||
@@ -84,7 +105,7 @@ public class ProfileFragment extends BaseMwmToolbarFragment
|
||||
UiUtils.show(mProfileInfoLoading);
|
||||
UiUtils.hide(mUserInfoBlock);
|
||||
}
|
||||
final int profileEditCount = OsmOAuth.getOsmChangesetsCount(getParentFragmentManager());
|
||||
final int profileEditCount = OsmOAuth.getOsmChangesetsCount(mDialogPresenter, getParentFragmentManager());
|
||||
final String profileUsername = OsmOAuth.getUsername();
|
||||
final Bitmap profilePicture = OsmOAuth.getProfilePicture();
|
||||
|
||||
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.WindowInsetUtils.ScrollableContentInsetsListener;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
|
||||
|
||||
@@ -18,7 +18,8 @@ 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.UiUtils;
|
||||
import app.organicmaps.sdk.util.Utils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
@@ -224,7 +225,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,
|
||||
UiUtils.dimen(closedHost.getContext(), R.dimen.editor_height_closed)));
|
||||
Utils.dimen(closedHost.getContext(), R.dimen.editor_height_closed)));
|
||||
closedHours[i] = span;
|
||||
final int finalI = i;
|
||||
span.findViewById(R.id.iv__remove_closed)
|
||||
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.radiobutton.MaterialRadioButton;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
|
||||
@@ -7,15 +7,12 @@ import android.text.util.Linkify;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.annotation.IdRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.view.ViewCompat;
|
||||
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.BuildConfig;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmFragment;
|
||||
@@ -27,6 +24,8 @@ 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
|
||||
{
|
||||
@@ -35,15 +34,7 @@ public class HelpFragment extends BaseMwmFragment implements View.OnClickListene
|
||||
|
||||
private void setupItem(@IdRes int id, boolean tint, @NonNull View frame)
|
||||
{
|
||||
final MaterialTextView view = frame.findViewById(id);
|
||||
view.setOnClickListener(this);
|
||||
if (tint)
|
||||
Graphics.tint(view);
|
||||
}
|
||||
|
||||
private void setupButton(@IdRes int id, boolean tint, @NonNull View frame)
|
||||
{
|
||||
final MaterialButton view = frame.findViewById(id);
|
||||
final TextView view = frame.findViewById(id);
|
||||
view.setOnClickListener(this);
|
||||
if (tint)
|
||||
Graphics.tint(view);
|
||||
@@ -52,7 +43,7 @@ public class HelpFragment extends BaseMwmFragment implements View.OnClickListene
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
|
||||
{
|
||||
mDonateUrl = Config.getDonateUrl(requireContext());
|
||||
mDonateUrl = Utils.getDonateUrl(requireContext());
|
||||
View root = inflater.inflate(R.layout.about, container, false);
|
||||
|
||||
((MaterialTextView) root.findViewById(R.id.version)).setText(BuildConfig.VERSION_NAME);
|
||||
@@ -79,7 +70,7 @@ public class HelpFragment extends BaseMwmFragment implements View.OnClickListene
|
||||
setupItem(R.id.mastodon, false, root);
|
||||
setupItem(R.id.openstreetmap, true, root);
|
||||
setupItem(R.id.faq, true, root);
|
||||
setupButton(R.id.report, isLandscape, root);
|
||||
setupItem(R.id.report, isLandscape, root);
|
||||
setupItem(R.id.copyright, false, root);
|
||||
|
||||
final MaterialTextView supportUsView = root.findViewById(R.id.support_us);
|
||||
@@ -95,7 +86,7 @@ public class HelpFragment extends BaseMwmFragment implements View.OnClickListene
|
||||
{
|
||||
/*donateView.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_donate, 0,
|
||||
R.drawable.ic_donate, 0);*/
|
||||
setupButton(R.id.donate, isLandscape, root);
|
||||
setupItem(R.id.donate, isLandscape, root);
|
||||
}
|
||||
|
||||
if (BuildConfig.REVIEW_URL.isEmpty())
|
||||
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import java.util.List;
|
||||
|
||||
public class LayersAdapter extends RecyclerView.Adapter<LayerHolder>
|
||||
|
||||
@@ -36,8 +36,9 @@ 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;
|
||||
@@ -214,7 +215,7 @@ public class MapButtonsController extends Fragment
|
||||
// helpButton.setImageResource(R.drawable.ic_launcher);
|
||||
// }
|
||||
// // Keep this button colorful in normal theme.
|
||||
// if (!ThemeUtils.isNightTheme(requireContext()))
|
||||
// if (!ThemeUtils.isNightTheme())
|
||||
// helpButton.getDrawable().setTintList(null);
|
||||
}
|
||||
else if (leftButtonView != null)
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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,22 +43,20 @@ public class TrafficButton
|
||||
void turnOff()
|
||||
{
|
||||
stopWaitingAnimation();
|
||||
mButton.setImageResource(ThemeUtils.isNightTheme(mButton.getContext()) ? R.drawable.ic_traffic_on_night
|
||||
: R.drawable.ic_traffic_on);
|
||||
mButton.setImageResource(ThemeUtils.isNightTheme() ? R.drawable.ic_traffic_on_night : R.drawable.ic_traffic_on);
|
||||
}
|
||||
|
||||
void turnOn()
|
||||
{
|
||||
stopWaitingAnimation();
|
||||
mButton.setImageResource(ThemeUtils.isNightTheme(mButton.getContext()) ? R.drawable.ic_traffic_on_night
|
||||
: R.drawable.ic_traffic_on);
|
||||
mButton.setImageResource(ThemeUtils.isNightTheme() ? R.drawable.ic_traffic_on_night : R.drawable.ic_traffic_on);
|
||||
}
|
||||
|
||||
void markAsOutdated()
|
||||
{
|
||||
stopWaitingAnimation();
|
||||
mButton.setImageResource(ThemeUtils.isNightTheme(mButton.getContext()) ? R.drawable.ic_traffic_outdated_night
|
||||
: R.drawable.ic_traffic_outdated);
|
||||
mButton.setImageResource(ThemeUtils.isNightTheme() ? R.drawable.ic_traffic_outdated_night
|
||||
: R.drawable.ic_traffic_outdated);
|
||||
}
|
||||
|
||||
void startWaitingAnimation()
|
||||
|
||||
@@ -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.UiUtils;
|
||||
import app.organicmaps.sdk.util.Utils;
|
||||
import app.organicmaps.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 = UiUtils.dimen(requireContext(), R.dimen.margin_quadruple);
|
||||
final int indicatorWidth = Utils.dimen(requireContext(), R.dimen.margin_quadruple);
|
||||
listView.setIndicatorBounds(width - indicatorWidth, width);
|
||||
listView.setIndicatorBoundsRelative(width - indicatorWidth, width);
|
||||
});
|
||||
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.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(R.string.core_my_position);
|
||||
title = mContext.getString(app.organicmaps.sdk.R.string.core_my_position);
|
||||
|
||||
if (mRoutePoints.get(position).mPointType != RouteMarkType.Start)
|
||||
subtitle = mRoutePoints.get(position).mTitle;
|
||||
|
||||
@@ -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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior;
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialog;
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package app.organicmaps.routing;
|
||||
|
||||
import static app.organicmaps.sdk.util.Utils.dimen;
|
||||
|
||||
import android.location.Location;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
@@ -21,7 +23,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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils;
|
||||
import app.organicmaps.widget.LanesView;
|
||||
@@ -166,7 +168,7 @@ public class NavigationController implements TrafficManager.TrafficCallback, Nav
|
||||
UiUtils.visibleIf(hasStreet, mStreetFrame);
|
||||
if (!TextUtils.isEmpty(info.nextStreet))
|
||||
mNextStreet.setText(info.nextStreet);
|
||||
int margin = UiUtils.dimen(mFrame.getContext(), R.dimen.nav_frame_padding);
|
||||
int margin = dimen(mFrame.getContext(), R.dimen.nav_frame_padding);
|
||||
if (hasStreet)
|
||||
margin += mStreetFrame.getHeight();
|
||||
mMapButtonsViewModel.setTopButtonsMarginTop(margin);
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package app.organicmaps.routing;
|
||||
|
||||
import static app.organicmaps.sdk.util.Utils.dimen;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
@@ -37,9 +39,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;
|
||||
@@ -345,16 +347,17 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
||||
|
||||
UiUtils.hide(mTimeVehicle);
|
||||
|
||||
int chartWidth = UiUtils.dimen(mContext, R.dimen.altitude_chart_image_width);
|
||||
int chartHeight = UiUtils.dimen(mContext, R.dimen.altitude_chart_image_height);
|
||||
int chartWidth = dimen(mContext, R.dimen.altitude_chart_image_width);
|
||||
int chartHeight = 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(R.string.m)
|
||||
: mAltitudeDifference.getResources().getString(R.string.ft);
|
||||
final String unit = limits.isMetricUnits
|
||||
? mAltitudeDifference.getResources().getString(app.organicmaps.sdk.R.string.m)
|
||||
: mAltitudeDifference.getResources().getString(app.organicmaps.sdk.R.string.ft);
|
||||
mAltitudeDifference.setText("↗ " + limits.totalAscentString + " " + unit + " ↘ " + limits.totalDescentString + " "
|
||||
+ unit);
|
||||
UiUtils.show(mAltitudeDifference);
|
||||
|
||||
@@ -14,9 +14,10 @@ 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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
|
||||
@@ -108,7 +109,7 @@ public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
|
||||
}
|
||||
}
|
||||
|
||||
MapManager.warnOn3g(requireActivity(), size, () -> {
|
||||
MapManagerHelper.warnOn3g(requireActivity(), size, () -> {
|
||||
final FragmentManager manager = requireActivity().getSupportFragmentManager();
|
||||
RoutingMapsDownloadFragment downloader =
|
||||
RoutingMapsDownloadFragment.create(manager.getFragmentFactory(), getAppContextOrThrow(), mMapsArray);
|
||||
|
||||
@@ -9,10 +9,11 @@ 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.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.widget.WheelProgressView;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
@@ -40,7 +41,7 @@ public class RoutingMapsDownloadFragment extends BaseRoutingErrorDialogFragment
|
||||
mMapsArray[i] = item.id;
|
||||
}
|
||||
|
||||
MapManager.startDownload(mMapsArray);
|
||||
MapManagerHelper.startDownload(mMapsArray);
|
||||
}
|
||||
|
||||
private View setupFrame(View frame)
|
||||
|
||||
@@ -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,7 +141,8 @@ 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, R.drawable.ic_route_planning_metro_40px, this::onTransitModeSelected);
|
||||
setupRouterButton(R.id.transit, app.organicmaps.sdk.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);
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
|
||||
public class RoutingPlanInplaceController extends RoutingPlanController
|
||||
{
|
||||
|
||||
@@ -90,7 +90,7 @@ public class TransitStepView extends View implements MultilineLayoutManager.Sque
|
||||
{
|
||||
mDrawable = null;
|
||||
mText = info.getDistance() + " " + info.getDistanceUnits();
|
||||
mTextPaint.setColor(ThemeUtils.isDefaultTheme(getContext()) ? Color.BLACK : Color.WHITE);
|
||||
mTextPaint.setColor(ThemeUtils.isDefaultTheme() ? Color.BLACK : Color.WHITE);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
package app.organicmaps.sdk.bookmarks.data;
|
||||
|
||||
import androidx.annotation.Keep;
|
||||
import app.organicmaps.sdk.util.Distance;
|
||||
|
||||
// Called from JNI.
|
||||
@Keep
|
||||
@SuppressWarnings("unused")
|
||||
public class Track
|
||||
{
|
||||
private final long mTrackId;
|
||||
private final long mCategoryId;
|
||||
private final String mName;
|
||||
private final Distance mLength;
|
||||
private final int mColor;
|
||||
|
||||
Track(long trackId, long categoryId, String name, Distance length, int color)
|
||||
{
|
||||
mTrackId = trackId;
|
||||
mCategoryId = categoryId;
|
||||
mName = name;
|
||||
mLength = length;
|
||||
mColor = color;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
{
|
||||
return mName;
|
||||
}
|
||||
|
||||
public Distance getLength()
|
||||
{
|
||||
return mLength;
|
||||
}
|
||||
|
||||
public int getColor()
|
||||
{
|
||||
return mColor;
|
||||
}
|
||||
|
||||
public long getTrackId()
|
||||
{
|
||||
return mTrackId;
|
||||
}
|
||||
|
||||
public long getCategoryId()
|
||||
{
|
||||
return mCategoryId;
|
||||
}
|
||||
|
||||
public String getTrackDescription()
|
||||
{
|
||||
return BookmarkManager.INSTANCE.getTrackDescription(mTrackId);
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
package app.organicmaps.sdk.util;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.annotation.Keep;
|
||||
import androidx.annotation.NonNull;
|
||||
import java.text.DateFormat;
|
||||
import java.util.Locale;
|
||||
|
||||
public final class DateUtils
|
||||
{
|
||||
private DateUtils() {}
|
||||
|
||||
@NonNull
|
||||
public static DateFormat getShortDateFormatter()
|
||||
{
|
||||
return DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());
|
||||
}
|
||||
|
||||
// Called from JNI.
|
||||
@Keep
|
||||
@SuppressWarnings("unused")
|
||||
public static boolean is24HourFormat(@NonNull Context context)
|
||||
{
|
||||
return android.text.format.DateFormat.is24HourFormat(context);
|
||||
}
|
||||
}
|
||||
@@ -89,7 +89,7 @@ class CategoriesAdapter extends RecyclerView.Adapter<CategoriesAdapter.ViewHolde
|
||||
@DrawableRes
|
||||
private static int getDrawableResIdByKey(@NonNull Context context, @NonNull String packageName, @NonNull String key)
|
||||
{
|
||||
final boolean isNightTheme = ThemeUtils.isNightTheme(context);
|
||||
final boolean isNightTheme = ThemeUtils.isNightTheme();
|
||||
String iconId = "ic_" + key;
|
||||
if (isNightTheme)
|
||||
iconId = iconId + "_night";
|
||||
|
||||
@@ -5,7 +5,7 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import app.organicmaps.sdk.search.SearchEngine;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
import app.organicmaps.widget.SearchToolbarController;
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ public class SearchActivity extends BaseMwmFragmentActivity
|
||||
@StyleRes
|
||||
public int getThemeResourceId(@NonNull String theme)
|
||||
{
|
||||
return ThemeUtils.getCardBgThemeResourceId(getApplicationContext(), theme);
|
||||
return ThemeUtils.getCardBgThemeResourceId(theme);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -13,9 +13,9 @@ import androidx.core.content.ContextCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.search.SearchResult;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
|
||||
class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.SearchDataViewHolder>
|
||||
{
|
||||
|
||||
@@ -39,7 +39,7 @@ import app.organicmaps.sdk.search.SearchResult;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.Language;
|
||||
import app.organicmaps.sdk.util.SharedPropertiesUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils;
|
||||
import app.organicmaps.widget.PlaceholderView;
|
||||
|
||||
@@ -11,7 +11,7 @@ import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmRecyclerFragment;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.widget.PlaceholderView;
|
||||
import app.organicmaps.widget.SearchToolbarController;
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ abstract class BaseXmlSettingsFragment extends PreferenceFragmentCompat
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
||||
int color;
|
||||
if (ThemeUtils.isDefaultTheme(requireContext()))
|
||||
if (ThemeUtils.isDefaultTheme())
|
||||
color = ContextCompat.getColor(requireContext(), R.color.bg_cards);
|
||||
else
|
||||
color = ContextCompat.getColor(requireContext(), R.color.bg_cards_night);
|
||||
|
||||
@@ -3,13 +3,11 @@ package app.organicmaps.settings;
|
||||
import static app.organicmaps.leftbutton.LeftButtonsHolder.DISABLE_BUTTON_CODE;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.preference.ListPreference;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceCategory;
|
||||
@@ -26,7 +24,6 @@ import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.editor.OsmOAuth;
|
||||
import app.organicmaps.sdk.editor.data.Language;
|
||||
import app.organicmaps.sdk.location.LocationHelper;
|
||||
import app.organicmaps.sdk.location.LocationProviderFactory;
|
||||
import app.organicmaps.sdk.routing.RoutingOptions;
|
||||
import app.organicmaps.sdk.search.SearchRecents;
|
||||
import app.organicmaps.sdk.settings.MapLanguageCode;
|
||||
@@ -309,7 +306,9 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
|
||||
if (pref == null)
|
||||
return;
|
||||
|
||||
if (!LocationProviderFactory.isGoogleLocationAvailable(requireActivity().getApplicationContext()))
|
||||
if (!MwmApplication.from(requireContext())
|
||||
.getLocationProviderFactory()
|
||||
.isGoogleLocationAvailable(requireActivity().getApplicationContext()))
|
||||
removePreference(getString(R.string.pref_privacy), pref);
|
||||
else
|
||||
{
|
||||
@@ -441,19 +440,19 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
|
||||
private void initMapStylePrefsCallbacks()
|
||||
{
|
||||
final ListPreference pref = getPreference(getString(R.string.pref_map_style));
|
||||
|
||||
String curTheme = Config.getUiThemeSettings(requireContext());
|
||||
pref.setValue(curTheme);
|
||||
pref.setEntryValues(new CharSequence[] {Config.UiTheme.DEFAULT, Config.UiTheme.NIGHT, Config.UiTheme.AUTO,
|
||||
Config.UiTheme.NAV_AUTO});
|
||||
pref.setValue(Config.UiTheme.getUiThemeSettings());
|
||||
pref.setSummary(pref.getEntry());
|
||||
pref.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
final String themeName = (String) newValue;
|
||||
if (!Config.setUiThemeSettings(requireContext(), themeName))
|
||||
if (!Config.UiTheme.setUiThemeSettings(themeName))
|
||||
return true;
|
||||
|
||||
ThemeSwitcher.INSTANCE.restart(false);
|
||||
|
||||
ThemeMode mode = ThemeMode.getInstance(requireContext().getApplicationContext(), themeName);
|
||||
CharSequence summary = pref.getEntries()[mode.ordinal()];
|
||||
final ThemeMode mode = ThemeMode.getInstance(themeName);
|
||||
final CharSequence summary = pref.getEntries()[mode.ordinal()];
|
||||
pref.setSummary(summary);
|
||||
return true;
|
||||
});
|
||||
@@ -552,24 +551,25 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
|
||||
|
||||
enum ThemeMode
|
||||
{
|
||||
DEFAULT(R.string.theme_default),
|
||||
NIGHT(R.string.theme_night),
|
||||
AUTO(R.string.theme_auto),
|
||||
NAV_AUTO(R.string.theme_nav_auto);
|
||||
DEFAULT(Config.UiTheme.DEFAULT),
|
||||
NIGHT(Config.UiTheme.NIGHT),
|
||||
AUTO(Config.UiTheme.AUTO),
|
||||
NAV_AUTO(Config.UiTheme.NAV_AUTO);
|
||||
|
||||
private final int mModeStringId;
|
||||
@NonNull
|
||||
private final String mMode;
|
||||
|
||||
ThemeMode(@StringRes int modeStringId)
|
||||
ThemeMode(@NonNull String mode)
|
||||
{
|
||||
mModeStringId = modeStringId;
|
||||
mMode = mode;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ThemeMode getInstance(@NonNull Context context, @NonNull String src)
|
||||
public static ThemeMode getInstance(@NonNull String src)
|
||||
{
|
||||
for (ThemeMode each : values())
|
||||
{
|
||||
if (context.getResources().getString(each.mModeStringId).equals(src))
|
||||
if (each.mMode.equals(src))
|
||||
return each;
|
||||
}
|
||||
return AUTO;
|
||||
|
||||
@@ -13,7 +13,7 @@ import android.widget.CheckedTextView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.settings.StorageItem;
|
||||
import app.organicmaps.sdk.settings.StoragePathManager;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.Utils;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
|
||||
class StoragePathAdapter extends BaseAdapter
|
||||
@@ -65,14 +65,14 @@ class StoragePathAdapter extends BaseAdapter
|
||||
SpannableStringBuilder sb = new SpannableStringBuilder(item.mLabel + "\n" + size);
|
||||
sb.setSpan(new ForegroundColorSpan(ThemeUtils.getColor(mActivity, android.R.attr.textColorSecondary)),
|
||||
sb.length() - size.length(), sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
sb.setSpan(new AbsoluteSizeSpan(UiUtils.dimen(mActivity, R.dimen.text_size_body_3)), sb.length() - size.length(),
|
||||
sb.setSpan(new AbsoluteSizeSpan(Utils.dimen(mActivity, R.dimen.text_size_body_3)), sb.length() - size.length(),
|
||||
sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
|
||||
final String path = item.mPath + (item.mIsReadonly ? " (read-only)" : "");
|
||||
sb.append("\n").append(path);
|
||||
sb.setSpan(new ForegroundColorSpan(ThemeUtils.getColor(mActivity, android.R.attr.textColorSecondary)),
|
||||
sb.length() - path.length(), sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
sb.setSpan(new AbsoluteSizeSpan(UiUtils.dimen(mActivity, R.dimen.text_size_body_4)), sb.length() - path.length(),
|
||||
sb.setSpan(new AbsoluteSizeSpan(Utils.dimen(mActivity, R.dimen.text_size_body_4)), sb.length() - path.length(),
|
||||
sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
|
||||
checkedView.setText(sb);
|
||||
|
||||
@@ -26,7 +26,7 @@ import app.organicmaps.sdk.settings.SpeedCameraMode;
|
||||
import app.organicmaps.sdk.sound.LanguageData;
|
||||
import app.organicmaps.sdk.sound.TtsPlayer;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
|
||||
@@ -22,7 +22,6 @@ import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.bookmarks.data.BookmarkInfo;
|
||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
import app.organicmaps.sdk.util.StorageUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
@@ -8,7 +8,6 @@ import android.os.Build;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AppCompatDelegate;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.downloader.DownloaderStatusIcon;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.MapStyle;
|
||||
@@ -28,17 +27,23 @@ public enum ThemeSwitcher
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
boolean isNavAuto = RoutingController.get().isNavigating() && ThemeUtils.isNavAutoTheme(mContext);
|
||||
boolean navAuto = RoutingController.get().isNavigating() && ThemeUtils.isNavAutoTheme();
|
||||
// Cancel old checker
|
||||
UiThread.cancelDelayedTasks(mAutoThemeChecker);
|
||||
|
||||
if (isNavAuto || ThemeUtils.isAutoTheme(mContext))
|
||||
String theme;
|
||||
if (navAuto || ThemeUtils.isAutoTheme())
|
||||
{
|
||||
UiThread.runLater(mAutoThemeChecker, CHECK_INTERVAL_MS);
|
||||
setThemeAndMapStyle(calcAutoTheme());
|
||||
theme = calcAutoTheme();
|
||||
}
|
||||
else // Only reached when an auto mode should be light
|
||||
setThemeAndMapStyle(mContext.getResources().getString(R.string.theme_default));
|
||||
else
|
||||
{
|
||||
// Happens when exiting the Navigation mode. Should restore the light.
|
||||
theme = Config.UiTheme.DEFAULT;
|
||||
}
|
||||
|
||||
setThemeAndMapStyle(theme);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -64,8 +69,8 @@ public enum ThemeSwitcher
|
||||
public void restart(boolean isRendererActive)
|
||||
{
|
||||
mRendererActive = isRendererActive;
|
||||
String theme = Config.getUiThemeSettings(mContext);
|
||||
if (ThemeUtils.isAutoTheme(mContext, theme) || ThemeUtils.isNavAutoTheme(mContext, theme))
|
||||
String theme = Config.UiTheme.getUiThemeSettings();
|
||||
if (ThemeUtils.isAutoTheme() || ThemeUtils.isNavAutoTheme())
|
||||
{
|
||||
mAutoThemeChecker.run();
|
||||
return;
|
||||
@@ -78,10 +83,10 @@ public enum ThemeSwitcher
|
||||
private void setThemeAndMapStyle(@NonNull String theme)
|
||||
{
|
||||
UiModeManager uiModeManager = (UiModeManager) mContext.getSystemService(Context.UI_MODE_SERVICE);
|
||||
String oldTheme = Config.getCurrentUiTheme(mContext);
|
||||
String oldTheme = Config.UiTheme.getCurrent();
|
||||
|
||||
MapStyle style;
|
||||
if (ThemeUtils.isNightTheme(mContext, theme))
|
||||
if (ThemeUtils.isNightTheme())
|
||||
{
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
|
||||
uiModeManager.setApplicationNightMode(UiModeManager.MODE_NIGHT_YES);
|
||||
@@ -112,7 +117,7 @@ public enum ThemeSwitcher
|
||||
|
||||
if (!theme.equals(oldTheme))
|
||||
{
|
||||
Config.setCurrentUiTheme(mContext, theme);
|
||||
Config.UiTheme.setCurrent(theme);
|
||||
DownloaderStatusIcon.clearCache();
|
||||
|
||||
final Activity a = MwmApplication.from(mContext).getTopActivity();
|
||||
@@ -152,9 +157,7 @@ public enum ThemeSwitcher
|
||||
@NonNull
|
||||
private String calcAutoTheme()
|
||||
{
|
||||
String defaultTheme = mContext.getResources().getString(R.string.theme_default);
|
||||
String nightTheme = mContext.getResources().getString(R.string.theme_night);
|
||||
Location last = MwmApplication.from(mContext).getLocationHelper().getSavedLocation();
|
||||
final Location last = MwmApplication.from(mContext).getLocationHelper().getSavedLocation();
|
||||
boolean day;
|
||||
|
||||
if (last != null)
|
||||
@@ -168,6 +171,6 @@ public enum ThemeSwitcher
|
||||
day = (currentHour < 18 && currentHour > 6);
|
||||
}
|
||||
|
||||
return (day ? defaultTheme : nightTheme);
|
||||
return (day ? Config.UiTheme.DEFAULT : Config.UiTheme.NIGHT);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@ public final class ThemeUtils
|
||||
|
||||
private ThemeUtils() {}
|
||||
|
||||
public static @ColorInt int getColor(@NonNull Context context, @AttrRes int attr)
|
||||
@ColorInt
|
||||
public static int getColor(@NonNull Context context, @AttrRes int attr)
|
||||
{
|
||||
if (!context.getTheme().resolveAttribute(attr, VALUE_BUFFER, true))
|
||||
throw new IllegalArgumentException("Failed to resolve color theme attribute");
|
||||
@@ -44,76 +45,45 @@ public final class ThemeUtils
|
||||
return VALUE_BUFFER.resourceId;
|
||||
}
|
||||
|
||||
public static boolean isDefaultTheme(@NonNull Context context)
|
||||
public static boolean isDefaultTheme()
|
||||
{
|
||||
return isDefaultTheme(context, Config.getCurrentUiTheme(context));
|
||||
return Config.UiTheme.isDefault(Config.UiTheme.getCurrent());
|
||||
}
|
||||
|
||||
public static boolean isDefaultTheme(@NonNull Context context, String theme)
|
||||
public static boolean isNightTheme()
|
||||
{
|
||||
String defaultTheme = context.getString(R.string.theme_default);
|
||||
return defaultTheme.equals(theme);
|
||||
return Config.UiTheme.isNight(Config.UiTheme.getCurrent());
|
||||
}
|
||||
|
||||
public static boolean isNightTheme(@NonNull Context context)
|
||||
public static boolean isAutoTheme()
|
||||
{
|
||||
return isNightTheme(context, Config.getCurrentUiTheme(context));
|
||||
return Config.UiTheme.isAuto(Config.UiTheme.getUiThemeSettings());
|
||||
}
|
||||
|
||||
public static boolean isNightTheme(@NonNull Context context, String theme)
|
||||
public static boolean isNavAutoTheme()
|
||||
{
|
||||
String nightTheme = context.getString(R.string.theme_night);
|
||||
return nightTheme.equals(theme);
|
||||
}
|
||||
|
||||
public static boolean isAutoTheme(@NonNull Context context)
|
||||
{
|
||||
return isAutoTheme(context, Config.getUiThemeSettings(context));
|
||||
}
|
||||
|
||||
public static boolean isAutoTheme(@NonNull Context context, String theme)
|
||||
{
|
||||
String autoTheme = context.getString(R.string.theme_auto);
|
||||
return autoTheme.equals(theme);
|
||||
}
|
||||
|
||||
public static boolean isNavAutoTheme(@NonNull Context context)
|
||||
{
|
||||
return isNavAutoTheme(context, Config.getUiThemeSettings(context));
|
||||
}
|
||||
|
||||
public static boolean isNavAutoTheme(@NonNull Context context, String theme)
|
||||
{
|
||||
String navAutoTheme = context.getString(R.string.theme_nav_auto);
|
||||
return navAutoTheme.equals(theme);
|
||||
}
|
||||
|
||||
public static boolean isValidTheme(@NonNull Context context, String theme)
|
||||
{
|
||||
String defaultTheme = context.getString(R.string.theme_default);
|
||||
String nightTheme = context.getString(R.string.theme_night);
|
||||
return (defaultTheme.equals(theme) || nightTheme.equals(theme));
|
||||
return Config.UiTheme.isNavAuto(Config.UiTheme.getUiThemeSettings());
|
||||
}
|
||||
|
||||
@StyleRes
|
||||
public static int getCardBgThemeResourceId(@NonNull Context context, @NonNull String theme)
|
||||
public static int getCardBgThemeResourceId(@NonNull String theme)
|
||||
{
|
||||
if (isDefaultTheme(context, theme))
|
||||
if (Config.UiTheme.isDefault(theme))
|
||||
return R.style.MwmTheme_CardBg;
|
||||
|
||||
if (isNightTheme(context, theme))
|
||||
if (Config.UiTheme.isNight(theme))
|
||||
return R.style.MwmTheme_Night_CardBg;
|
||||
|
||||
throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme);
|
||||
}
|
||||
|
||||
@StyleRes
|
||||
public static int getWindowBgThemeResourceId(@NonNull Context context, @NonNull String theme)
|
||||
public static int getWindowBgThemeResourceId(@NonNull String theme)
|
||||
{
|
||||
if (isDefaultTheme(context, theme))
|
||||
if (Config.UiTheme.isDefault(theme))
|
||||
return R.style.MwmTheme_WindowBg;
|
||||
|
||||
if (isNightTheme(context, theme))
|
||||
if (Config.UiTheme.isNight(theme))
|
||||
return R.style.MwmTheme_Night_WindowBg;
|
||||
|
||||
throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.organicmaps.sdk.util;
|
||||
package app.organicmaps.util;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.app.Activity;
|
||||
@@ -16,13 +16,11 @@ import android.view.ViewGroup;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.annotation.AnyRes;
|
||||
import androidx.annotation.AttrRes;
|
||||
import androidx.annotation.ColorInt;
|
||||
import androidx.annotation.DimenRes;
|
||||
import androidx.annotation.IdRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.StringRes;
|
||||
@@ -34,8 +32,6 @@ import androidx.core.view.WindowInsetsCompat;
|
||||
import androidx.core.view.WindowInsetsControllerCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.WindowInsetUtils;
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
import java.util.Objects;
|
||||
@@ -203,16 +199,6 @@ public final class UiUtils
|
||||
ThemeUtils.getResource(toolbar.getContext(), androidx.appcompat.R.attr.homeAsUpIndicator));
|
||||
}
|
||||
|
||||
public static boolean isTablet(@NonNull Context context)
|
||||
{
|
||||
return context.getResources().getBoolean(R.bool.tabletLayout);
|
||||
}
|
||||
|
||||
public static int dimen(@NonNull Context context, @DimenRes int id)
|
||||
{
|
||||
return context.getResources().getDimensionPixelSize(id);
|
||||
}
|
||||
|
||||
// this method returns the total height of the display (in pixels) including notch and other touchable areas
|
||||
public static int getDisplayTotalHeight(Context context)
|
||||
{
|
||||
@@ -221,13 +207,6 @@ public final class UiUtils
|
||||
windowManager.getDefaultDisplay().getRealMetrics(metrics);
|
||||
return metrics.heightPixels;
|
||||
}
|
||||
|
||||
public static void updateRedButton(Button button)
|
||||
{
|
||||
button.setTextColor(ThemeUtils.getColor(
|
||||
button.getContext(), button.isEnabled() ? R.attr.redButtonTextColor : R.attr.redButtonTextColorDisabled));
|
||||
}
|
||||
|
||||
public static void setInputError(@NonNull TextInputLayout layout, @StringRes int error)
|
||||
{
|
||||
setInputError(layout, error == 0 ? null : layout.getContext().getString(error));
|
||||
@@ -1,5 +1,6 @@
|
||||
package app.organicmaps.util;
|
||||
|
||||
import static app.organicmaps.sdk.util.Utils.dimen;
|
||||
import static app.organicmaps.sdk.util.Utils.isIntentSupported;
|
||||
|
||||
import android.app.Activity;
|
||||
@@ -7,7 +8,6 @@ import android.content.ActivityNotFoundException;
|
||||
import android.content.ClipData;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
@@ -39,10 +39,10 @@ import app.organicmaps.BuildConfig;
|
||||
import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.Constants;
|
||||
import app.organicmaps.sdk.util.Distance;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import app.organicmaps.sdk.util.log.LogsManager;
|
||||
@@ -203,17 +203,33 @@ public class Utils
|
||||
if (TextUtils.isEmpty(url))
|
||||
return;
|
||||
|
||||
final Intent intent = new Intent(Intent.ACTION_VIEW);
|
||||
Uri uri =
|
||||
isHttpOrHttpsScheme(url) ? Uri.parse(url) : new Uri.Builder().scheme("http").appendEncodedPath(url).build();
|
||||
|
||||
Utils.openUri(context, uri, R.string.browser_not_available);
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to open a URI in another app via the system app chooser.
|
||||
* @param context the app context
|
||||
* @param uri the URI to open.
|
||||
* @param failMessage string id: message to show in a toast when the system can't find an app to open with.
|
||||
*/
|
||||
public static void openUri(@NonNull Context context, @NonNull Uri uri, @Nullable Integer failMessage)
|
||||
{
|
||||
final Intent intent = new Intent(Intent.ACTION_VIEW);
|
||||
intent.setData(uri);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
intent.addCategory(Intent.CATEGORY_BROWSABLE);
|
||||
|
||||
try
|
||||
{
|
||||
context.startActivity(intent);
|
||||
}
|
||||
catch (ActivityNotFoundException e)
|
||||
{
|
||||
Toast.makeText(context, context.getString(R.string.browser_not_available), Toast.LENGTH_LONG).show();
|
||||
if (failMessage != null)
|
||||
Toast.makeText(context, context.getString(failMessage), Toast.LENGTH_LONG).show();
|
||||
Logger.e(TAG, "ActivityNotFoundException", e);
|
||||
}
|
||||
catch (AndroidRuntimeException e)
|
||||
@@ -224,28 +240,6 @@ public class Utils
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to open a URI in another app via the system app chooser.
|
||||
* @param context the app context
|
||||
* @param uri the URI to open.
|
||||
* @param failMessage string id: message to show in a toast when the system can't find an app to open with.
|
||||
* @param action (optional) the Intent action to use. If none is provided, defaults to Intent.ACTION_VIEW.
|
||||
*/
|
||||
public static void openUri(@NonNull Context context, @NonNull Uri uri, Integer failMessage, @NonNull String... action)
|
||||
{
|
||||
final String act = (action != null && action.length > 0 && action[0] != null) ? action[0] : Intent.ACTION_VIEW;
|
||||
final Intent intent = new Intent(act);
|
||||
intent.setData(uri);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
|
||||
// https://developer.android.com/guide/components/intents-common
|
||||
// check that an app exists to open with, otherwise it'll crash
|
||||
if (intent.resolveActivity(context.getPackageManager()) != null)
|
||||
context.startActivity(intent);
|
||||
else
|
||||
Toast.makeText(context, failMessage, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
private static boolean isHttpOrHttpsScheme(@NonNull String url)
|
||||
{
|
||||
return url.startsWith("http://") || url.startsWith("https://");
|
||||
@@ -286,9 +280,9 @@ public class Utils
|
||||
String dimension, String unitText)
|
||||
{
|
||||
final SpannableStringBuilder res = new SpannableStringBuilder(dimension).append("\u00A0").append(unitText);
|
||||
res.setSpan(new AbsoluteSizeSpan(UiUtils.dimen(context, size), false), 0, dimension.length(),
|
||||
res.setSpan(new AbsoluteSizeSpan(dimen(context, size), false), 0, dimension.length(),
|
||||
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
res.setSpan(new AbsoluteSizeSpan(UiUtils.dimen(context, units), false), dimension.length(), res.length(),
|
||||
res.setSpan(new AbsoluteSizeSpan(dimen(context, units), false), dimension.length(), res.length(),
|
||||
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
return res;
|
||||
}
|
||||
@@ -297,9 +291,9 @@ public class Utils
|
||||
public static Spannable formatDistance(Context context, @NonNull Distance distance)
|
||||
{
|
||||
final SpannableStringBuilder res = new SpannableStringBuilder(distance.toString(context));
|
||||
res.setSpan(new AbsoluteSizeSpan(UiUtils.dimen(context, R.dimen.text_size_nav_number), false), 0,
|
||||
res.setSpan(new AbsoluteSizeSpan(dimen(context, R.dimen.text_size_nav_number), false), 0,
|
||||
distance.mDistanceStr.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
res.setSpan(new AbsoluteSizeSpan(UiUtils.dimen(context, R.dimen.text_size_nav_dimension), false),
|
||||
res.setSpan(new AbsoluteSizeSpan(dimen(context, R.dimen.text_size_nav_dimension), false),
|
||||
distance.mDistanceStr.length(), res.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
return res;
|
||||
}
|
||||
@@ -489,4 +483,15 @@ public class Utils
|
||||
final LocalTime time = LocalTime.now().plusSeconds(seconds);
|
||||
return StringUtils.formatUsingUsLocale("%d:%02d", time.getHour(), time.getMinute());
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static String getDonateUrl(@NonNull Context context)
|
||||
{
|
||||
final String url = Config.getDonateUrl();
|
||||
// Enable donations by default if not Google or Huawei. Replace comaps.app/donate/ with localized page.
|
||||
if ((url.isEmpty() && !BuildConfig.FLAVOR.equals("google") && !BuildConfig.FLAVOR.equals("huawei"))
|
||||
|| url.endsWith("comaps.app/donate/"))
|
||||
return context.getString(R.string.app_site_url) + "donate/";
|
||||
return url;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import androidx.core.graphics.Insets;
|
||||
import androidx.core.view.OnApplyWindowInsetsListener;
|
||||
import androidx.core.view.WindowInsetsCompat;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.Utils;
|
||||
|
||||
public final class WindowInsetUtils
|
||||
{
|
||||
@@ -79,7 +79,7 @@ public final class WindowInsetUtils
|
||||
|
||||
if (mFloatingActionButton != null)
|
||||
{
|
||||
int spacing = UiUtils.dimen(v.getContext(), R.dimen.margin_base);
|
||||
int spacing = Utils.dimen(v.getContext(), R.dimen.margin_base);
|
||||
int buttonMarginBottom = insets.bottom + spacing;
|
||||
|
||||
ViewGroup.MarginLayoutParams buttonLayoutParams =
|
||||
|
||||
@@ -15,7 +15,7 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior;
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialog;
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
|
||||
|
||||
@@ -14,7 +14,7 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
|
||||
public class PlaceholderView extends LinearLayout
|
||||
{
|
||||
|
||||
@@ -35,10 +35,9 @@ public class RoutingToolbarButton extends AppCompatRadioButton
|
||||
|
||||
private void initView()
|
||||
{
|
||||
setBackgroundResource(ThemeUtils.isNightTheme(getContext()) ? R.drawable.routing_toolbar_button_night
|
||||
: R.drawable.routing_toolbar_button);
|
||||
setButtonTintList(ThemeUtils.isNightTheme(getContext()) ? R.color.routing_toolbar_icon_tint_night
|
||||
: R.color.routing_toolbar_icon_tint);
|
||||
final boolean isNightTheme = ThemeUtils.isNightTheme();
|
||||
setBackgroundResource(isNightTheme ? R.drawable.routing_toolbar_button_night : R.drawable.routing_toolbar_button);
|
||||
setButtonTintList(isNightTheme ? R.color.routing_toolbar_icon_tint_night : R.color.routing_toolbar_icon_tint);
|
||||
}
|
||||
|
||||
public void progress()
|
||||
|
||||
@@ -16,8 +16,8 @@ import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.InputUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
|
||||
public class SearchToolbarController extends ToolbarController implements View.OnClickListener
|
||||
|
||||
@@ -13,6 +13,8 @@ import app.organicmaps.sdk.util.NetworkPolicy;
|
||||
|
||||
public class StackedButtonDialogFragment extends DialogFragment
|
||||
{
|
||||
private static final String TAG_NETWORK_POLICY = "network_policy";
|
||||
|
||||
@Nullable
|
||||
private NetworkPolicy.NetworkPolicyListener mListener;
|
||||
|
||||
@@ -43,7 +45,7 @@ public class StackedButtonDialogFragment extends DialogFragment
|
||||
{
|
||||
Config.setUseMobileDataSettings(type);
|
||||
if (mListener != null)
|
||||
mListener.onResult(NetworkPolicy.newInstance(canUse));
|
||||
mListener.onResult(new NetworkPolicy(canUse));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -58,4 +60,29 @@ public class StackedButtonDialogFragment extends DialogFragment
|
||||
{
|
||||
mListener = listener;
|
||||
}
|
||||
|
||||
public static void showDialogIfNeeded(@NonNull FragmentManager fragmentManager,
|
||||
@NonNull NetworkPolicy.NetworkPolicyListener listener,
|
||||
@NonNull NetworkPolicy policy, boolean isToday)
|
||||
{
|
||||
if (isToday)
|
||||
{
|
||||
listener.onResult(policy);
|
||||
return;
|
||||
}
|
||||
showDialog(fragmentManager, listener);
|
||||
}
|
||||
|
||||
public static void showDialog(@NonNull FragmentManager fragmentManager,
|
||||
@NonNull NetworkPolicy.NetworkPolicyListener listener)
|
||||
{
|
||||
StackedButtonDialogFragment dialog =
|
||||
(StackedButtonDialogFragment) fragmentManager.findFragmentByTag(TAG_NETWORK_POLICY);
|
||||
if (dialog != null)
|
||||
dialog.dismiss();
|
||||
|
||||
dialog = new StackedButtonDialogFragment();
|
||||
dialog.setListener(listener);
|
||||
dialog.show(fragmentManager, TAG_NETWORK_POLICY);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.appcompat.app.AppCompatDialog;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
|
||||
public class StackedButtonsDialog extends AppCompatDialog implements View.OnClickListener
|
||||
{
|
||||
|
||||
@@ -10,7 +10,7 @@ import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils;
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package app.organicmaps.widget.menu;
|
||||
|
||||
import android.view.View;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
|
||||
public class MainMenu
|
||||
{
|
||||
|
||||
@@ -18,8 +18,8 @@ import androidx.core.widget.ImageViewCompat;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.Map;
|
||||
import app.organicmaps.sdk.location.LocationState;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
|
||||
public class MyPositionButton
|
||||
|
||||
@@ -3,8 +3,6 @@ package app.organicmaps.widget.menu;
|
||||
import android.location.Location;
|
||||
import android.util.Pair;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.content.ContextCompat;
|
||||
@@ -13,10 +11,12 @@ import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.sound.TtsPlayer;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.progressindicator.LinearProgressIndicator;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
import java.time.LocalTime;
|
||||
@@ -29,7 +29,7 @@ public class NavMenu
|
||||
private final View mBottomSheetBackground;
|
||||
private final View mHeaderFrame;
|
||||
|
||||
private final ImageView mTts;
|
||||
private final ShapeableImageView mTts;
|
||||
private final View mSpeedViewContainer;
|
||||
private final MaterialTextView mSpeedValue;
|
||||
private final MaterialTextView mSpeedUnits;
|
||||
@@ -105,13 +105,12 @@ public class NavMenu
|
||||
mRouteProgress = bottomFrame.findViewById(R.id.navigation_progress);
|
||||
|
||||
// Bottom frame buttons
|
||||
ImageView mSettings = bottomFrame.findViewById(R.id.settings);
|
||||
ShapeableImageView mSettings = bottomFrame.findViewById(R.id.settings);
|
||||
mSettings.setOnClickListener(v -> onSettingsClicked());
|
||||
mTts = bottomFrame.findViewById(R.id.tts_volume);
|
||||
mTts.setOnClickListener(v -> onTtsClicked());
|
||||
Button stop = bottomFrame.findViewById(R.id.stop);
|
||||
MaterialButton stop = bottomFrame.findViewById(R.id.stop);
|
||||
stop.setOnClickListener(v -> onStopClicked());
|
||||
UiUtils.updateRedButton(stop);
|
||||
}
|
||||
|
||||
private void onStopClicked()
|
||||
@@ -231,7 +230,9 @@ public class NavMenu
|
||||
updateTime(info.totalTimeInSeconds);
|
||||
mDistanceValue.setText(info.distToTarget.mDistanceStr);
|
||||
mDistanceUnits.setText(info.distToTarget.getUnitsStr(mActivity.getApplicationContext()));
|
||||
mRouteProgress.setProgressCompat((int) info.completionPercent, true);
|
||||
// Start progress at 1% according to M3 guidelines
|
||||
final int completionPercent = (info.completionPercent < 1) ? 1 : (int) info.completionPercent;
|
||||
mRouteProgress.setProgressCompat(completionPercent, true);
|
||||
}
|
||||
|
||||
public interface NavMenuListener
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package app.organicmaps.widget.placepage;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import com.github.mikephil.charting.charts.BarLineChartBase;
|
||||
import com.github.mikephil.charting.formatter.DefaultValueFormatter;
|
||||
|
||||
@@ -20,6 +20,6 @@ public class AxisValueFormatter extends DefaultValueFormatter
|
||||
@Override
|
||||
public String getFormattedValue(float value)
|
||||
{
|
||||
return Framework.nativeFormatAltitude(value);
|
||||
return StringUtils.nativeFormatDistance(value).toString(mChart.getContext());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
import app.organicmaps.sdk.location.LocationListener;
|
||||
import app.organicmaps.sdk.location.SensorListener;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.widget.ArrowView;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
@@ -26,9 +26,9 @@ import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||
import app.organicmaps.sdk.bookmarks.data.Icon;
|
||||
import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
|
||||
import app.organicmaps.sdk.bookmarks.data.Track;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.InputUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
@@ -183,7 +183,8 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
||||
super.onStart();
|
||||
|
||||
// Focus name and show keyboard for "Unknown Place" bookmarks
|
||||
if (mBookmark != null && mBookmark.getName().equals(getString(R.string.core_placepage_unknown_place)))
|
||||
if (mBookmark != null
|
||||
&& mBookmark.getName().equals(getString(app.organicmaps.sdk.R.string.core_placepage_unknown_place)))
|
||||
{
|
||||
mEtName.requestFocus();
|
||||
mEtName.selectAll();
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package app.organicmaps.widget.placepage;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
@@ -12,18 +11,19 @@ import app.organicmaps.ChartController;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.bookmarks.data.ElevationInfo;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.widget.placepage.PlacePageData;
|
||||
import app.organicmaps.sdk.bookmarks.data.Track;
|
||||
import app.organicmaps.sdk.bookmarks.data.TrackStatistics;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import java.util.Objects;
|
||||
|
||||
@SuppressWarnings("unused") // https://github.com/organicmaps/organicmaps/issues/2829
|
||||
public class ElevationProfileViewRenderer implements PlacePageStateListener
|
||||
{
|
||||
// Must be correspond to map/elevation_info.hpp constants.
|
||||
private static final int MAX_DIFFICULTY_LEVEL = 3;
|
||||
private static final int UNKNOWN_DIFFICULTY = 0;
|
||||
|
||||
@NonNull
|
||||
private final View[] mDifficultyLevels = new View[MAX_DIFFICULTY_LEVEL];
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
private NestedScrollView mScrollView;
|
||||
@@ -45,8 +45,6 @@ public class ElevationProfileViewRenderer implements PlacePageStateListener
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
private TextView mTime;
|
||||
@NonNull
|
||||
private final View[] mDifficultyLevels = new View[MAX_DIFFICULTY_LEVEL];
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
private ChartController mChartController;
|
||||
@@ -58,22 +56,24 @@ public class ElevationProfileViewRenderer implements PlacePageStateListener
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
private View mTimeContainer;
|
||||
private View mTitleContainer;
|
||||
|
||||
public void render(@NonNull PlacePageData data)
|
||||
public void render(@NonNull Track track)
|
||||
{
|
||||
final Context context = mAscent.getContext();
|
||||
TrackStatistics stats = track.getTrackStatistics();
|
||||
|
||||
mElevationInfo = (ElevationInfo) data;
|
||||
mChartController.setData(mElevationInfo);
|
||||
mTitle.setText(mElevationInfo.getName());
|
||||
mElevationInfo = track.getElevationInfo();
|
||||
mChartController.setData(track);
|
||||
UiUtils.hide(mTitleContainer);
|
||||
mTitle.setText(track.getName());
|
||||
setDifficulty(mElevationInfo.getDifficulty());
|
||||
mAscent.setText(formatDistance(context, mElevationInfo.getAscent()));
|
||||
mDescent.setText(formatDistance(context, mElevationInfo.getDescent()));
|
||||
mMaxAltitude.setText(formatDistance(context, mElevationInfo.getMaxAltitude()));
|
||||
mMinAltitude.setText(formatDistance(context, mElevationInfo.getMinAltitude()));
|
||||
UiUtils.hideIf(mElevationInfo.getDuration() == 0, mTimeContainer);
|
||||
mTime.setText(
|
||||
Utils.formatRoutingTime(mTitle.getContext(), (int) mElevationInfo.getDuration(), R.dimen.text_size_body_2));
|
||||
mAscent.setText(formatDistance(context, (int) stats.getAscent()));
|
||||
mDescent.setText(formatDistance(context, (int) stats.getDescent()));
|
||||
mMaxAltitude.setText(formatDistance(context, stats.getMaxElevation()));
|
||||
mMinAltitude.setText(formatDistance(context, stats.getMinElevation()));
|
||||
UiUtils.hide(mTimeContainer);
|
||||
mTime.setText(Utils.formatRoutingTime(mAscent.getContext(), (int) stats.getDuration(), R.dimen.text_size_body_2));
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@@ -89,6 +89,7 @@ public class ElevationProfileViewRenderer implements PlacePageStateListener
|
||||
mChartController.initialize(view);
|
||||
mScrollView = (NestedScrollView) view;
|
||||
mTitle = view.findViewById(R.id.title);
|
||||
mTitleContainer = view.findViewById(R.id.title_container);
|
||||
mAscent = view.findViewById(R.id.ascent);
|
||||
mDescent = view.findViewById(R.id.descent);
|
||||
mMaxAltitude = view.findViewById(R.id.max_altitude);
|
||||
@@ -123,21 +124,13 @@ public class ElevationProfileViewRenderer implements PlacePageStateListener
|
||||
mDifficultyLevels[i].setEnabled(true);
|
||||
}
|
||||
|
||||
public void onSave(@NonNull Bundle outState)
|
||||
public void onChartElevationActivePointChanged()
|
||||
{
|
||||
// outState.putParcelable(PlacePageUtils.EXTRA_PLACE_PAGE_DATA, mElevationInfo);
|
||||
mChartController.onElevationActivePointChanged();
|
||||
}
|
||||
|
||||
public void onRestore(@NonNull Bundle inState)
|
||||
public void onChartCurrentPositionChanged()
|
||||
{
|
||||
// mElevationInfo = BundleCompat.getParcelable(inState, PlacePageUtils.EXTRA_PLACE_PAGE_DATA,
|
||||
// ElevationInfo.class); if (mElevationInfo != null)
|
||||
// render(mElevationInfo);
|
||||
}
|
||||
|
||||
public void onHide()
|
||||
{
|
||||
mScrollView.scrollTo(0, 0);
|
||||
mChartController.onHide();
|
||||
mChartController.onCurrentPositionChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,9 +37,6 @@ public class FloatingMarkerView extends RelativeLayout implements IMarker
|
||||
private TextView mAltitudeView;
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
private TextView mDistanceTextView;
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
private TextView mDistanceValueView;
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
@@ -93,7 +90,6 @@ public class FloatingMarkerView extends RelativeLayout implements IMarker
|
||||
mTextContentContainer = findViewById(R.id.floating_text_container);
|
||||
mFloatingTriangle = findViewById(R.id.floating_triangle);
|
||||
mImage = findViewById(R.id.image);
|
||||
mDistanceTextView = findViewById(R.id.distance_text);
|
||||
mAltitudeView = findViewById(R.id.altitude);
|
||||
mDistanceValueView = findViewById(R.id.distance_value);
|
||||
}
|
||||
@@ -125,7 +121,7 @@ public class FloatingMarkerView extends RelativeLayout implements IMarker
|
||||
public void updateOffsets(@NonNull Entry entry, @NonNull Highlight highlight)
|
||||
{
|
||||
updateVertical(entry);
|
||||
final float halfImg = Math.abs(mImage.getWidth()) / 2f;
|
||||
final float halfImg = mImage.getResources().getDimensionPixelSize(R.dimen.elevation_profile_marker_width) / 2f;
|
||||
boolean isLeftToRightDirection = isInvertedOrder(highlight);
|
||||
mOffset = isLeftToRightDirection ? -getWidth() + halfImg : -halfImg;
|
||||
updateHorizontal(highlight);
|
||||
@@ -184,7 +180,6 @@ public class FloatingMarkerView extends RelativeLayout implements IMarker
|
||||
|
||||
private void updatePointValues(@NonNull Entry entry)
|
||||
{
|
||||
mDistanceTextView.setText(R.string.elevation_profile_distance);
|
||||
mDistanceValueView.setText(
|
||||
StringUtils.nativeFormatDistance(entry.getX()).toString(mDistanceValueView.getContext()));
|
||||
mAltitudeView.setText(Framework.nativeFormatAltitude(entry.getY()));
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user