WIP: [android] Trace Path (a.k.a Recent Track Recorder) #8874
62 changed files with 1130 additions and 35 deletions
|
@ -42,7 +42,7 @@
|
|||
Services (FGS)) notifications from an app.
|
||||
//-->
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
|
||||
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
|
||||
<uses-permission android:name="androidx.car.app.NAVIGATION_TEMPLATES"/>
|
||||
<uses-permission android:name="androidx.car.app.ACCESS_SURFACE"/>
|
||||
|
||||
|
@ -451,6 +451,13 @@
|
|||
android:enabled="true"
|
||||
android:stopWithTask="false"/>
|
||||
|
||||
<service android:name=".location.TrackRecordingService"
|
||||
android:foregroundServiceType="location"
|
||||
android:exported="false"
|
||||
android:enabled="true"
|
||||
android:stopWithTask="false"
|
||||
/>
|
||||
|
||||
<provider
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="${FILE_PROVIDER_PLACEHOLDER}"
|
||||
|
|
|
@ -70,6 +70,8 @@ import app.organicmaps.location.LocationListener;
|
|||
import app.organicmaps.location.LocationState;
|
||||
import app.organicmaps.location.SensorHelper;
|
||||
import app.organicmaps.location.SensorListener;
|
||||
import app.organicmaps.location.TrackRecorder;
|
||||
import app.organicmaps.location.TrackRecordingService;
|
||||
import app.organicmaps.maplayer.MapButtonsController;
|
||||
import app.organicmaps.maplayer.MapButtonsViewModel;
|
||||
import app.organicmaps.maplayer.ToggleMapLayerFragment;
|
||||
|
@ -95,6 +97,7 @@ import app.organicmaps.settings.SettingsActivity;
|
|||
import app.organicmaps.settings.UnitLocale;
|
||||
import app.organicmaps.util.Config;
|
||||
import app.organicmaps.util.LocationUtils;
|
||||
import app.organicmaps.util.PowerManagment;
|
||||
import app.organicmaps.util.SharingUtils;
|
||||
import app.organicmaps.util.ThemeSwitcher;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
|
@ -119,6 +122,7 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
|||
import static app.organicmaps.location.LocationState.FOLLOW;
|
||||
import static app.organicmaps.location.LocationState.FOLLOW_AND_ROTATE;
|
||||
import static app.organicmaps.location.LocationState.LOCATION_TAG;
|
||||
import static app.organicmaps.util.PowerManagment.POWER_MANAGEMENT_TAG;
|
||||
|
||||
public class MwmActivity extends BaseMwmFragmentActivity
|
||||
implements PlacePageActivationListener,
|
||||
|
@ -157,6 +161,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
private static final String MAIN_MENU_ID = "MAIN_MENU_BOTTOM_SHEET";
|
||||
private static final String LAYERS_MENU_ID = "LAYERS_MENU_BOTTOM_SHEET";
|
||||
|
||||
private static final String POWER_SAVE_DISCLAIMER_SHOWN = "POWER_SAVE_DISCLAIMER_SHOWN";
|
||||
|
||||
@Nullable
|
||||
private MapFragment mMapFragment;
|
||||
|
||||
|
@ -208,8 +214,14 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||
@NonNull
|
||||
private ActivityResultLauncher<IntentSenderRequest> mLocationResolutionRequest;
|
||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||
@NonNull
|
||||
private ActivityResultLauncher<SharingUtils.SharingIntent> mShareLauncher;
|
||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||
@NonNull
|
||||
private ActivityResultLauncher<Intent> mPowerSaveSettings;
|
||||
@NonNull
|
||||
private PowerSaveDisclaimerState mPowerSaveDisclaimerState = PowerSaveDisclaimerState.WAS_NOT_SHOWN;
|
||||
|
||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||
@NonNull
|
||||
|
@ -218,6 +230,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
private boolean mRemoveDisplayListener = true;
|
||||
private int mLastUiMode = Configuration.UI_MODE_TYPE_UNDEFINED;
|
||||
|
||||
private boolean mTracePathLocationPermission = false;
|
||||
private boolean mTracePathNotificationPermission = false;
|
||||
|
||||
public interface LeftAnimationTrackListener
|
||||
{
|
||||
void onTrackStarted(boolean collapsed);
|
||||
|
@ -227,6 +242,14 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
void onTrackLeftAnimation(float offset);
|
||||
}
|
||||
|
||||
public enum PowerSaveDisclaimerState
|
||||
{
|
||||
WAS_NOT_SHOWN,
|
||||
SHOWING_FOR_NAVIGATION,
|
||||
SHOWING_FOR_RECORDING,
|
||||
SHOWN,
|
||||
}
|
||||
|
||||
public static Intent createShowMapIntent(@NonNull Context context, @Nullable String countryId)
|
||||
{
|
||||
return new Intent(context, DownloadResourcesLegacyActivity.class)
|
||||
|
@ -254,6 +277,12 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
else if (RoutingController.get().hasSavedRoute())
|
||||
RoutingController.get().restoreRoute();
|
||||
|
||||
// This is for the case when track recording was enabled but due to any reasons
|
||||
// App crashed so we need the restart or stop the whole service again properly
|
||||
// by checking all the necessary permissions
|
||||
if (TrackRecorder.nativeIsEnabled())
|
||||
startTrackRecording();
|
||||
|
||||
processIntent();
|
||||
migrateOAuthCredentials();
|
||||
}
|
||||
|
@ -518,6 +547,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
this::onLocationResolutionResult);
|
||||
mPostNotificationPermissionRequest = registerForActivityResult(new ActivityResultContracts.RequestPermission(),
|
||||
this::onPostNotificationPermissionResult);
|
||||
mPowerSaveSettings = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
|
||||
o -> onResumeAfterCheckingPowerSaveSettings());
|
||||
|
||||
mShareLauncher = SharingUtils.RegisterLauncher(this);
|
||||
|
||||
|
@ -968,6 +999,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
// orientation changing, etc. Otherwise, the saved route might be restored at undesirable moment.
|
||||
RoutingController.get().deleteSavedRoute();
|
||||
|
||||
outState.putBoolean(POWER_SAVE_DISCLAIMER_SHOWN,
|
||||
mPowerSaveDisclaimerState == PowerSaveDisclaimerState.SHOWN);
|
||||
super.onSaveInstanceState(outState);
|
||||
}
|
||||
|
||||
|
@ -991,6 +1024,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
|
||||
if (!mIsTabletLayout && RoutingController.get().isPlanning())
|
||||
mRoutingPlanInplaceController.restoreState(savedInstanceState);
|
||||
|
||||
if (savedInstanceState.getBoolean(POWER_SAVE_DISCLAIMER_SHOWN, false))
|
||||
mPowerSaveDisclaimerState = PowerSaveDisclaimerState.SHOWN;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1148,6 +1184,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
mLocationResolutionRequest = null;
|
||||
mPostNotificationPermissionRequest.unregister();
|
||||
mPostNotificationPermissionRequest = null;
|
||||
mPowerSaveSettings.unregister();
|
||||
mPowerSaveSettings = null;
|
||||
if (mRemoveDisplayListener && !isChangingConfigurations())
|
||||
mDisplayManager.removeListener(DisplayType.Device);
|
||||
}
|
||||
|
@ -1895,8 +1933,16 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
{
|
||||
if (LocationState.getMode() == LocationState.NOT_FOLLOW_NO_POSITION)
|
||||
LocationState.nativeSwitchToNextMode();
|
||||
|
||||
if (mTracePathLocationPermission && LocationUtils.checkFineLocationPermission(this))
|
||||
{
|
||||
mTracePathLocationPermission = false;
|
||||
startTrackRecording();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
mTracePathLocationPermission = false;
|
||||
|
||||
Logger.w(LOCATION_TAG, "Permissions ACCESS_COARSE_LOCATION and ACCESS_FINE_LOCATION have been refused");
|
||||
// Calls onMyPositionModeChanged(NOT_FOLLOW_NO_POSITION).
|
||||
|
@ -1929,6 +1975,25 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
Logger.w(TAG, "Permission POST_NOTIFICATIONS has been refused");
|
||||
}
|
||||
|
||||
private void onResumeAfterCheckingPowerSaveSettings()
|
||||
{
|
||||
final PowerSaveDisclaimerState state = mPowerSaveDisclaimerState;
|
||||
// Don't show the disclaimer until end of the current session.
|
||||
mPowerSaveDisclaimerState = PowerSaveDisclaimerState.SHOWN;
|
||||
switch (state)
|
||||
{
|
||||
case SHOWING_FOR_NAVIGATION -> {
|
||||
Logger.d(POWER_MANAGEMENT_TAG, "Resuming navigation");
|
||||
onRoutingStart();
|
||||
}
|
||||
case SHOWING_FOR_RECORDING -> {
|
||||
Logger.d(POWER_MANAGEMENT_TAG, "Resuming track recording");
|
||||
startTrackRecording();
|
||||
}
|
||||
case SHOWN, WAS_NOT_SHOWN -> Logger.w(POWER_MANAGEMENT_TAG, "Ignoring dangling callback");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by GoogleFusedLocationProvider to request to GPS and/or Wi-Fi.
|
||||
* @param pendingIntent an intent to launch.
|
||||
|
@ -2031,11 +2096,58 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
if (!showRoutingDisclaimer())
|
||||
return;
|
||||
|
||||
// Check for battery saver permission
|
||||
if (!requestBatterySaverPermission(PowerSaveDisclaimerState.SHOWING_FOR_NAVIGATION))
|
||||
return;
|
||||
|
||||
closeFloatingPanels();
|
||||
setFullscreen(false);
|
||||
RoutingController.get().start();
|
||||
}
|
||||
|
||||
public boolean requestBatterySaverPermission(@NonNull PowerSaveDisclaimerState requestedBy)
|
||||
{
|
||||
if (!PowerManagment.isSystemPowerSaveMode(this))
|
||||
{
|
||||
Logger.i(POWER_MANAGEMENT_TAG, "Power Save mode is disabled on the device");
|
||||
return true;
|
||||
}
|
||||
Logger.w(POWER_MANAGEMENT_TAG, "Power Save mode is enabled on the device");
|
||||
|
||||
if (mPowerSaveDisclaimerState != PowerSaveDisclaimerState.WAS_NOT_SHOWN)
|
||||
{
|
||||
Logger.i(POWER_MANAGEMENT_TAG, "The Power Save disclaimer has been already shown in this session");
|
||||
return true;
|
||||
}
|
||||
|
||||
final Intent intent = PowerManagment.makeSystemPowerSaveSettingIntent(this);
|
||||
if (intent == null)
|
||||
{
|
||||
Logger.w(POWER_MANAGEMENT_TAG, "No known way to launch the system Power Save settings");
|
||||
return true;
|
||||
}
|
||||
|
||||
dismissAlertDialog();
|
||||
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
||||
.setTitle(R.string.power_save_dialog_title)
|
||||
.setCancelable(false)
|
||||
.setMessage(R.string.power_save_dialog_summary)
|
||||
.setNegativeButton(R.string.not_now, (dialog, which) -> {
|
||||
Logger.d(POWER_MANAGEMENT_TAG, "The Power Save disclaimer was ignored");
|
||||
mPowerSaveDisclaimerState = requestedBy;
|
||||
onResumeAfterCheckingPowerSaveSettings();
|
||||
})
|
||||
.setOnDismissListener(dialog -> mAlertDialog = null)
|
||||
.setPositiveButton(R.string.settings, (dlg, which) -> {
|
||||
Logger.d(POWER_MANAGEMENT_TAG, "Launching the system Power Save settings");
|
||||
mPowerSaveDisclaimerState = requestedBy;
|
||||
mPowerSaveSettings.launch(intent);
|
||||
});
|
||||
Logger.d(POWER_MANAGEMENT_TAG, "Displaying the Power Save disclaimer");
|
||||
mAlertDialog = builder.show();
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBookmarksFileUnsupported(@NonNull Uri uri)
|
||||
{
|
||||
|
@ -2152,6 +2264,88 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
startActivity(intent);
|
||||
}
|
||||
|
||||
private boolean showTrackRecorderDisclaimer()
|
||||
{
|
||||
if (Config.isTrackRecordingDisclaimerAccepted())
|
||||
return true;
|
||||
|
||||
final StringBuilder builder = new StringBuilder();
|
||||
for (int resId : new int[]{ R.string.instruction_1, R.string.instruction_2, R.string.instruction_3, R.string.instruction_4, R.string.have_a_nice_day})
|
||||
builder.append(getString(resId)).append("\n\n");
|
||||
|
||||
dismissAlertDialog();
|
||||
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
||||
.setTitle(R.string.Alert_dialogue_title)
|
||||
.setMessage(builder.toString())
|
||||
.setCancelable(false)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setPositiveButton(R.string.ok, (dlg, which) -> {
|
||||
Config.acceptTrackRecordingDisclaimer();
|
||||
startTrackRecording();
|
||||
})
|
||||
.setOnDismissListener(dialog -> mAlertDialog = null)
|
||||
.show();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void startTrackRecording()
|
||||
{
|
||||
if (!LocationUtils.checkFineLocationPermission(this))
|
||||
{
|
||||
Logger.i(TAG, "Location permission not granted");
|
||||
// This variable is a simple hack to re initiate the flow
|
||||
// according to action of user. Calling it hack because we are avoiding
|
||||
// creation of new methods by using this variable.
|
||||
mTracePathLocationPermission = true;
|
||||
mLocationPermissionRequest.launch(new String[] { ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION });
|
||||
return;
|
||||
}
|
||||
|
||||
// Check for battery saver permission
|
||||
if (!requestBatterySaverPermission(PowerSaveDisclaimerState.SHOWING_FOR_RECORDING))
|
||||
return;
|
||||
|
||||
requestPostNotificationsPermission();
|
||||
|
||||
/*
|
||||
if (!mTracePathNotificationPermission &&
|
||||
Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
|
||||
ActivityCompat.checkSelfPermission(this, POST_NOTIFICATIONS) != PERMISSION_GRANTED)
|
||||
{
|
||||
Logger.i(TAG, "Permissions POST_NOTIFICATIONS is not granted");
|
||||
// This variable is a simple hack to re initiate the flow
|
||||
// according to action of user. Calling it hack because we are avoiding
|
||||
// creation of new methods by using this variable.
|
||||
mTracePathNotificationPermission = true;
|
||||
mPostNotificationPermissionRequest.launch(POST_NOTIFICATIONS);
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
if (!showTrackRecorderDisclaimer())
|
||||
return;
|
||||
|
||||
Toast.makeText(this, getString(R.string.trace_path_is_on), Toast.LENGTH_SHORT).show();
|
||||
TrackRecordingService.startForegroundService(getApplicationContext());
|
||||
mMapButtonsViewModel.setTrackRecorderState(true);
|
||||
}
|
||||
|
||||
private void stopTrackRecording()
|
||||
{
|
||||
Toast.makeText(this, getString(R.string.trace_path_is_off), Toast.LENGTH_SHORT).show();
|
||||
TrackRecordingService.stopService(getApplicationContext());
|
||||
mMapButtonsViewModel.setTrackRecorderState(false);
|
||||
}
|
||||
|
||||
private void onTrackRecordingOptionSelected()
|
||||
{
|
||||
if (TrackRecorder.nativeIsEnabled())
|
||||
stopTrackRecording();
|
||||
else
|
||||
startTrackRecording();
|
||||
}
|
||||
|
||||
public void onShareLocationOptionSelected()
|
||||
{
|
||||
closeFloatingPanels();
|
||||
|
@ -2176,6 +2370,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
if (!TextUtils.isEmpty(mDonatesUrl))
|
||||
items.add(new MenuBottomSheetItem(R.string.donate, R.drawable.ic_donate, this::onDonateOptionSelected));
|
||||
items.add(new MenuBottomSheetItem(R.string.settings, R.drawable.ic_settings, this::onSettingsOptionSelected));
|
||||
items.add(new MenuBottomSheetItem(R.string.trace_path, R.drawable.ic_trace_path_off, this::onTrackRecordingOptionSelected));
|
||||
items.add(new MenuBottomSheetItem(R.string.share_my_location, R.drawable.ic_share, this::onShareLocationOptionSelected));
|
||||
return items;
|
||||
}
|
||||
|
|
|
@ -29,6 +29,8 @@ import app.organicmaps.downloader.MapManager;
|
|||
import app.organicmaps.location.LocationHelper;
|
||||
import app.organicmaps.location.LocationState;
|
||||
import app.organicmaps.location.SensorHelper;
|
||||
import app.organicmaps.location.TrackRecorder;
|
||||
import app.organicmaps.location.TrackRecordingService;
|
||||
import app.organicmaps.maplayer.isolines.IsolinesManager;
|
||||
import app.organicmaps.maplayer.subway.SubwayManager;
|
||||
import app.organicmaps.maplayer.traffic.TrafficManager;
|
||||
|
@ -160,6 +162,7 @@ public class MwmApplication extends Application implements Application.ActivityL
|
|||
|
||||
DownloaderNotifier.createNotificationChannel(this);
|
||||
NavigationService.createNotificationChannel(this);
|
||||
TrackRecordingService.createNotificationChannel(this);
|
||||
|
||||
registerActivityLifecycleCallbacks(this);
|
||||
mSubwayManager = new SubwayManager(this);
|
||||
|
@ -351,7 +354,7 @@ public class MwmApplication extends Application implements Application.ActivityL
|
|||
|
||||
nativeOnTransit(true);
|
||||
|
||||
mLocationHelper.resumeLocationInForeground();
|
||||
mLocationHelper.onAppForeground();
|
||||
}
|
||||
|
||||
private void onBackground()
|
||||
|
@ -368,6 +371,8 @@ public class MwmApplication extends Application implements Application.ActivityL
|
|||
Logger.i(LOCATION_TAG, "Navigation is in progress, keeping location in the background");
|
||||
else if (!Map.isEngineCreated() || LocationState.getMode() == LocationState.PENDING_POSITION)
|
||||
Logger.i(LOCATION_TAG, "PENDING_POSITION mode, keeping location in the background");
|
||||
else if (TrackRecorder.nativeIsEnabled())
|
||||
Logger.i(LOCATION_TAG, "Recent Track Recorder is running in background");
|
||||
else
|
||||
{
|
||||
Logger.i(LOCATION_TAG, "Stopping location in the background");
|
||||
|
|
|
@ -37,6 +37,7 @@ public class LocationHelper implements BaseLocationProvider.Listener
|
|||
private static final long INTERVAL_FOLLOW_MS = 0;
|
||||
private static final long INTERVAL_NOT_FOLLOW_MS = 3000;
|
||||
private static final long INTERVAL_NAVIGATION_MS = 0;
|
||||
private static final long INTERVAL_TRACK_RECORDING = 0;
|
||||
|
||||
private static final long AGPS_EXPIRATION_TIME_MS = 16 * 60 * 60 * 1000; // 16 hours
|
||||
|
||||
|
@ -293,6 +294,9 @@ public class LocationHelper implements BaseLocationProvider.Listener
|
|||
if (RoutingController.get().isNavigating())
|
||||
return INTERVAL_NAVIGATION_MS;
|
||||
|
||||
if (TrackRecorder.nativeIsEnabled())
|
||||
return INTERVAL_TRACK_RECORDING;
|
||||
|
||||
final int mode = Map.isEngineCreated() ? LocationState.getMode() : LocationState.NOT_FOLLOW_NO_POSITION;
|
||||
return switch (mode)
|
||||
{
|
||||
|
@ -373,8 +377,9 @@ public class LocationHelper implements BaseLocationProvider.Listener
|
|||
/**
|
||||
* Resume location services when entering the foreground.
|
||||
*/
|
||||
public void resumeLocationInForeground()
|
||||
public void onAppForeground()
|
||||
{
|
||||
Logger.i(TAG, "Location helper knows app came in foreground");
|
||||
if (isActive())
|
||||
return;
|
||||
else if (!Map.isEngineCreated())
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
package app.organicmaps.location;
|
||||
|
||||
import app.organicmaps.util.Listeners;
|
||||
|
||||
public class TrackRecorder
|
||||
{
|
||||
public static native void nativeSetEnabled(boolean enable);
|
||||
public static native boolean nativeIsEnabled();
|
||||
public static native void nativeSetDuration(int hours);
|
||||
public static native int nativeGetDuration();
|
||||
}
|
|
@ -0,0 +1,249 @@
|
|||
package app.organicmaps.location;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.ForegroundServiceStartNotAllowedException;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.app.Service;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.location.Location;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.RequiresPermission;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import androidx.core.app.NotificationChannelCompat;
|
||||
import androidx.core.app.NotificationCompat;
|
||||
import androidx.core.app.NotificationManagerCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.LocationUtils;
|
||||
import app.organicmaps.util.log.Logger;
|
||||
|
||||
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
|
||||
import static android.Manifest.permission.POST_NOTIFICATIONS;
|
||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
|
||||
public class TrackRecordingService extends Service implements LocationListener
|
||||
{
|
||||
public static final String TRACK_REC_CHANNEL_ID = "TRACK RECORDING";
|
||||
public static final int TRACK_REC_NOTIFICATION_ID = 54321;
|
||||
private NotificationCompat.Builder mNotificationBuilder;
|
||||
private static final String TAG = TrackRecordingService.class.getSimpleName();
|
||||
private Handler mHandler;
|
||||
private Runnable mLocationTimeoutRunnable;
|
||||
private static final int LOCATION_UPDATE_TIMEOUT = 30000;
|
||||
private boolean mWarningNotification = false;
|
||||
private NotificationCompat.Builder mWarningBuilder;
|
||||
private PendingIntent mPendingIntent;
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public IBinder onBind(Intent intent)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@RequiresPermission(value = ACCESS_FINE_LOCATION)
|
||||
public static void startForegroundService(@NonNull Context context)
|
||||
{
|
||||
if (TrackRecorder.nativeGetDuration() != 24)
|
||||
TrackRecorder.nativeSetDuration(24);
|
||||
if (!TrackRecorder.nativeIsEnabled())
|
||||
TrackRecorder.nativeSetEnabled(true);
|
||||
LocationHelper.from(context).restartWithNewMode();
|
||||
ContextCompat.startForegroundService(context, new Intent(context, TrackRecordingService.class));
|
||||
}
|
||||
|
||||
public static void createNotificationChannel(@NonNull Context context)
|
||||
{
|
||||
final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
|
||||
final NotificationChannelCompat channel = new NotificationChannelCompat.Builder(TRACK_REC_CHANNEL_ID,
|
||||
NotificationManagerCompat.IMPORTANCE_LOW)
|
||||
.setName(context.getString(R.string.trace_path_name))
|
||||
.setLightsEnabled(false)
|
||||
.setVibrationEnabled(false)
|
||||
.build();
|
||||
notificationManager.createNotificationChannel(channel);
|
||||
}
|
||||
|
||||
private PendingIntent getPendingIntent(@NonNull Context context)
|
||||
{
|
||||
if (mPendingIntent != null)
|
||||
return mPendingIntent;
|
||||
|
||||
final int FLAG_IMMUTABLE = Build.VERSION.SDK_INT < Build.VERSION_CODES.M ? 0 : PendingIntent.FLAG_IMMUTABLE;
|
||||
final Intent contentIntent = new Intent(context, MwmActivity.class);
|
||||
mPendingIntent = PendingIntent.getActivity(context, 0, contentIntent,
|
||||
PendingIntent.FLAG_CANCEL_CURRENT | FLAG_IMMUTABLE);
|
||||
return mPendingIntent;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public NotificationCompat.Builder getNotificationBuilder(@NonNull Context context)
|
||||
{
|
||||
if (mNotificationBuilder != null)
|
||||
return mNotificationBuilder;
|
||||
|
||||
mNotificationBuilder = new NotificationCompat.Builder(context, TRACK_REC_CHANNEL_ID)
|
||||
.setCategory(NotificationCompat.CATEGORY_SERVICE)
|
||||
.setPriority(NotificationManager.IMPORTANCE_DEFAULT)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_SECRET)
|
||||
.setOngoing(true)
|
||||
.setShowWhen(true)
|
||||
.setOnlyAlertOnce(true)
|
||||
.setSmallIcon(R.drawable.ic_splash)
|
||||
.setContentTitle(context.getString(R.string.recent_track_recorder_running))
|
||||
.setContentText(context.getString(R.string.recent_track_rec_notif_desc))
|
||||
.setContentIntent(getPendingIntent(context))
|
||||
.setColor(ContextCompat.getColor(context, R.color.notification));
|
||||
|
||||
return mNotificationBuilder;
|
||||
}
|
||||
|
||||
public static void stopService(@NonNull Context context)
|
||||
{
|
||||
Logger.i(TAG);
|
||||
context.stopService(new Intent(context, TrackRecordingService.class));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy()
|
||||
{
|
||||
mNotificationBuilder = null;
|
||||
mWarningBuilder = null;
|
||||
if (TrackRecorder.nativeIsEnabled())
|
||||
TrackRecorder.nativeSetEnabled(false);
|
||||
mHandler.removeCallbacks(mLocationTimeoutRunnable);
|
||||
LocationHelper.from(this).removeListener(this);
|
||||
// The notification is cancelled automatically by the system.
|
||||
}
|
||||
|
||||
@Override
|
||||
public int onStartCommand(@NonNull Intent intent, int flags, int startId)
|
||||
{
|
||||
if (!MwmApplication.from(this).arePlatformAndCoreInitialized())
|
||||
{
|
||||
Logger.w(TAG, "Application is not initialized");
|
||||
stopSelf();
|
||||
return START_NOT_STICKY; // The service will be stopped by stopSelf().
|
||||
}
|
||||
|
||||
if (!LocationUtils.checkFineLocationPermission(this))
|
||||
{
|
||||
// In a hypothetical scenario, the user could revoke location permissions after the app's process crashed,
|
||||
// but before the service with START_STICKY was restarted by the system.
|
||||
Logger.w(TAG, "Permission ACCESS_FINE_LOCATION is not granted, skipping TrackRecordingService");
|
||||
stopSelf();
|
||||
return START_NOT_STICKY; // The service will be stopped by stopSelf().
|
||||
}
|
||||
|
||||
if (!TrackRecorder.nativeIsEnabled())
|
||||
{
|
||||
Logger.i(TAG, "Service can't be started because Track Recorder is turned off in settings");
|
||||
stopSelf();
|
||||
return START_NOT_STICKY;
|
||||
}
|
||||
|
||||
Logger.i(TAG, "Starting foreground service");
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
|
||||
{
|
||||
try
|
||||
{
|
||||
startForeground(TrackRecordingService.TRACK_REC_NOTIFICATION_ID, getNotificationBuilder(this).build());
|
||||
} catch (ForegroundServiceStartNotAllowedException e)
|
||||
{
|
||||
Logger.e(TAG, "Oops! ForegroundService is not allowed", e);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
startForeground(TrackRecordingService.TRACK_REC_NOTIFICATION_ID, getNotificationBuilder(this).build());
|
||||
}
|
||||
|
||||
final LocationHelper locationHelper = LocationHelper.from(this);
|
||||
|
||||
if (mHandler == null) mHandler = new Handler();
|
||||
if (mLocationTimeoutRunnable == null) mLocationTimeoutRunnable = this::onLocationUpdateTimeout;
|
||||
mHandler.postDelayed(mLocationTimeoutRunnable, LOCATION_UPDATE_TIMEOUT);
|
||||
|
||||
// Subscribe to location updates. This call is idempotent.
|
||||
locationHelper.addListener(this);
|
||||
|
||||
// Restart the location with more frequent refresh interval for Track Recording.
|
||||
locationHelper.restartWithNewMode();
|
||||
|
||||
return START_NOT_STICKY;
|
||||
}
|
||||
|
||||
public NotificationCompat.Builder getWarningBuilder(Context context)
|
||||
{
|
||||
if (mWarningBuilder != null)
|
||||
return mWarningBuilder;
|
||||
|
||||
mWarningBuilder = new NotificationCompat.Builder(context, TRACK_REC_CHANNEL_ID)
|
||||
.setCategory(NotificationCompat.CATEGORY_SERVICE)
|
||||
.setPriority(NotificationManager.IMPORTANCE_LOW)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
.setOngoing(true)
|
||||
.setShowWhen(true)
|
||||
.setOnlyAlertOnce(true)
|
||||
.setSmallIcon(R.drawable.warning_icon)
|
||||
.setContentTitle(context.getString(R.string.location_update_warning_title))
|
||||
.setContentText(context.getString(R.string.location_update_warning_desc))
|
||||
.setContentIntent(getPendingIntent(context))
|
||||
.setColor(ContextCompat.getColor(context, R.color.notification_warning));
|
||||
|
||||
return mWarningBuilder;
|
||||
}
|
||||
|
||||
private void onLocationUpdateTimeout()
|
||||
{
|
||||
Logger.i(TAG, "Location update timeout");
|
||||
mWarningNotification = true;
|
||||
// post notification permission is not there but we will not stop the runnable because if
|
||||
// in between user gives permission then warning will not be updated until next restart
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
|
||||
ActivityCompat.checkSelfPermission(this, POST_NOTIFICATIONS) != PERMISSION_GRANTED)
|
||||
return;
|
||||
|
||||
NotificationManagerCompat.from(this)
|
||||
.notify(TRACK_REC_NOTIFICATION_ID, getWarningBuilder(this).build());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLocationUpdated(@NonNull Location location)
|
||||
{
|
||||
Logger.i(TAG, "Location is being updated in Track Recording service");
|
||||
mHandler.removeCallbacks(mLocationTimeoutRunnable);
|
||||
mHandler.postDelayed(mLocationTimeoutRunnable, LOCATION_UPDATE_TIMEOUT); // Reset the timeout.
|
||||
|
||||
if (mWarningNotification)
|
||||
{
|
||||
mWarningNotification = false;
|
||||
|
||||
// post notification permission is not there but we will not stop the runnable because if
|
||||
// in between user gives permission then warning will not be updated until next restart
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
|
||||
ActivityCompat.checkSelfPermission(this, POST_NOTIFICATIONS) != PERMISSION_GRANTED)
|
||||
return;
|
||||
|
||||
NotificationManagerCompat.from(this)
|
||||
.notify(TRACK_REC_NOTIFICATION_ID, getNotificationBuilder(this).build());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLocationDisabled()
|
||||
{
|
||||
}
|
||||
|
||||
}
|
|
@ -25,14 +25,17 @@ import app.organicmaps.downloader.UpdateInfo;
|
|||
import app.organicmaps.maplayer.isolines.IsolinesManager;
|
||||
import app.organicmaps.maplayer.subway.SubwayManager;
|
||||
import app.organicmaps.maplayer.traffic.TrafficManager;
|
||||
import app.organicmaps.location.TrackRecorder;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.util.Config;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.log.Logger;
|
||||
import app.organicmaps.widget.menu.MyPositionButton;
|
||||
import app.organicmaps.widget.placepage.PlacePageViewModel;
|
||||
import com.google.android.material.badge.BadgeDrawable;
|
||||
import com.google.android.material.badge.BadgeUtils;
|
||||
import com.google.android.material.badge.ExperimentalBadgeUtils;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
@ -64,7 +67,7 @@ public class MapButtonsController extends Fragment
|
|||
private final Observer<Boolean> mButtonHiddenObserver = this::setButtonsHidden;
|
||||
private final Observer<Integer> mMyPositionModeObserver = this::updateNavMyPositionButton;
|
||||
private final Observer<SearchWheel.SearchOption> mSearchOptionObserver = this::onSearchOptionChange;
|
||||
|
||||
private final Observer<Boolean> mTrackRecorderObserver = this::updateMenuBadge;
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
|
@ -193,6 +196,31 @@ public class MapButtonsController extends Fragment
|
|||
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics());
|
||||
}
|
||||
|
||||
@OptIn(markerClass = ExperimentalBadgeUtils.class)
|
||||
private void updateMenuBadge(Boolean enable)
|
||||
{
|
||||
final View menuButton = mButtonsMap.get(MapButtons.menu);
|
||||
final Context context = getContext();
|
||||
final UpdateInfo info = MapManager.nativeGetUpdateInfo(null);
|
||||
final int count = (info == null ? 0 : info.filesCount);
|
||||
final int verticalOffset = dpToPx(8, context) + dpToPx(Integer.toString(0)
|
||||
.length() * 5, context);
|
||||
|
||||
Logger.d("kavi", "badge update called");
|
||||
Logger.d("kavi", "Track Recorder state is: " + TrackRecorder.nativeIsEnabled());
|
||||
if (count == 0)
|
||||
{
|
||||
BadgeUtils.detachBadgeDrawable(mBadgeDrawable, menuButton);
|
||||
mBadgeDrawable = BadgeDrawable.create(context);
|
||||
mBadgeDrawable.setMaxCharacterCount(0);
|
||||
mBadgeDrawable.setHorizontalOffset(verticalOffset);
|
||||
mBadgeDrawable.setVerticalOffset(dpToPx(9, context));
|
||||
mBadgeDrawable.setBackgroundColor(getResources().getColor(R.color.base_accent));
|
||||
mBadgeDrawable.setVisible(enable);
|
||||
BadgeUtils.attachBadgeDrawable(mBadgeDrawable, menuButton);
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(markerClass = com.google.android.material.badge.ExperimentalBadgeUtils.class)
|
||||
public void updateMenuBadge()
|
||||
{
|
||||
|
@ -203,7 +231,8 @@ public class MapButtonsController extends Fragment
|
|||
return;
|
||||
final UpdateInfo info = MapManager.nativeGetUpdateInfo(null);
|
||||
final int count = (info == null ? 0 : info.filesCount);
|
||||
final int verticalOffset = dpToPx(8, context) + dpToPx(Integer.toString(count).length() * 5, context);
|
||||
final int verticalOffset = dpToPx(8, context) + dpToPx(Integer.toString(0)
|
||||
.length() * 5, context);
|
||||
BadgeUtils.detachBadgeDrawable(mBadgeDrawable, menuButton);
|
||||
mBadgeDrawable = BadgeDrawable.create(context);
|
||||
mBadgeDrawable.setMaxCharacterCount(3);
|
||||
|
@ -212,6 +241,8 @@ public class MapButtonsController extends Fragment
|
|||
mBadgeDrawable.setNumber(count);
|
||||
mBadgeDrawable.setVisible(count > 0);
|
||||
BadgeUtils.attachBadgeDrawable(mBadgeDrawable, menuButton);
|
||||
|
||||
updateMenuBadge(TrackRecorder.nativeIsEnabled());
|
||||
}
|
||||
|
||||
public void updateLayerButton()
|
||||
|
@ -323,6 +354,7 @@ public class MapButtonsController extends Fragment
|
|||
mMapButtonsViewModel.getButtonsHidden().observe(activity, mButtonHiddenObserver);
|
||||
mMapButtonsViewModel.getMyPositionMode().observe(activity, mMyPositionModeObserver);
|
||||
mMapButtonsViewModel.getSearchOption().observe(activity, mSearchOptionObserver);
|
||||
mMapButtonsViewModel.getTrackRecorderState().observe(activity, mTrackRecorderObserver);
|
||||
}
|
||||
|
||||
public void onResume()
|
||||
|
|
|
@ -3,6 +3,7 @@ package app.organicmaps.maplayer;
|
|||
import androidx.annotation.Nullable;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
import app.organicmaps.location.TrackRecorder;
|
||||
|
||||
public class MapButtonsViewModel extends ViewModel
|
||||
{
|
||||
|
@ -11,6 +12,7 @@ public class MapButtonsViewModel extends ViewModel
|
|||
private final MutableLiveData<MapButtonsController.LayoutMode> mLayoutMode = new MutableLiveData<>(MapButtonsController.LayoutMode.regular);
|
||||
private final MutableLiveData<Integer> mMyPositionMode = new MutableLiveData<>();
|
||||
private final MutableLiveData<SearchWheel.SearchOption> mSearchOption = new MutableLiveData<>();
|
||||
private final MutableLiveData<Boolean> mTrackRecorderState = new MutableLiveData<>(TrackRecorder.nativeIsEnabled());
|
||||
|
||||
public MutableLiveData<Boolean> getButtonsHidden()
|
||||
{
|
||||
|
@ -61,4 +63,14 @@ public class MapButtonsViewModel extends ViewModel
|
|||
{
|
||||
mSearchOption.setValue(searchOption);
|
||||
}
|
||||
|
||||
public void setTrackRecorderState(boolean state)
|
||||
{
|
||||
mTrackRecorderState.setValue(state);
|
||||
}
|
||||
|
||||
public MutableLiveData<Boolean> getTrackRecorderState()
|
||||
{
|
||||
return mTrackRecorderState;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
|
|||
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
|
||||
import static android.Manifest.permission.POST_NOTIFICATIONS;
|
||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
import static app.organicmaps.util.Constants.Vendor.XIAOMI;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.ForegroundServiceStartNotAllowedException;
|
||||
|
@ -125,7 +126,7 @@ public class NavigationService extends Service implements LocationListener
|
|||
// Nice colorized notifications should be supported on API=26 and later.
|
||||
// Nonetheless, even on API=32, Xiaomi uses their own legacy implementation that displays white-on-white instead.
|
||||
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O &&
|
||||
!"xiaomi".equalsIgnoreCase(Build.MANUFACTURER);
|
||||
!XIAOMI.equalsIgnoreCase(Build.MANUFACTURER);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
|
|
|
@ -6,7 +6,6 @@ import android.os.Build;
|
|||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.preference.PreferenceManager;
|
||||
|
||||
import app.organicmaps.BuildConfig;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
|
@ -57,6 +56,8 @@ public final class Config
|
|||
*/
|
||||
private static final String KEY_MISC_FIRST_START_DIALOG_SEEN = "FirstStartDialogSeen";
|
||||
|
||||
private static final String KEY_MISC_TRACK_RECORDING_DISCLAIMER_ACCEPTED = "TrackRecorderDisclaimerAccepted";
|
||||
|
||||
private Config() {}
|
||||
|
||||
private static int getInt(String key, int def)
|
||||
|
@ -206,6 +207,16 @@ public final class Config
|
|||
setBool(KEY_MISC_DISCLAIMER_ACCEPTED);
|
||||
}
|
||||
|
||||
public static boolean isTrackRecordingDisclaimerAccepted()
|
||||
{
|
||||
return getBool(KEY_MISC_TRACK_RECORDING_DISCLAIMER_ACCEPTED);
|
||||
}
|
||||
|
||||
public static void acceptTrackRecordingDisclaimer()
|
||||
{
|
||||
setBool(KEY_MISC_TRACK_RECORDING_DISCLAIMER_ACCEPTED);
|
||||
}
|
||||
|
||||
public static boolean isKayakDisclaimerAccepted()
|
||||
{
|
||||
return getBool(KEY_MISC_KAYAK_ACCEPTED);
|
||||
|
|
|
@ -51,5 +51,11 @@ public final class Constants
|
|||
private Package() {}
|
||||
}
|
||||
|
||||
public static class Vendor
|
||||
{
|
||||
public static final String HUAWEI = "HUAWEI";
|
||||
public static final String XIAOMI = "XIAOMI";
|
||||
}
|
||||
|
||||
private Constants() {}
|
||||
}
|
||||
|
|
|
@ -1,14 +1,28 @@
|
|||
package app.organicmaps.util;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.os.PowerManager;
|
||||
import android.provider.Settings;
|
||||
|
||||
import androidx.annotation.IntDef;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import app.organicmaps.Framework;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
import static app.organicmaps.util.Constants.Vendor.HUAWEI;
|
||||
import static app.organicmaps.util.Constants.Vendor.XIAOMI;
|
||||
|
||||
public final class PowerManagment
|
||||
{
|
||||
public static final String POWER_MANAGEMENT_TAG = PowerManagment.class.getName();
|
||||
|
||||
// It should consider to power_managment::Scheme from
|
||||
// map/power_management/power_management_schemas.hpp
|
||||
public static final int NONE = 0;
|
||||
|
@ -33,4 +47,54 @@ public final class PowerManagment
|
|||
{
|
||||
Framework.nativeSetPowerManagerScheme(value);
|
||||
}
|
||||
|
||||
public static boolean isSystemPowerSaveMode(@NonNull Context context)
|
||||
{
|
||||
if (XIAOMI.equalsIgnoreCase(Build.MANUFACTURER))
|
||||
{
|
||||
final String XIAOMI_SETTING_NAME = "POWER_SAVE_MODE_OPEN";
|
||||
final int XIAOMI_SETTING_VALUE = 1;
|
||||
return Settings.System.getInt(context.getContentResolver(), XIAOMI_SETTING_NAME, -1)
|
||||
== XIAOMI_SETTING_VALUE;
|
||||
}
|
||||
else if (HUAWEI.equalsIgnoreCase(Build.MANUFACTURER))
|
||||
{
|
||||
final String HUAWEI_SETTING_NAME = "SmartModeStatus";
|
||||
final int HUAWEI_SETTING_VALUE = 4;
|
||||
return Settings.System.getInt(context.getContentResolver(), HUAWEI_SETTING_NAME, -1)
|
||||
== HUAWEI_SETTING_VALUE;
|
||||
}
|
||||
|
||||
final PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
|
||||
if (pm == null)
|
||||
return false;
|
||||
|
||||
// Huawei and Xiaomi always returns false here.
|
||||
return pm.isPowerSaveMode();
|
||||
}
|
||||
|
||||
public static @Nullable Intent makeSystemPowerSaveSettingIntent(@NonNull Context context)
|
||||
{
|
||||
if (XIAOMI.equalsIgnoreCase(Build.MANUFACTURER))
|
||||
{
|
||||
final Intent intent = new Intent();
|
||||
intent.setComponent(new ComponentName("com.miui.securitycenter",
|
||||
"com.miui.powercenter.PowerMainActivity"));
|
||||
if (Utils.isIntentSupported(context, intent))
|
||||
return intent;
|
||||
}
|
||||
else if (HUAWEI.equalsIgnoreCase(Build.MANUFACTURER))
|
||||
{
|
||||
final Intent intent = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY);
|
||||
if (Utils.isIntentSupported(context, intent))
|
||||
return intent;
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
|
||||
{
|
||||
final Intent intent = new Intent(Settings.ACTION_BATTERY_SAVER_SETTINGS);
|
||||
if (Utils.isIntentSupported(context, intent))
|
||||
return intent;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
|
|||
import android.app.Activity;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.ClipData;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
|
@ -14,6 +15,7 @@ import android.content.res.Resources;
|
|||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.provider.Settings;
|
||||
import android.text.Html;
|
||||
import android.text.Spannable;
|
||||
import android.text.SpannableStringBuilder;
|
||||
|
@ -33,14 +35,12 @@ import androidx.annotation.DimenRes;
|
|||
import androidx.annotation.Keep;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.core.app.NavUtils;
|
||||
import androidx.core.os.BundleCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
|
||||
import app.organicmaps.BuildConfig;
|
||||
import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.MwmApplication;
|
||||
|
@ -48,6 +48,7 @@ import app.organicmaps.R;
|
|||
import app.organicmaps.util.concurrency.UiThread;
|
||||
import app.organicmaps.util.log.Logger;
|
||||
import app.organicmaps.util.log.LogsManager;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
|
@ -170,6 +171,43 @@ public class Utils
|
|||
return null;
|
||||
}
|
||||
|
||||
@SuppressLint("BatteryLife")
|
||||
@RequiresApi(api = Build.VERSION_CODES.M)
|
||||
public static @Nullable Intent makeAppBatteryOptimizationIntent(@NonNull Context context)
|
||||
{
|
||||
Intent intent = new Intent();
|
||||
intent.setData(Uri.parse("package:" + context.getPackageName()));
|
||||
intent.setAction(android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
|
||||
if(isIntentSupported(context, intent))
|
||||
return intent;
|
||||
intent.setAction(android.provider.Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
|
||||
if(isIntentSupported(context, intent))
|
||||
return intent;
|
||||
intent.setAction(android.provider.Settings.ACTION_BATTERY_SAVER_SETTINGS);
|
||||
if(isIntentSupported(context,intent))
|
||||
return intent;
|
||||
return null;
|
||||
}
|
||||
|
||||
public static @Nullable Intent makePowerSaverSettingIntent(@NonNull Context context)
|
||||
{
|
||||
Intent intent = new Intent();
|
||||
intent.setData(Uri.parse("package:" + context.getPackageName()));
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
|
||||
{
|
||||
intent.setAction(Settings.ACTION_BATTERY_SAVER_SETTINGS);
|
||||
if (isIntentSupported(context, intent))
|
||||
return intent;
|
||||
}
|
||||
if (Build.MANUFACTURER.equalsIgnoreCase("xiaomi"))
|
||||
{
|
||||
intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.powercenter.PowerMainActivity"));
|
||||
if (isIntentSupported(context, intent))
|
||||
return intent;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void checkNotNull(Object object)
|
||||
{
|
||||
if (null == object) throw new NullPointerException("Argument here must not be NULL");
|
||||
|
|
|
@ -12,6 +12,7 @@ import androidx.annotation.Nullable;
|
|||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.location.TrackRecorder;
|
||||
import app.organicmaps.util.Config;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
@ -56,6 +57,11 @@ public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.ViewHolder>
|
|||
}
|
||||
else
|
||||
iv.setImageResource(item.iconRes);
|
||||
if(item.iconRes == R.drawable.ic_trace_path_off && TrackRecorder.nativeIsEnabled())
|
||||
{
|
||||
iv.setImageResource(R.drawable.ic_trace_path_on);
|
||||
iv.setImageTintMode(null);
|
||||
}
|
||||
viewHolder.getContainer().setOnClickListener((v) -> onMenuItemClick(item));
|
||||
viewHolder.getTitleTextView().setText(item.titleRes);
|
||||
TextView badge = viewHolder.getBadgeTextView();
|
||||
|
|
49
android/app/src/main/res/drawable/ic_trace_path_off.xml
Normal file
49
android/app/src/main/res/drawable/ic_trace_path_off.xml
Normal file
|
@ -0,0 +1,49 @@
|
|||
<vector
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="74dp"
|
||||
android:height="57dp"
|
||||
android:viewportWidth="74"
|
||||
android:viewportHeight="57">
|
||||
<path
|
||||
android:pathData="m67.3,21.772 l-28.103,11.757 11.772,5.095 5.463,11.606z"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="2"
|
||||
android:fillColor="#757575"
|
||||
android:strokeColor="#757575" />
|
||||
<path
|
||||
android:pathData="M45.042,44.7m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M37.942,51.6m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M27.842,52m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="m26.942,43.5c0,2.485 -2.015,4.5 -4.5,4.5 -2.485,0 -4.5,-2.015 -4.5,-4.5 0,-2.485 2.015,-4.5 4.5,-4.5 2.485,0 4.5,2.015 4.5,4.5z"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M26.642,34.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M34.042,27.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M40.842,20.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M41.842,10.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M32.842,4.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M23.842,9.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M16.842,16.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M9.842,23.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
</vector>
|
53
android/app/src/main/res/drawable/ic_trace_path_on.xml
Normal file
53
android/app/src/main/res/drawable/ic_trace_path_on.xml
Normal file
|
@ -0,0 +1,53 @@
|
|||
<vector
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="89dp"
|
||||
android:height="80dp"
|
||||
android:viewportWidth="89"
|
||||
android:viewportHeight="80">
|
||||
<path
|
||||
android:pathData="m4.858,10.076c0,-5.523 4.477,-10 10,-10h60c5.523,0 10,4.477 10,10v60c0,5.523 -4.477,10 -10,10h-60c-5.523,0 -10,-4.477 -10,-10z"
|
||||
android:fillColor="#0057ff"
|
||||
android:fillAlpha="0.78" />
|
||||
<path
|
||||
android:pathData="m78.907,32.87 l-31.833,13.318 13.335,5.772 6.188,13.147z"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="2"
|
||||
android:fillColor="#ffffff"
|
||||
android:strokeColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M49.731,57.709a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M41.688,65.525a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M30.247,65.978a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="m34.324,56.35c0,2.815 -2.282,5.097 -5.097,5.097 -2.815,0 -5.097,-2.282 -5.097,-5.097 0,-2.815 2.282,-5.097 5.097,-5.097 2.815,0 5.097,2.282 5.097,5.097z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M28.888,46.155a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M37.27,38.226a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M44.974,30.297a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M46.106,18.969a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M35.911,12.173a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M25.718,17.837a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M17.788,25.766a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M9.858,33.695a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
</vector>
|
12
android/app/src/main/res/drawable/warning_icon.xml
Normal file
12
android/app/src/main/res/drawable/warning_icon.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<vector
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="800dp"
|
||||
android:height="800dp"
|
||||
android:viewportWidth="554.2"
|
||||
android:viewportHeight="554.2">
|
||||
<path
|
||||
android:strokeWidth="1"
|
||||
android:pathData="M538.5,386.2L356.5,70.8c-16.4,-28.4 -46.7,-45.9 -79.5,-45.9c-32.8,0 -63.1,17.5 -79.5,45.9L12.3,391.6c-16.4,28.4 -16.4,63.4 0,91.8C28.7,511.8 59,529.3 91.8,529.3H462.2c0.1,0 0.2,0 0.2,0c50.7,0 91.8,-41.1 91.8,-91.8C554.2,418.5 548.4,400.8 538.5,386.2zM316.3,416.9c0,21.7 -16.7,38.3 -39.2,38.3s-39.2,-16.6 -39.2,-38.3V416c0,-21.6 16.7,-38.3 39.2,-38.3S316.3,394.3 316.3,416V416.9zM317.2,158.7L297.8,328.1c-1.3,12.2 -9.4,19.8 -20.7,19.8s-19.4,-7.7 -20.7,-19.8L237,158.6c-1.3,-13.1 5.8,-23 18,-23H299.1C311.3,135.7 318.5,145.6 317.2,158.7z"
|
||||
android:fillColor="#ffffff"
|
||||
android:strokeColor="#ffffff" />
|
||||
</vector>
|
|
@ -394,6 +394,7 @@
|
|||
<string name="dialog_routing_system_error">خطأ في النظام</string>
|
||||
<string name="dialog_routing_application_error">تعذر إنشاء مسار نتيجة وجود خطأ في التطبيق.</string>
|
||||
<string name="dialog_routing_try_again">الرجاء إعادة المحاولة</string>
|
||||
<string name="not_now">ليس الآن</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">هل ترغب في تنزيل الخريطة وإنشاء مسار أفضل يمتد عبر أكثر من خريطة؟</string>
|
||||
<string name="dialog_routing_download_cross_route">تنزيل خرائط إضافية لإنشاء مسار أفضل يعبر حافة هذه الخريطة.</string>
|
||||
|
||||
|
@ -839,6 +840,10 @@
|
|||
<string name="select_option">حدد الخيار</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">مقاعد خارجية</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">إيقاف تشغيل وضع توفير الطاقة</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">للحصول على التنقل الأكثر دقة، نوصي بتعطيل وضع توفير الطاقة في إعدادات بطارية الهاتف.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">العنوان / البلوك</string>
|
||||
|
|
|
@ -381,6 +381,7 @@
|
|||
<string name="dialog_routing_system_error">Sistem xətası</string>
|
||||
<string name="dialog_routing_application_error">Tətbiq xətası səbəbindən marşrut yaratmaq mümkün olmadı.</string>
|
||||
<string name="dialog_routing_try_again">Zəhmət olmasa bir daha cəhd edin</string>
|
||||
<string name="not_now">İndi yox</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Xəritəni endirmək və çoxsaylı xəritələr arasında daha rahat marşrut yaratmaq istərdinizmi?</string>
|
||||
<string name="dialog_routing_download_cross_route">Bu xəritənin sərhədlərini keçən daha rahat marşrut yaratmaq üçün xəritəni endirin.</string>
|
||||
|
||||
|
@ -808,6 +809,10 @@
|
|||
<string name="select_option">Seçim seçin</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Çöldə oturma</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Enerjiyə qənaət rejimini söndürün</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Ən dəqiq naviqasiya üçün telefonun batareya parametrlərində enerjiyə qənaət rejimini söndürməyi tövsiyə edirik.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Ünvan/Blok</string>
|
||||
|
|
|
@ -380,6 +380,7 @@
|
|||
<string name="dialog_routing_system_error">Памылка сістэмы</string>
|
||||
<string name="dialog_routing_application_error">Не ўдалося пракласці маршрут з-за памылкі праграмы.</string>
|
||||
<string name="dialog_routing_try_again">Паспрабуйце зноў</string>
|
||||
<string name="not_now">Не зараз</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Спампаваць мапу і пракласці лепшы маршрут праз некалькі мап?</string>
|
||||
<string name="dialog_routing_download_cross_route">Спампаваць дадатковыя мапы, каб пракласці лепшы маршрут, які перасякае межы гэтай мапы.</string>
|
||||
|
||||
|
@ -819,6 +820,10 @@
|
|||
<string name="select_option">Выберыце варыянт</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Месцы на адкрытым паветры</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Выключыць рэжым энергазберажэння</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Для найбольш дакладнай навігацыі рэкамендуем адключыць рэжым энергазберажэння ў наладах батарэі тэлефона.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Адрас/Блок</string>
|
||||
|
|
|
@ -352,6 +352,7 @@
|
|||
<string name="dialog_routing_system_error">Грешка в системата</string>
|
||||
<string name="dialog_routing_application_error">Не е възможно да се създаде маршрут поради грешка в приложението.</string>
|
||||
<string name="dialog_routing_try_again">Моля, опитайте отново</string>
|
||||
<string name="not_now">Не сега</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Бихте ли искали да изтеглите картата и да създадете по-оптимален маршрут, обхващащ повече от една карта?</string>
|
||||
<string name="dialog_routing_download_cross_route">За да създадете по-добър маршрут с граничен преход, трябва да изтеглите картата.</string>
|
||||
|
||||
|
@ -743,6 +744,10 @@
|
|||
<string name="select_option">Изберете опция</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Места за сядане на открито</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Изключване на режима за пестене на енергия</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">За най-точна навигация препоръчваме да деактивирате режима за пестене на енергия в настройките на батерията на телефона.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Адрес/Блок</string>
|
||||
|
|
|
@ -381,6 +381,7 @@
|
|||
<string name="dialog_routing_system_error">Error de sistema</string>
|
||||
<string name="dialog_routing_application_error">No s\'ha pogut crear la ruta a causa d\'un error de l\'aplicació.</string>
|
||||
<string name="dialog_routing_try_again">Torneu-ho a intentar</string>
|
||||
<string name="not_now">Ara no</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Voleu baixar el mapa i crar una ruta més òptima que travessi més d\'un mapa?</string>
|
||||
<string name="dialog_routing_download_cross_route">Baixeu mapes addicionals per a crear una ruta millor que creua els límits d\'aquest mapa.</string>
|
||||
|
||||
|
@ -830,6 +831,10 @@
|
|||
<string name="select_option">Seleccioneu l\'opció</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Seients a l\'aire lliure</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Desactiva el mode d\'estalvi d\'energia</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Per a una navegació més precisa, recomanem desactivar el mode d\'estalvi d\'energia a la configuració de la bateria del telèfon.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Adreça/Bloc</string>
|
||||
|
|
|
@ -366,6 +366,7 @@
|
|||
<string name="dialog_routing_system_error">Systémová chyba</string>
|
||||
<string name="dialog_routing_application_error">Trasu se nepodařilo vytvořit z důvodu chyby aplikace.</string>
|
||||
<string name="dialog_routing_try_again">Prosím, zkuste to znovu</string>
|
||||
<string name="not_now">Nyní ne</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Chcete mapu stáhnout a vytvořit optimálnější trasu, která vede přes více než jednu mapu?</string>
|
||||
<string name="dialog_routing_download_cross_route">Stáhnout mapu a vytvořit optimálnější trasu, která překračuje hranice této mapy.</string>
|
||||
|
||||
|
@ -792,6 +793,10 @@
|
|||
<string name="select_option">Vyberte možnost</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Venkovní posezení</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Vypnout režim úspory energie</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Pro co nejpřesnější navigaci doporučujeme vypnout úsporný režim v nastavení baterie telefonu.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Adresa/blok</string>
|
||||
|
|
|
@ -362,6 +362,7 @@
|
|||
<string name="dialog_routing_system_error">Systemfejl</string>
|
||||
<string name="dialog_routing_application_error">Det lykkedes ikke at planlægge en rute. Der opstod en fejl i systemet.</string>
|
||||
<string name="dialog_routing_try_again">Prøv igen</string>
|
||||
<string name="not_now">Ikke nu</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Ønsker du at downloade kortet og planlægge en mere optimal rute, der strækker sig over mere end ét kort?</string>
|
||||
<string name="dialog_routing_download_cross_route">Download kortet for at planlægge en mere optimal rute, der strækker sig ud over dette korts grænser.</string>
|
||||
|
||||
|
@ -782,6 +783,10 @@
|
|||
<string name="select_option">Vælg mulighed</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Udendørs siddepladser</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Sluk for strømsparetilstand</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">For at få den mest nøjagtige navigation anbefaler vi at deaktivere strømbesparende tilstand i telefonens batteriindstillinger.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Adresse/blok</string>
|
||||
|
|
|
@ -379,6 +379,7 @@
|
|||
<string name="dialog_routing_system_error">Systemfehler</string>
|
||||
<string name="dialog_routing_application_error">Route kann wegen eines Anwendungsfehlers nicht erstellt werden.</string>
|
||||
<string name="dialog_routing_try_again">Bitte versuchen Sie es erneut</string>
|
||||
<string name="not_now">Nicht jetzt</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Möchten Sie die Karte herunterladen und eine bessere Route erstellen, die mehr als eine Karte umfasst?</string>
|
||||
<string name="dialog_routing_download_cross_route">Laden Sie zusätzliche Karten herunter, um eine bessere Route zu erstellen, die die Grenzen dieser Karte überschreitet.</string>
|
||||
|
||||
|
@ -828,6 +829,10 @@
|
|||
<string name="select_option">Option auswählen</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Sitzplätze im Freien</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Energiesparmodus deaktivieren</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Für eine möglichst genaue Navigation empfehlen wir, den Energiesparmodus in den Akku-Einstellungen des Telefons zu deaktivieren.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Adresse/Block</string>
|
||||
|
|
|
@ -382,6 +382,7 @@
|
|||
<string name="dialog_routing_system_error">Σφάλμα συστήματος</string>
|
||||
<string name="dialog_routing_application_error">Δεν είναι δυνατή η δημιουργία διαδρομής λόγω σφάλματος της εφαρμογής.</string>
|
||||
<string name="dialog_routing_try_again">Προσπαθήστε ξανά</string>
|
||||
<string name="not_now">Όχι τώρα</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Θέλετε να κατεβάσετε το χάρτη και να δημιουργήσετε μια πιο βέλτιστη διαδρομή που εκτείνεται σε περισσότερους από έναν χάρτες;</string>
|
||||
<string name="dialog_routing_download_cross_route">Κατεβάστε επιπλέον χάρτες για να δημιουργηθεί μια καλύτερη διαδρομή που διασχίζει τα όρια αυτού του χάρτη.</string>
|
||||
|
||||
|
@ -825,6 +826,10 @@
|
|||
<string name="select_option">Επιλέξτε επιλογή</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Εξωτερικά καθίσματα</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Απενεργοποίηση λειτουργίας εξοικονόμησης ενέργειας</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Για την πιο ακριβή πλοήγηση, συνιστούμε να απενεργοποιήσετε τη λειτουργία εξοικονόμησης ενέργειας στις ρυθμίσεις μπαταρίας του τηλεφώνου.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Διεύθυνση/Μπλοκ</string>
|
||||
|
|
|
@ -381,6 +381,7 @@
|
|||
<string name="dialog_routing_system_error">Error del sistema</string>
|
||||
<string name="dialog_routing_application_error">No se pudo crear la ruta debido a un error en la aplicación.</string>
|
||||
<string name="dialog_routing_try_again">Intentar nuevamente</string>
|
||||
<string name="not_now">No ahora</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">¿Desea descargar el mapa y crear una ruta mejor que abarque más de un mapa?</string>
|
||||
<string name="dialog_routing_download_cross_route">Descargue mapas adicionales para crear una ruta mejor que cruce los límites de este mapa.</string>
|
||||
|
||||
|
@ -832,6 +833,10 @@
|
|||
<string name="select_option">Selecciona la opción</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Asientos al aire libre</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Desactivar el modo de ahorro de energía</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Para una navegación más precisa, te recomendamos que desactives el modo de ahorro de energía en los ajustes de la batería del teléfono.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Dirección/Bloque</string>
|
||||
|
|
|
@ -373,6 +373,7 @@
|
|||
<string name="dialog_routing_system_error">Süsteemi viga</string>
|
||||
<string name="dialog_routing_application_error">Marsruuti ei saa koostada rakenduse vea tõttu.</string>
|
||||
<string name="dialog_routing_try_again">Palun proovi uuesti</string>
|
||||
<string name="not_now">Mitte praegu</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Kas sooviksid kaardi alla laadida ja luua optimaalsema rohkem kui ühte kaarti hõlmava marsruudi?</string>
|
||||
<string name="dialog_routing_download_cross_route">Lae alla täiendavad kaardid, et luua parem, selle kaardi piire ületav marsruut.</string>
|
||||
|
||||
|
@ -818,6 +819,10 @@
|
|||
<string name="select_option">Valige valik</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Istekohad õues</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Lülita välja energiasäästurežiim</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Kõige täpsema navigeerimise tagamiseks soovitame telefoni aku seadetes energiasäästurežiimi välja lülitada.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Aadress/plokk</string>
|
||||
|
|
|
@ -381,6 +381,7 @@
|
|||
<string name="dialog_routing_system_error">Sistemaren errorea</string>
|
||||
<string name="dialog_routing_application_error">Ibilbidea ezin izan da sortu aplikazioaren errore baten ondorioz.</string>
|
||||
<string name="dialog_routing_try_again">Saiatu berriro</string>
|
||||
<string name="not_now">Orain ez</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Mapa deskargatu eta mapa bat baino gehiago hartzen duen ibilbide hobe bat sortu nahi duzu?</string>
|
||||
<string name="dialog_routing_download_cross_route">Deskargatu mapa osagarriak mapa honen mugak gainditzen dituen ibilbide hobea sortzeko.</string>
|
||||
|
||||
|
@ -826,6 +827,10 @@
|
|||
<string name="select_option">Hautatu aukera</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Kanpoko eserlekuak</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Desaktibatu energia aurrezteko modua</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Nabigazio zehatzena lortzeko, telefonoaren bateriaren ezarpenetan energia aurrezteko modua desgaitzea gomendatzen dugu.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Helbidea/Blokea</string>
|
||||
|
|
|
@ -355,6 +355,7 @@
|
|||
<string name="dialog_routing_system_error">خطای سیستم</string>
|
||||
<string name="dialog_routing_application_error">ناتوان در ایجاد مسیر به علت خطای برنامه.</string>
|
||||
<string name="dialog_routing_try_again">لطفا دوباره تلاش کنید</string>
|
||||
<string name="not_now">اکنون خیر</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">ایا مایل به دانلود نقشه و ایجاد مسیرهای بهینه بیشتری که نقشههای بیشتری را پوشش میدهد هستید؟</string>
|
||||
<string name="dialog_routing_download_cross_route">دانلود نقشههای اضافی برای ایجاد مسیری بهتر که حاشیههای این نقشه را رد می کند.</string>
|
||||
|
||||
|
@ -782,6 +783,10 @@
|
|||
<string name="select_option">گزینه را انتخاب کنید</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">نشستن در فضای باز</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">خاموش کردن حالت صرفهجویی در مصرف انرژی</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">برای دقیقu200cترین ناوبری، توصیه میu200cکنیم حالت صرفهu200cجویی در مصرف انرژی را در تنظیمات باتری گوشی غیرفعال کنید.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">آدرس/بلاک</string>
|
||||
|
|
|
@ -383,6 +383,7 @@
|
|||
<string name="dialog_routing_system_error">Järjestelmävirhe</string>
|
||||
<string name="dialog_routing_application_error">Reittiä ei voi luoda sovellusvirheen vuoksi.</string>
|
||||
<string name="dialog_routing_try_again">Yritä uudelleen</string>
|
||||
<string name="not_now">Ei nyt</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Haluatko ladata kartan ja luoda paremman reitin, joka ulottuu usealle kartalle?</string>
|
||||
<string name="dialog_routing_download_cross_route">Lataa kartta ja luo parempi reitti, joka ylittää tämän kartan reunan.</string>
|
||||
|
||||
|
@ -829,6 +830,10 @@
|
|||
<string name="select_option">Valitse vaihtoehto</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Ulkona istuminen</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Poista virransäästötila käytöstä</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Jotta navigointi olisi mahdollisimman tarkkaa, suosittelemme virransäästötilan poistamista käytöstä puhelimen akkuasetuksista.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Osoite/lohko</string>
|
||||
|
|
|
@ -384,6 +384,7 @@
|
|||
<string name="dialog_routing_system_error">Erreur système</string>
|
||||
<string name="dialog_routing_application_error">Impossible de créer l\'itinéraire à cause d\'une erreur dans l\'application.</string>
|
||||
<string name="dialog_routing_try_again">Veuillez réessayer</string>
|
||||
<string name="not_now">Pas maintenant</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Voulez-vous télécharger la carte et créer un itinéraire plus direct s\'étendant sur plus d\'une carte?</string>
|
||||
<string name="dialog_routing_download_cross_route">Téléchargez des cartes pour créer un itinéraire plus direct sortant des limites de cette carte.</string>
|
||||
|
||||
|
@ -834,6 +835,10 @@
|
|||
<string name="select_option">Sélectionner une option</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Places en terrasse</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Désactiver le mode économie d\'énergie</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Pour une navigation plus précise, nous te recommandons de désactiver le mode d\'économie d\'énergie dans les paramètres de la batterie du téléphone.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Adresse/Bloc</string>
|
||||
|
|
|
@ -562,6 +562,10 @@
|
|||
<string name="select_option">विकल्प चुनें</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">घर के बाहर बैठने</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">पावर सेविंग मोड बंद करें</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">सबसे सटीक नेविगेशन के लिए, हम फ़ोन की बैटरी सेटिंग्स में पावर सेविंग मोड को अक्षम करने की सलाह देते हैं।</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.aerialway.cable_car">आकाशीय रज्जुमार्ग</string>
|
||||
|
|
|
@ -376,6 +376,7 @@
|
|||
<string name="dialog_routing_system_error">Rendszerhiba</string>
|
||||
<string name="dialog_routing_application_error">Egy alkalmazáshiba miatt nem sikerült az útvonal létrehozása.</string>
|
||||
<string name="dialog_routing_try_again">Kérjük, próbálja újra</string>
|
||||
<string name="not_now">Most nem</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Szeretné letölteni a térképet és létrehozni egy optimálisabb útvonalat, amely több, mint egy térképen terül el?</string>
|
||||
<string name="dialog_routing_download_cross_route">Töltse le a térképet, hogy létrehozzon egy optimálisabb útvonalat, amely áthalad a jelenlegi térkép szélén.</string>
|
||||
|
||||
|
@ -388,10 +389,10 @@
|
|||
<string name="hide">Elrejt</string>
|
||||
<string name="categories">Kategóriák</string>
|
||||
<string name="history">Előzmények</string>
|
||||
<string name="search_not_found">Sajnos, semmit nem találtam.</string>
|
||||
<string name="search_not_found_query">Próbáljon másik lekérdezést.</string>
|
||||
<string name="search_not_found">Sajnos, semmit sem találtunk.</string>
|
||||
<string name="search_not_found_query">Próbáljon másik kifejezést.</string>
|
||||
<string name="search_history_title">Keresési előzmények</string>
|
||||
<string name="search_history_text">Aktuális keresés gyors elérése.</string>
|
||||
<string name="search_history_text">Legutóbbi keresések gyors elérése.</string>
|
||||
<string name="clear_search">A keresési előzmények törlése</string>
|
||||
<string name="p2p_your_location">Az Ön helyzete</string>
|
||||
<string name="p2p_start">Indítás</string>
|
||||
|
@ -799,6 +800,10 @@
|
|||
<string name="select_option">Válassza ki a lehetőséget</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Kültéri ülőhelyek</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Kapcsolja ki az energiatakarékos módot</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">A legpontosabb navigáció érdekében javasoljuk az energiatakarékos üzemmód kikapcsolását a telefon akkumulátor-beállításaiban.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Cím/blokk</string>
|
||||
|
|
|
@ -364,6 +364,7 @@
|
|||
<string name="dialog_routing_system_error">Kesalahan sistem</string>
|
||||
<string name="dialog_routing_application_error">Tidak dapat membuat rute karena kesalahan aplikasi.</string>
|
||||
<string name="dialog_routing_try_again">Mohon coba lagi</string>
|
||||
<string name="not_now">Jangan Sekarang</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Apakah Anda ingin mengunduh peta dan membuat rute yang lebih optimal yang meliputi lebih dari satu peta?</string>
|
||||
<string name="dialog_routing_download_cross_route">Unduh peta untuk membuat rute yang lebih optimal yang melewati ujung peta ini.</string>
|
||||
|
||||
|
@ -783,6 +784,10 @@
|
|||
<string name="select_option">Pilih opsi</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Tempat duduk di luar ruangan</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Matikan Mode Hemat Daya</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Untuk navigasi yang paling akurat, kami sarankan untuk menonaktifkan mode hemat daya dalam pengaturan baterai ponsel.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Alamat/Blokir</string>
|
||||
|
|
|
@ -367,6 +367,7 @@
|
|||
<string name="dialog_routing_system_error">Errore di sistema</string>
|
||||
<string name="dialog_routing_application_error">Impossibile creare il percorso a causa di un errore dell\'applicazione.</string>
|
||||
<string name="dialog_routing_try_again">Riprova</string>
|
||||
<string name="not_now">Non ora</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Vuoi scaricare la mappa e creare un percorso migliore che si estende su più mappe?</string>
|
||||
<string name="dialog_routing_download_cross_route">Scarica altre mappe per creare un percorso migliore che attraversi i confini di questa mappa.</string>
|
||||
|
||||
|
@ -812,6 +813,10 @@
|
|||
<string name="select_option">Seleziona l\'opzione</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Posti a sedere all\'aperto</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Disattiva la modalità di risparmio energetico</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Per una navigazione più accurata, ti consigliamo di disabilitare la modalità di risparmio energetico nelle impostazioni della batteria del telefono.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Indirizzo/Blocco</string>
|
||||
|
|
|
@ -373,6 +373,7 @@
|
|||
<string name="dialog_routing_system_error">שגיאת מערכת</string>
|
||||
<string name="dialog_routing_application_error">לא ניתן ליצור מסלול עקב שגיאת אפליקציה.</string>
|
||||
<string name="dialog_routing_try_again">נסה שוב</string>
|
||||
<string name="not_now">לא עכשיו</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">האם ברצונך להוריד את המפה וליצור מסלול מיטבי יותר, הכולל יותר מאשר מפה אחת?</string>
|
||||
<string name="dialog_routing_download_cross_route">הורד מפות נוספות כדי ליצור מסלול יותר טוב שחוצה את גבולות המפה הזו.</string>
|
||||
|
||||
|
@ -818,6 +819,10 @@
|
|||
<string name="select_option">בחר אפשרות</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">ישיבה בחוץ</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">כבה מצב חיסכון באנרגיה</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">לניווט המדויק ביותר, אנו ממליצים להשבית את מצב חיסכון בחשמל בהגדרות הסוללה של הטלפון.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">כתובת/חסימה</string>
|
||||
|
|
|
@ -381,6 +381,7 @@
|
|||
<string name="dialog_routing_system_error">システムエラー</string>
|
||||
<string name="dialog_routing_application_error">エラーにより案内ルートを作成できませんでした。</string>
|
||||
<string name="dialog_routing_try_again">もう一度お試しください</string>
|
||||
<string name="not_now">後で</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">マップをダウンロードし、複数マップを利用してより最適なルートを作成しますか?</string>
|
||||
<string name="dialog_routing_download_cross_route">このマップの境界を越えて複数マップを利用し、より最適なルートを作成するには、マップをダウンロードしてください。</string>
|
||||
|
||||
|
@ -828,6 +829,10 @@
|
|||
<string name="select_option">オプションを選択する</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">屋外席</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">省電力モードをオフにする</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">最も正確なナビゲーションのためには、携帯電話のバッテリー設定で省電力モードを無効にすることをお勧めする。</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">アドレス/ブロック</string>
|
||||
|
|
|
@ -362,6 +362,7 @@
|
|||
<string name="dialog_routing_system_error">시스템 오류</string>
|
||||
<string name="dialog_routing_application_error">애플리케이션 오류로 인해 경로를 설정하지 못했습니다.</string>
|
||||
<string name="dialog_routing_try_again">다시 시도해주세요.</string>
|
||||
<string name="not_now">나중에</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">지도를 다운로드하여, 두 개 이상의 지도를 통과하는 더 최적화된 경로를 설정하시겠습니까?</string>
|
||||
<string name="dialog_routing_download_cross_route">이 지도의 경계를 통과하는 더 최적화된 경로를 설정하려면 지도를 다운로드하세요.</string>
|
||||
|
||||
|
@ -780,6 +781,10 @@
|
|||
<string name="select_option">옵션 선택</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">야외 좌석</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">절전 모드 해제</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">가장 정확한 내비게이션을 위해 휴대폰의 배터리 설정에서 절전 모드를 비활성화하는 것이 좋습니다.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">주소/블록</string>
|
||||
|
|
|
@ -351,6 +351,7 @@
|
|||
<string name="dialog_routing_system_error">सिस्टम त्रुटी</string>
|
||||
<string name="dialog_routing_application_error">ऍप त्रुटीमुळे मार्ग तयार करण्यात अक्षम.</string>
|
||||
<string name="dialog_routing_try_again">कृपया पुर्नरप्रयत्न करा</string>
|
||||
<string name="not_now">आता नाही</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">एकापेक्षा जास्त नकाशात पसरलेला अधिक चांगला मार्ग तयार करण्यासाठी, नकाशा डाउनलोड केलेला चालेल का?</string>
|
||||
<string name="dialog_routing_download_cross_route">या नकाशाच्या सीमा ओलांडणारा एक चांगला मार्ग तयार करण्यासाठी अधिक नकाशे डाउनलोड करा.</string>
|
||||
|
||||
|
@ -790,6 +791,10 @@
|
|||
<string name="select_option">पर्याय निवडा nb = Velg alternativ</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">बाहेरची आसनव्यवस्था nb = Uteservering</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">पॉवर सेव्हिंग मोड बंद करा</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">सर्वात अचूक नेव्हिगेशनसाठी, आम्ही फोनच्या बॅटरी सेटिंग्जमध्ये पॉवर सेव्हिंग मोड अक्षम करण्याची शिफारस करतो.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">पत्ता/ब्लॉक</string>
|
||||
|
|
|
@ -383,6 +383,7 @@
|
|||
<string name="dialog_routing_system_error">Systemfeil</string>
|
||||
<string name="dialog_routing_application_error">En applikasjonsfeil førte til at ruten ikke kunne opprettes.</string>
|
||||
<string name="dialog_routing_try_again">Vennligst prøv igjen</string>
|
||||
<string name="not_now">Ikke nå</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Vil du laste ned kartet og lage en mer optimal rute som går over flere kart?</string>
|
||||
<string name="dialog_routing_download_cross_route">Last ned kartet for å opprette en mer optimal rute som går utenfor dette kartet.</string>
|
||||
|
||||
|
@ -820,6 +821,10 @@
|
|||
<string name="website_menu">Lenke til menyen</string>
|
||||
<!-- Button in the Place Page which opens a restaurant or other food place's menu in a browser -->
|
||||
<string name="view_menu">Vis meny</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Slå av strømsparingsmodus</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">For å få mest mulig nøyaktig navigering anbefaler vi at du deaktiverer strømsparingsmodus i telefonens batteriinnstillinger.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Adresse/blokk</string>
|
||||
|
|
|
@ -379,6 +379,7 @@
|
|||
<string name="dialog_routing_system_error">Systeemfout</string>
|
||||
<string name="dialog_routing_application_error">Route samenstellen mislukt door een applicatiefout.</string>
|
||||
<string name="dialog_routing_try_again">Probeer het opnieuw</string>
|
||||
<string name="not_now">Niet nu</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Wilt u de kaart downloaden en een betere route samenstellen die meer dan één kaart beslaat?</string>
|
||||
<string name="dialog_routing_download_cross_route">Download de kaart om een betere route samen te stellen die de grenzen van deze kaart overschrijdt.</string>
|
||||
|
||||
|
@ -825,6 +826,10 @@
|
|||
<string name="select_option">Selecteer optie</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Zitplaatsen buiten</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Schakel energiebesparingsmodus uit</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Voor de meest nauwkeurige navigatie raden we aan om de energiebesparende modus uit te schakelen in de batterij-instellingen van de telefoon.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Adres/blok</string>
|
||||
|
|
|
@ -381,6 +381,7 @@
|
|||
<string name="dialog_routing_system_error">Błąd systemowy</string>
|
||||
<string name="dialog_routing_application_error">Nie można wyznaczyć trasy z powodu błędu aplikacji.</string>
|
||||
<string name="dialog_routing_try_again">Spróbuj ponownie</string>
|
||||
<string name="not_now">Nie teraz</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Chcesz pobrać mapę i wyznaczyć lepszą trasę, obejmującą więcej map?</string>
|
||||
<string name="dialog_routing_download_cross_route">Pobierz mapę i wyznacz lepszą trasę, wykraczającą poza granice bieżącej mapy.</string>
|
||||
|
||||
|
@ -832,6 +833,10 @@
|
|||
<string name="select_option">Wybierz opcję</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Siedzenia na zewnątrz</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Wyłącz tryb oszczędzania energii</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Aby uzyskać najbardziej dokładną nawigację, zalecamy wyłączenie trybu oszczędzania energii w ustawieniach baterii telefonu.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Adres/Blok</string>
|
||||
|
|
|
@ -358,6 +358,7 @@
|
|||
<string name="dialog_routing_system_error">Erro de sistema</string>
|
||||
<string name="dialog_routing_application_error">Não foi possível traçar uma rota devido a um erro no aplicativo.</string>
|
||||
<string name="dialog_routing_try_again">Por favor, tente novamente</string>
|
||||
<string name="not_now">Agora não</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Deseja baixar o mapa e traçar uma rota melhor, mas que se estenda por mais de um mapa?</string>
|
||||
<string name="dialog_routing_download_cross_route">Baixe o mapa para traçar uma rota melhor que vai além dos limites desse mapa.</string>
|
||||
|
||||
|
@ -754,6 +755,10 @@
|
|||
<!-- To indicate if the place proposed self service... -->
|
||||
<string name="self_service">Autoatendimento</string>
|
||||
<string name="select_option">Selecionar opção</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Desativar o modo de economia de energia</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Para obter uma navegação mais precisa, recomendamos que você desative o modo de economia de energia nas configurações de bateria do telefone.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Endereço/Bloco</string>
|
||||
|
|
|
@ -367,6 +367,7 @@
|
|||
<string name="dialog_routing_system_error">Erro de sistema</string>
|
||||
<string name="dialog_routing_application_error">Não foi possível criar uma rota devido a um erro na aplicação.</string>
|
||||
<string name="dialog_routing_try_again">Tente novamente</string>
|
||||
<string name="not_now">Agora não</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Quer descarregar o mapa e traçar uma rota melhor, mas que se estenda por mais de um mapa?</string>
|
||||
<string name="dialog_routing_download_cross_route">Descarregue o mapa para traçar uma rota melhor que vai além dos limites deste mapa.</string>
|
||||
|
||||
|
@ -793,6 +794,10 @@
|
|||
<string name="select_option">Selecionar opção</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Assentos ao ar livre</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Desativar o modo de economia de energia</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Para uma navegação mais precisa, recomendamos que desactive o modo de poupança de energia nas definições da bateria do telemóvel.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Morada/Bloco</string>
|
||||
|
|
|
@ -367,6 +367,7 @@
|
|||
<string name="dialog_routing_system_error">Eroare de sistem</string>
|
||||
<string name="dialog_routing_application_error">Crearea traseului a eșuat din cauza unei erori a aplicației.</string>
|
||||
<string name="dialog_routing_try_again">Încearcă din nou</string>
|
||||
<string name="not_now">Nu acum</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Vrei să descarci harta și să creezi un traseu mai bun care include mai multe hărți?</string>
|
||||
<string name="dialog_routing_download_cross_route">Descarcă hărți suplimentare pentru a crea un traseu mai bun care să traverseze limitele acestei hărți.</string>
|
||||
|
||||
|
@ -807,6 +808,10 @@
|
|||
<string name="select_option">Selectați opțiunea</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Scaune în aer liber</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Dezactivați modul de economisire a energiei</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Pentru o navigare cât mai precisă, vă recomandăm să dezactivați modul de economisire a energiei în setările pentru baterie ale telefonului.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Adresă/Bloc</string>
|
||||
|
|
|
@ -384,6 +384,7 @@
|
|||
<string name="dialog_routing_system_error">Системная ошибка</string>
|
||||
<string name="dialog_routing_application_error">Не удалось проложить маршрут из-за ошибки приложения.</string>
|
||||
<string name="dialog_routing_try_again">Попробуйте снова</string>
|
||||
<string name="not_now">Не сейчас</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Загрузить карту и построить более оптимальный маршрут с пересечением границы карты?</string>
|
||||
<string name="dialog_routing_download_cross_route">Для построения более оптимального маршрута с пересечением границы требуется загрузить карту.</string>
|
||||
|
||||
|
@ -843,6 +844,10 @@
|
|||
<string name="select_option">Выберите вариант</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Сидения на открытом воздухе</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Отключить режим энергосбережения</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Для наиболее точной навигации мы рекомендуем отключить режим энергосбережения в настройках батареи телефона.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Адрес/Блок</string>
|
||||
|
|
|
@ -379,6 +379,7 @@
|
|||
<string name="dialog_routing_system_error">Systémová chyba</string>
|
||||
<string name="dialog_routing_application_error">Nedá sa vytvoriť trasa z dôvodu aplikačnej chyby.</string>
|
||||
<string name="dialog_routing_try_again">Skúste znova, prosím</string>
|
||||
<string name="not_now">Nie teraz</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Chcete si prevziať mapu a vytvoriť optimálnejšiu trasu, ktorá si vyžaduje viac ako jednu mapu?</string>
|
||||
<string name="dialog_routing_download_cross_route">Prevezmite si mapu na vytvorenie optimálnejšej trasy, ktorá prekračuje okraje tejto mapy.</string>
|
||||
|
||||
|
@ -821,6 +822,10 @@
|
|||
<string name="select_option">Vyberte možnosť</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Vonkajšie sedenie</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Vypnúť režim úspory energie</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Pre čo najpresnejšiu navigáciu odporúčame vypnúť režim úspory energie v nastaveniach batérie telefónu.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Adresa/blok</string>
|
||||
|
|
|
@ -360,6 +360,7 @@
|
|||
<string name="dialog_routing_system_error">Systemfel</string>
|
||||
<string name="dialog_routing_application_error">Kan inte skapa väg på grund av ett programfel.</string>
|
||||
<string name="dialog_routing_try_again">Försök igen</string>
|
||||
<string name="not_now">Inte nu</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Vill du ladda ned kartan och skapa en optimalare väg som sträcker sig över fler än en karta?</string>
|
||||
<string name="dialog_routing_download_cross_route">Ladda ned kartan för att skapa en optimalare väg som sträcker sig utanför den här kartan.</string>
|
||||
|
||||
|
@ -779,6 +780,10 @@
|
|||
<string name="select_option">Välj alternativ</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Sittplatser utomhus</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Stäng av energisparläget</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">För att få den mest exakta navigeringen rekommenderar vi att du avaktiverar energisparläget i telefonens batteriinställningar.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Adress/Block</string>
|
||||
|
|
|
@ -349,6 +349,10 @@
|
|||
<string name="select_option">Chagua chaguo</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Viti vya nje</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Zima Hali ya Kuokoa Nguvu</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Kwa urambazaji sahihi zaidi, tunapendekeza kuzima hali ya kuokoa nishati katika mipangilio ya betri ya simu.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Anwani/Zuia</string>
|
||||
|
|
|
@ -364,6 +364,7 @@
|
|||
<string name="dialog_routing_system_error">ระบบเกิดข้อผิดพลาด</string>
|
||||
<string name="dialog_routing_application_error">ไม่สามารถสร้างเส้นทางได้เนื่องจากเกิดข้อผิดพลาดของแอปพลิเคชัน</string>
|
||||
<string name="dialog_routing_try_again">กรุณาลองอีกครั้ง</string>
|
||||
<string name="not_now">ไว้คราวหลัง</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">คุณต้องการดาวน์โหลดแผนที่และสร้างเส้นทางที่เหมาะสมกว่าซึ่งข้ามเกินหนึ่งแผนที่หรือไม่?</string>
|
||||
<string name="dialog_routing_download_cross_route">ดาวน์โหลดแผนที่เพื่อสร้างเส้นทางที่เหมาะสมกว่าซึ่งข้ามเลยขอบของแผนที่นี้</string>
|
||||
|
||||
|
@ -780,6 +781,10 @@
|
|||
<string name="select_option">เลือกตัวเลือก</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">ที่นั่งกลางแจ้ง</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">ปิดโหมดประหยัดพลังงาน</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">เพื่อการนำทางที่แม่นยำที่สุด เราขอแนะนำให้ปิดใช้งานโหมดประหยัดพลังงานในการตั้งค่าแบตเตอรี่ของโทรศัพท์</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">ที่อยู่/บล็อค</string>
|
||||
|
|
|
@ -381,6 +381,7 @@
|
|||
<string name="dialog_routing_system_error">Sistem hatası</string>
|
||||
<string name="dialog_routing_application_error">Uygulama hatası nedeniyle rota oluşturulamadı.</string>
|
||||
<string name="dialog_routing_try_again">Lütfen tekrar deneyin</string>
|
||||
<string name="not_now">Şimdi Değil</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Haritayı indirerek birden fazla haritaya uzanan daha uygun bir rota oluşturmak ister misiniz?</string>
|
||||
<string name="dialog_routing_download_cross_route">Bu haritanın bir kısmından geçen daha uygun bir rota oluşturmak için haritayı indirin.</string>
|
||||
|
||||
|
@ -834,6 +835,10 @@
|
|||
<string name="select_option">Seçeneği seçin</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Açık oturma alanı</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Güç Tasarrufu Modunu Kapat</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">En doğru navigasyon için, telefonun pil ayarlarında güç tasarrufu modunu devre dışı bırakmanızı öneririz.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Adres/Blok</string>
|
||||
|
|
|
@ -384,6 +384,7 @@
|
|||
<string name="dialog_routing_system_error">Системна помилка</string>
|
||||
<string name="dialog_routing_application_error">Не вдалося прокласти маршрут через помилки програми.</string>
|
||||
<string name="dialog_routing_try_again">Спробуйте знову</string>
|
||||
<string name="not_now">Не зараз</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Завантажити мапу і побудувати більш оптимальний маршрут з перетином межі мапи?</string>
|
||||
<string name="dialog_routing_download_cross_route">Для побудови більш оптимального маршруту з перетином межі потрібно завантажити мапу.</string>
|
||||
|
||||
|
@ -834,6 +835,10 @@
|
|||
<string name="select_option">Виберіть варіант</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Сидіння на відкритому повітрі</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Вимкнути режим енергозбереження</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Для найбільш точної навігації ми рекомендуємо вимкнути режим енергозбереження в налаштуваннях батареї телефону.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Адреса/блок</string>
|
||||
|
|
|
@ -362,6 +362,7 @@
|
|||
<string name="dialog_routing_system_error">Lỗi hệ thống</string>
|
||||
<string name="dialog_routing_application_error">Không thể tạo tuyến đường do lỗi ứng dụng.</string>
|
||||
<string name="dialog_routing_try_again">Vui lòng thử lại</string>
|
||||
<string name="not_now">Lúc khác</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Bạn có muốn tải về bản đồ và tạo một tuyến đường tối ưu hơn kéo dài trên nhiều hơn một bản đồ?</string>
|
||||
<string name="dialog_routing_download_cross_route">Tải về bản đồ để tạo tuyến đường tối ưu hơn mà đi qua cạnh của bản đồ này.</string>
|
||||
|
||||
|
@ -779,6 +780,10 @@
|
|||
<string name="select_option">Chọn tùy chọn</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Chỗ ngồi ngoài trời</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Tắt Chế Độ Tiết Kiệm Pin</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Để điều hướng chính xác nhất, chúng tôi khuyên bạn nên tắt chế độ tiết kiệm năng lượng trong cài đặt pin của điện thoại.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Địa chỉ/Khối</string>
|
||||
|
|
|
@ -373,6 +373,7 @@
|
|||
<string name="dialog_routing_system_error">系統錯誤</string>
|
||||
<string name="dialog_routing_application_error">由於此錯誤,尚未建立路線。</string>
|
||||
<string name="dialog_routing_try_again">請再試一次</string>
|
||||
<string name="not_now">現在不要</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">您是否要下載地圖,產生跨越邊界的更好路線?</string>
|
||||
<string name="dialog_routing_download_cross_route">若要產生跨越邊界的更理想路線,您需要下載地圖。</string>
|
||||
|
||||
|
@ -805,6 +806,10 @@
|
|||
<string name="select_option">選擇選項</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">戶外座位</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">關閉省電模式</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">為了獲得最準確的導航,我們建議在手機電池設定中停用省電模式。</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">地址/區塊</string>
|
||||
|
|
|
@ -370,6 +370,7 @@
|
|||
<string name="dialog_routing_system_error">系统错误</string>
|
||||
<string name="dialog_routing_application_error">由于应用程序错误,无法创建路线。</string>
|
||||
<string name="dialog_routing_try_again">请重试</string>
|
||||
<string name="not_now">现在不用</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">您是否要下载地图并创建一条跨越多张地图的更佳路线?</string>
|
||||
<string name="dialog_routing_download_cross_route">下载地图,创建一条跨越此地图边缘的更佳路线。</string>
|
||||
|
||||
|
@ -796,6 +797,10 @@
|
|||
<string name="select_option">选择选项</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">室外座位</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">关闭省电模式</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">为了获得最准确的导航,我们建议在手机电池设置中禁用省电模式。</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">地址/区块</string>
|
||||
|
|
|
@ -137,4 +137,5 @@
|
|||
<color name="elevation_profile_dark">#4BB9E6</color>
|
||||
|
||||
<color name="material_calendar_surface_dark">#929292</color>
|
||||
<color name="notification_warning">#FFC22219</color>
|
||||
</resources>
|
||||
|
|
|
@ -17,14 +17,15 @@
|
|||
<string name="pref_file_name" translatable="false">OrganicMapsPrefs</string>
|
||||
<string name="pref_map_style" translatable="false">MapStyle</string>
|
||||
<string name="pref_tts_screen" translatable="false">TtsScreen</string>
|
||||
<string name="pref_tts_enabled" translatable="false">TtsEnabled</string>
|
||||
<string name="pref_tts_street_names" translatable="false">TtsStreetNames</string>
|
||||
<string name="pref_tts_enabled" translatable="false">TtsEnabled</string>
|
||||
<string name="pref_tts_language" translatable="false">TtsLanguage</string>
|
||||
<string name="pref_tts_volume" translatable="false">TtsVolume</string>
|
||||
<string name="pref_tts_test_voice" translatable="false">TtsTestVoice</string>
|
||||
<string name="pref_tts_info" translatable="false">TtsInfo</string>
|
||||
<string name="pref_tts_info_link" translatable="false">TtsInfoLink</string>
|
||||
<string name="pref_tts_speed_cameras" translatable="false">SpeedCameras</string>
|
||||
<!-- TODO: Move to another domain. -->
|
||||
<string name="prefs_routing" translatable="false">RoutingOptions</string>
|
||||
<string name="pref_autodownload" translatable="false">AutoDownloadMap</string>
|
||||
<string name="pref_3d" translatable="false">3D</string>
|
||||
|
@ -63,4 +64,5 @@
|
|||
<string name="auto_enum_value" translatable="false">AUTO</string>
|
||||
<string name="placepage_behavior" translatable="false">com.google.android.material.bottomsheet.BottomSheetBehavior</string>
|
||||
<string name="car_notification_channel_name" translatable="false">CAR_NOTIFICATION_CHANNEL</string>
|
||||
<string name="trace_path_name">Trace Path</string>
|
||||
</resources>
|
||||
|
|
|
@ -49,24 +49,6 @@
|
|||
<item>@string/never_enum_value</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="track_length">
|
||||
<item>@string/duration_disabled</item>
|
||||
<item>@string/duration_1_hour</item>
|
||||
<item>@string/duration_2_hours</item>
|
||||
<item>@string/duration_6_hours</item>
|
||||
<item>@string/duration_12_hours</item>
|
||||
<item>@string/duration_1_day</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="track_length_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>2</item>
|
||||
<item>6</item>
|
||||
<item>12</item>
|
||||
<item>24</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="mobile_data_options">
|
||||
<item>@string/mobile_data_option_ask</item>
|
||||
<item>@string/mobile_data_option_always</item>
|
||||
|
|
|
@ -220,6 +220,8 @@
|
|||
<string name="prefs_group_route">Navigation</string>
|
||||
<string name="pref_zoom_title">Zoom buttons</string>
|
||||
<string name="pref_zoom_summary">Display on the map</string>
|
||||
<!--Title of Recent track Recorder in settings-->
|
||||
<string name="trace_path">Trace Path</string>
|
||||
<!-- Settings «Map» category: «Night style» title -->
|
||||
<string name="pref_map_style_title">Night Mode</string>
|
||||
<!-- Generic «Off» string -->
|
||||
|
@ -404,6 +406,7 @@
|
|||
<string name="dialog_routing_system_error">System error</string>
|
||||
<string name="dialog_routing_application_error">Unable to create route due to an application error.</string>
|
||||
<string name="dialog_routing_try_again">Please try again</string>
|
||||
<string name="not_now">Not Now</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Would you like to download the map and create a more optimal route spanning more than one map?</string>
|
||||
<string name="dialog_routing_download_cross_route">Download additional maps to create a better route that crosses the boundaries of this map.</string>
|
||||
|
||||
|
@ -839,6 +842,10 @@
|
|||
<string name="aa_location_permissions_request">This application requires access to your location for navigation purposes.</string>
|
||||
<!-- Displayed on the Android Auto screen. Grant Permissions button. Must be no more than 18 symbols! -->
|
||||
<string name="aa_grant_permissions">Grant Permissions</string>
|
||||
<!--Title That will be displayed on notification when track Recording will be turned on-->
|
||||
<string name="recent_track_recorder_running">Recent Track Recorder is Running</string>
|
||||
<!--Discription That will be displayed on notification when track Recording will be turned on-->
|
||||
<string name="recent_track_rec_notif_desc">Recording your traversed tracks in background</string>
|
||||
<!-- Text that will be displayed in the notification title when the app is connected to Android Auto. -->
|
||||
<string name="aa_connected_to_car_notification_title">Connected to car</string>
|
||||
<!-- Outdoors/hiking map style (activity) name in the Styles and Layers dialog -->
|
||||
|
@ -866,6 +873,10 @@
|
|||
<string name="select_option">Select option</string>
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Outdoor seating</string>
|
||||
<!-- Disclaimer title shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_title">Turn Off Power Saving Mode</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">For the most accurate navigation, we recommend disabling power saving mode in phone\'s battery settings.</string>
|
||||
|
||||
<!-- SECTION: Types -->
|
||||
<string name="type.addr_interpolation">Address/Block</string>
|
||||
|
@ -2216,4 +2227,19 @@
|
|||
<string name="type.self_service.only">Self-service only</string>
|
||||
<string name="type.self_service.partially">Partial self-service</string>
|
||||
<string name="type.self_service.no">No self-service</string>
|
||||
<string name="instruction_1">- Instruction 1</string>
|
||||
<string name="instruction_2">- Instruction 2</string>
|
||||
<string name="instruction_3">- Instruction 3</string>
|
||||
<string name="instruction_4">- Instruction 4</string>
|
||||
<string name="have_a_nice_day">Have a nice Day ; )</string>
|
||||
<string name="Alert_dialogue_title">Please Follow These Guidlines</string>
|
||||
<string name="trace_path_is_on">Trace Path is On</string>
|
||||
<string name="trace_path_is_off">Trace Path is Off</string>
|
||||
<string name="battery_saver_dialog_title">Battery Saver is enabled</string>
|
||||
<string name="battery_saver_dialog_summary">Please disable the battery saver for Organic Maps to use Trace Path feature effectively Otherwise Tracks May have some gaps</string>
|
||||
<string name="enable">Enable</string>
|
||||
<string name="power_saver_dialog_title">Power Saving Mode enabled</string>
|
||||
<string name="power_saver_dialog_summary">Please Disable Power Saving mode to use Trace Path without any gaps.</string>
|
||||
<string name="location_update_warning_title">Location Updation Failed</string>
|
||||
<string name="location_update_warning_desc">Due to some errors location is not being updated. Which may result in inaccuracy and gaps in recorded track.</string>
|
||||
</resources>
|
||||
|
|
|
@ -10782,6 +10782,49 @@
|
|||
zh-Hans = 请重试
|
||||
zh-Hant = 請再試一次
|
||||
|
||||
[not_now]
|
||||
tags = android
|
||||
en = Not Now
|
||||
af = Nie nou nie
|
||||
ar = ليس الآن
|
||||
az = İndi yox
|
||||
be = Не зараз
|
||||
bg = Не сега
|
||||
ca = Ara no
|
||||
cs = Nyní ne
|
||||
da = Ikke nu
|
||||
de = Nicht jetzt
|
||||
el = Όχι τώρα
|
||||
es = No ahora
|
||||
et = Mitte praegu
|
||||
eu = Orain ez
|
||||
fa = اکنون خیر
|
||||
fi = Ei nyt
|
||||
fr = Pas maintenant
|
||||
he = לא עכשיו
|
||||
hu = Most nem
|
||||
id = Jangan Sekarang
|
||||
it = Non ora
|
||||
ja = 後で
|
||||
ko = 나중에
|
||||
lt = Ne dabar
|
||||
mr = आता नाही
|
||||
nb = Ikke nå
|
||||
nl = Niet nu
|
||||
pl = Nie teraz
|
||||
pt = Agora não
|
||||
pt-BR = Agora não
|
||||
ro = Nu acum
|
||||
ru = Не сейчас
|
||||
sk = Nie teraz
|
||||
sv = Inte nu
|
||||
th = ไว้คราวหลัง
|
||||
tr = Şimdi Değil
|
||||
uk = Не зараз
|
||||
vi = Lúc khác
|
||||
zh-Hans = 现在不用
|
||||
zh-Hant = 現在不要
|
||||
|
||||
[dialog_routing_download_and_build_cross_route]
|
||||
tags = android,ios
|
||||
en = Would you like to download the map and create a more optimal route spanning more than one map?
|
||||
|
@ -30977,3 +31020,95 @@
|
|||
vi = Chỗ ngồi ngoài trời
|
||||
zh-Hans = 室外座位
|
||||
zh-Hant = 戶外座位
|
||||
|
||||
[power_save_dialog_title]
|
||||
comment = Disclaimer title shown when Power Saving Mode is enabled
|
||||
tags = android
|
||||
en = Turn Off Power Saving Mode
|
||||
af = Skakel kragbesparingsmodus af
|
||||
ar = إيقاف تشغيل وضع توفير الطاقة
|
||||
az = Enerjiyə qənaət rejimini söndürün
|
||||
be = Выключыць рэжым энергазберажэння
|
||||
bg = Изключване на режима за пестене на енергия
|
||||
ca = Desactiva el mode d'estalvi d'energia
|
||||
cs = Vypnout režim úspory energie
|
||||
da = Sluk for strømsparetilstand
|
||||
de = Energiesparmodus deaktivieren
|
||||
el = Απενεργοποίηση λειτουργίας εξοικονόμησης ενέργειας
|
||||
es = Desactivar el modo de ahorro de energía
|
||||
et = Lülita välja energiasäästurežiim
|
||||
eu = Desaktibatu energia aurrezteko modua
|
||||
fa = خاموش کردن حالت صرفهجویی در مصرف انرژی
|
||||
fi = Poista virransäästötila käytöstä
|
||||
fr = Désactiver le mode économie d'énergie
|
||||
he = כבה מצב חיסכון באנרגיה
|
||||
hi = पावर सेविंग मोड बंद करें
|
||||
hu = Kapcsolja ki az energiatakarékos módot
|
||||
id = Matikan Mode Hemat Daya
|
||||
it = Disattiva la modalità di risparmio energetico
|
||||
ja = 省電力モードをオフにする
|
||||
ko = 절전 모드 해제
|
||||
lt = Išjunkite energijos taupymo režimą
|
||||
mr = पॉवर सेव्हिंग मोड बंद करा
|
||||
nb = Slå av strømsparingsmodus
|
||||
nl = Schakel energiebesparingsmodus uit
|
||||
pl = Wyłącz tryb oszczędzania energii
|
||||
pt = Desativar o modo de economia de energia
|
||||
pt-BR = Desativar o modo de economia de energia
|
||||
ro = Dezactivați modul de economisire a energiei
|
||||
ru = Отключить режим энергосбережения
|
||||
sk = Vypnúť režim úspory energie
|
||||
sv = Stäng av energisparläget
|
||||
sw = Zima Hali ya Kuokoa Nguvu
|
||||
th = ปิดโหมดประหยัดพลังงาน
|
||||
tr = Güç Tasarrufu Modunu Kapat
|
||||
uk = Вимкнути режим енергозбереження
|
||||
vi = Tắt Chế Độ Tiết Kiệm Pin
|
||||
zh-Hans = 关闭省电模式
|
||||
zh-Hant = 關閉省電模式
|
||||
|
||||
[power_save_dialog_summary]
|
||||
comment = Disclaimer summary shown when Power Saving Mode is enabled
|
||||
tags = android
|
||||
en = For the most accurate navigation, we recommend disabling power saving mode in phone's battery settings.
|
||||
af = Vir die mees akkurate navigasie, beveel ons aan dat u kragbesparingsmodus in die foon se batteryinstellings deaktiveer.
|
||||
ar = للحصول على التنقل الأكثر دقة، نوصي بتعطيل وضع توفير الطاقة في إعدادات بطارية الهاتف.
|
||||
az = Ən dəqiq naviqasiya üçün telefonun batareya parametrlərində enerjiyə qənaət rejimini söndürməyi tövsiyə edirik.
|
||||
be = Для найбольш дакладнай навігацыі рэкамендуем адключыць рэжым энергазберажэння ў наладах батарэі тэлефона.
|
||||
bg = За най-точна навигация препоръчваме да деактивирате режима за пестене на енергия в настройките на батерията на телефона.
|
||||
ca = Per a una navegació més precisa, recomanem desactivar el mode d'estalvi d'energia a la configuració de la bateria del telèfon.
|
||||
cs = Pro co nejpřesnější navigaci doporučujeme vypnout úsporný režim v nastavení baterie telefonu.
|
||||
da = For at få den mest nøjagtige navigation anbefaler vi at deaktivere strømbesparende tilstand i telefonens batteriindstillinger.
|
||||
de = Für eine möglichst genaue Navigation empfehlen wir, den Energiesparmodus in den Akku-Einstellungen des Telefons zu deaktivieren.
|
||||
el = Για την πιο ακριβή πλοήγηση, συνιστούμε να απενεργοποιήσετε τη λειτουργία εξοικονόμησης ενέργειας στις ρυθμίσεις μπαταρίας του τηλεφώνου.
|
||||
es = Para una navegación más precisa, te recomendamos que desactives el modo de ahorro de energía en los ajustes de la batería del teléfono.
|
||||
et = Kõige täpsema navigeerimise tagamiseks soovitame telefoni aku seadetes energiasäästurežiimi välja lülitada.
|
||||
eu = Nabigazio zehatzena lortzeko, telefonoaren bateriaren ezarpenetan energia aurrezteko modua desgaitzea gomendatzen dugu.
|
||||
fa = برای دقیقu200cترین ناوبری، توصیه میu200cکنیم حالت صرفهu200cجویی در مصرف انرژی را در تنظیمات باتری گوشی غیرفعال کنید.
|
||||
fi = Jotta navigointi olisi mahdollisimman tarkkaa, suosittelemme virransäästötilan poistamista käytöstä puhelimen akkuasetuksista.
|
||||
fr = Pour une navigation plus précise, nous te recommandons de désactiver le mode d'économie d'énergie dans les paramètres de la batterie du téléphone.
|
||||
he = לניווט המדויק ביותר, אנו ממליצים להשבית את מצב חיסכון בחשמל בהגדרות הסוללה של הטלפון.
|
||||
hi = सबसे सटीक नेविगेशन के लिए, हम फ़ोन की बैटरी सेटिंग्स में पावर सेविंग मोड को अक्षम करने की सलाह देते हैं।
|
||||
hu = A legpontosabb navigáció érdekében javasoljuk az energiatakarékos üzemmód kikapcsolását a telefon akkumulátor-beállításaiban.
|
||||
id = Untuk navigasi yang paling akurat, kami sarankan untuk menonaktifkan mode hemat daya dalam pengaturan baterai ponsel.
|
||||
it = Per una navigazione più accurata, ti consigliamo di disabilitare la modalità di risparmio energetico nelle impostazioni della batteria del telefono.
|
||||
ja = 最も正確なナビゲーションのためには、携帯電話のバッテリー設定で省電力モードを無効にすることをお勧めする。
|
||||
ko = 가장 정확한 내비게이션을 위해 휴대폰의 배터리 설정에서 절전 모드를 비활성화하는 것이 좋습니다.
|
||||
lt = Kad navigacija būtų tiksliausia, rekomenduojame išjungti energijos taupymo režimą telefono akumuliatoriaus nustatymuose.
|
||||
mr = सर्वात अचूक नेव्हिगेशनसाठी, आम्ही फोनच्या बॅटरी सेटिंग्जमध्ये पॉवर सेव्हिंग मोड अक्षम करण्याची शिफारस करतो.
|
||||
nb = For å få mest mulig nøyaktig navigering anbefaler vi at du deaktiverer strømsparingsmodus i telefonens batteriinnstillinger.
|
||||
nl = Voor de meest nauwkeurige navigatie raden we aan om de energiebesparende modus uit te schakelen in de batterij-instellingen van de telefoon.
|
||||
pl = Aby uzyskać najbardziej dokładną nawigację, zalecamy wyłączenie trybu oszczędzania energii w ustawieniach baterii telefonu.
|
||||
pt = Para uma navegação mais precisa, recomendamos que desactive o modo de poupança de energia nas definições da bateria do telemóvel.
|
||||
pt-BR = Para obter uma navegação mais precisa, recomendamos que você desative o modo de economia de energia nas configurações de bateria do telefone.
|
||||
ro = Pentru o navigare cât mai precisă, vă recomandăm să dezactivați modul de economisire a energiei în setările pentru baterie ale telefonului.
|
||||
ru = Для наиболее точной навигации мы рекомендуем отключить режим энергосбережения в настройках батареи телефона.
|
||||
sk = Pre čo najpresnejšiu navigáciu odporúčame vypnúť režim úspory energie v nastaveniach batérie telefónu.
|
||||
sv = För att få den mest exakta navigeringen rekommenderar vi att du avaktiverar energisparläget i telefonens batteriinställningar.
|
||||
sw = Kwa urambazaji sahihi zaidi, tunapendekeza kuzima hali ya kuokoa nishati katika mipangilio ya betri ya simu.
|
||||
th = เพื่อการนำทางที่แม่นยำที่สุด เราขอแนะนำให้ปิดใช้งานโหมดประหยัดพลังงานในการตั้งค่าแบตเตอรี่ของโทรศัพท์
|
||||
tr = En doğru navigasyon için, telefonun pil ayarlarında güç tasarrufu modunu devre dışı bırakmanızı öneririz.
|
||||
uk = Для найбільш точної навігації ми рекомендуємо вимкнути режим енергозбереження в налаштуваннях батареї телефону.
|
||||
vi = Để điều hướng chính xác nhất, chúng tôi khuyên bạn nên tắt chế độ tiết kiệm năng lượng trong cài đặt pin của điện thoại.
|
||||
zh-Hans = 为了获得最准确的导航,我们建议在手机电池设置中禁用省电模式。
|
||||
zh-Hant = 為了獲得最準確的導航,我們建議在手機電池設定中停用省電模式。
|
||||
|
|
|
@ -538,13 +538,13 @@
|
|||
|
||||
"history" = "Előzmények";
|
||||
|
||||
"search_not_found" = "Sajnos, semmit nem találtam.";
|
||||
"search_not_found" = "Sajnos, semmit sem találtunk.";
|
||||
|
||||
"search_not_found_query" = "Próbáljon másik lekérdezést.";
|
||||
"search_not_found_query" = "Próbáljon másik kifejezést.";
|
||||
|
||||
"search_history_title" = "Keresési előzmények";
|
||||
|
||||
"search_history_text" = "Aktuális keresés gyors elérése.";
|
||||
"search_history_text" = "Legutóbbi keresések gyors elérése.";
|
||||
|
||||
"clear_search" = "A keresési előzmények törlése";
|
||||
|
||||
|
|
Reference in a new issue