From df350e43ba4b2a581c1226969733cd3468c5bba4 Mon Sep 17 00:00:00 2001 From: Nazar Date: Thu, 3 Oct 2019 15:01:20 +0300 Subject: [PATCH 01/34] DataStorage initial commit --- ...ttom_sheet_big_dialog_button_with_icon.xml | 50 ++ .../layout/bottom_sheet_edit_text_item.xml | 29 + ...ttom_sheet_item_btn_with_icon_and_text.xml | 45 ++ .../res/layout/bottom_sheet_select_folder.xml | 64 +++ OsmAnd/res/layout/data_storage_list_item.xml | 122 ++++ OsmAnd/res/values/strings.xml | 8 + OsmAnd/res/xml/data_storage.xml | 10 + OsmAnd/res/xml/global_settings.xml | 1 + OsmAnd/src/net/osmand/AndroidUtils.java | 23 + OsmAnd/src/net/osmand/plus/UiUtilities.java | 42 ++ .../plus/settings/BaseSettingsFragment.java | 5 +- .../plus/settings/DataStorageFragment.java | 541 ++++++++++++++++++ .../plus/settings/DataStorageItemsHolder.java | 199 +++++++ .../plus/settings/DataStorageMenuItem.java | 169 ++++++ .../plus/settings/GlobalSettingsFragment.java | 18 +- .../ChangeDataStorageBottomSheet.java | 199 +++++++ .../bottomsheets/SelectFolderBottomSheet.java | 344 +++++++++++ 17 files changed, 1865 insertions(+), 4 deletions(-) create mode 100644 OsmAnd/res/layout/bottom_sheet_big_dialog_button_with_icon.xml create mode 100644 OsmAnd/res/layout/bottom_sheet_edit_text_item.xml create mode 100644 OsmAnd/res/layout/bottom_sheet_item_btn_with_icon_and_text.xml create mode 100644 OsmAnd/res/layout/bottom_sheet_select_folder.xml create mode 100644 OsmAnd/res/layout/data_storage_list_item.xml create mode 100644 OsmAnd/res/xml/data_storage.xml create mode 100644 OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java create mode 100644 OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java create mode 100644 OsmAnd/src/net/osmand/plus/settings/DataStorageMenuItem.java create mode 100644 OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java create mode 100644 OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java diff --git a/OsmAnd/res/layout/bottom_sheet_big_dialog_button_with_icon.xml b/OsmAnd/res/layout/bottom_sheet_big_dialog_button_with_icon.xml new file mode 100644 index 0000000000..5267884e49 --- /dev/null +++ b/OsmAnd/res/layout/bottom_sheet_big_dialog_button_with_icon.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + diff --git a/OsmAnd/res/layout/bottom_sheet_edit_text_item.xml b/OsmAnd/res/layout/bottom_sheet_edit_text_item.xml new file mode 100644 index 0000000000..5e3bc5e35e --- /dev/null +++ b/OsmAnd/res/layout/bottom_sheet_edit_text_item.xml @@ -0,0 +1,29 @@ + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/bottom_sheet_item_btn_with_icon_and_text.xml b/OsmAnd/res/layout/bottom_sheet_item_btn_with_icon_and_text.xml new file mode 100644 index 0000000000..6adcae70ac --- /dev/null +++ b/OsmAnd/res/layout/bottom_sheet_item_btn_with_icon_and_text.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/bottom_sheet_select_folder.xml b/OsmAnd/res/layout/bottom_sheet_select_folder.xml new file mode 100644 index 0000000000..cf26b881e5 --- /dev/null +++ b/OsmAnd/res/layout/bottom_sheet_select_folder.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/data_storage_list_item.xml b/OsmAnd/res/layout/data_storage_list_item.xml new file mode 100644 index 0000000000..2efd2d799a --- /dev/null +++ b/OsmAnd/res/layout/data_storage_list_item.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index ee4522d503..b5d2b22875 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,7 +11,15 @@ Thx - Hardy --> + Used By default + Enter path to the folder + Select folder + Paste path to the folder with OsmAnd data + Change OsmAnd data folder? + Move to the new destination + Internal storage, hiden from user and other apps, so noone exept OsmAnd can’t get access to your data + Change data storage folder Plugin settings Logcat buffer Application profile changed to \"%s\" diff --git a/OsmAnd/res/xml/data_storage.xml b/OsmAnd/res/xml/data_storage.xml new file mode 100644 index 0000000000..1179f2d841 --- /dev/null +++ b/OsmAnd/res/xml/data_storage.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/xml/global_settings.xml b/OsmAnd/res/xml/global_settings.xml index 5194192ab7..2e95524c79 100644 --- a/OsmAnd/res/xml/global_settings.xml +++ b/OsmAnd/res/xml/global_settings.xml @@ -21,6 +21,7 @@ android:layout="@layout/preference_with_descr" android:persistent="false" android:title="@string/application_dir" + app:fragment="net.osmand.plus.settings.DataStorageFragment" tools:icon="@drawable/ic_action_folder" /> = Build.VERSION_CODES.LOLLIPOP; + View buttonContainer = buttonView.findViewById(R.id.button_container); + switch (buttonType) { + case PRIMARY: + if (v21) { + AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.ripple_solid_light, R.drawable.ripple_solid_dark); + } + AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.dlg_btn_primary_light, R.drawable.dlg_btn_primary_dark); + iconAndTextNormalColor = nightMode ? R.color.dlg_btn_primary_text_dark : R.color.dlg_btn_primary_text_light; + iconAndTextPressedColor = iconAndTextNormalColor; + break; + case SECONDARY: + if (v21) { + AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.ripple_solid_light, R.drawable.ripple_solid_dark); + } + AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.dlg_btn_secondary_light, R.drawable.dlg_btn_secondary_dark); + iconAndTextNormalColor = nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light; + iconAndTextPressedColor = nightMode ? R.color.dlg_btn_primary_text_dark : R.color.dlg_btn_primary_text_light; + break; + case STROKED: + if (v21) { + AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.ripple_light, R.drawable.ripple_dark); + } + AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.dlg_btn_stroked_light, R.drawable.dlg_btn_stroked_dark); + iconAndTextNormalColor = nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light; + iconAndTextPressedColor = nightMode ? R.color.dlg_btn_primary_text_dark : R.color.dlg_btn_primary_text_light; + break; + } + + img.setImageDrawable(AndroidUtils.createPressedStateListDrawable(getDrawable(iconResId, iconAndTextNormalColor), + getDrawable(iconResId, iconAndTextPressedColor))); + buttonTextView.setText(buttonText); + buttonTextView.setTextColor(ContextCompat.getColorStateList(ctx, iconAndTextNormalColor)); + buttonTextView.setEnabled(buttonView.isEnabled()); + } + public static Context getThemedContext(Context context, boolean nightMode) { return new ContextThemeWrapper(context, !nightMode ? R.style.OsmandLightTheme : R.style.OsmandDarkTheme); } diff --git a/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java index 2163069af1..97f2245695 100644 --- a/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java @@ -93,7 +93,8 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat impl VOICE_ANNOUNCES(VoiceAnnouncesFragment.class.getName(), true, R.xml.voice_announces, R.layout.profile_preference_toolbar_with_switch), VEHICLE_PARAMETERS(VehicleParametersFragment.class.getName(), true, R.xml.vehicle_parameters, R.layout.profile_preference_toolbar), MAP_DURING_NAVIGATION(MapDuringNavigationFragment.class.getName(), true, R.xml.map_during_navigation, R.layout.profile_preference_toolbar), - TURN_SCREEN_ON(TurnScreenOnFragment.class.getName(), true, R.xml.turn_screen_on, R.layout.profile_preference_toolbar_with_switch); + TURN_SCREEN_ON(TurnScreenOnFragment.class.getName(), true, R.xml.turn_screen_on, R.layout.profile_preference_toolbar_with_switch), + DATA_STORAGE(DataStorageFragment.class.getName(), false, R.xml.data_storage, R.layout.global_preference_toolbar); public final String fragmentName; public final boolean profileDependent; @@ -119,7 +120,7 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat impl @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { getPreferenceManager().setPreferenceDataStore(settings.getDataStore()); - } + } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { diff --git a/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java b/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java new file mode 100644 index 0000000000..1290055472 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java @@ -0,0 +1,541 @@ +package net.osmand.plus.settings; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.drawable.Drawable; +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.preference.CheckBoxPreference; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; +import android.support.v7.preference.PreferenceViewHolder; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import net.osmand.AndroidUtils; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.OsmandSettings; +import net.osmand.plus.ProgressImplementation; +import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; +import net.osmand.plus.dashboard.DashChooseAppDirFragment; +import net.osmand.plus.download.DownloadActivity; +import net.osmand.plus.settings.bottomsheets.ChangeDataStorageBottomSheet; +import net.osmand.plus.settings.bottomsheets.SelectFolderBottomSheet; +import net.osmand.util.Algorithms; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.text.DecimalFormat; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Locale; + +import static net.osmand.plus.settings.DataStorageItemsHolder.INTERNAL_STORAGE; +import static net.osmand.plus.settings.DataStorageItemsHolder.MANUALLY_SPECIFIED; +import static net.osmand.plus.settings.bottomsheets.ChangeDataStorageBottomSheet.CHOSEN_DIRECTORY; +import static net.osmand.plus.settings.bottomsheets.ChangeDataStorageBottomSheet.MOVE_DATA; +import static net.osmand.plus.settings.bottomsheets.SelectFolderBottomSheet.PATH_CHANGED; +import static net.osmand.plus.settings.bottomsheets.SelectFolderBottomSheet.NEW_PATH; + +public class DataStorageFragment extends BaseSettingsFragment { + + private final static String CHANGE_DIRECTORY_BUTTON = "change_directory"; + + private ArrayList menuItems; + private ArrayList dataStorageRadioButtonsGroup; + private Preference changeButton; + private DataStorageMenuItem currentDataStorage; + private String tmpManuallySpecifiedPath; + private DataStorageItemsHolder itemsHolder; + + private OsmandApplication app; + private Activity activity; + private OsmandSettings settings; + + @Override + protected void setupPreferences() { + app = getMyApplication(); + activity = getMyActivity(); + PreferenceScreen screen = getPreferenceScreen(); + + if (screen == null || app == null || activity == null) { + return; + } + settings = app.getSettings(); + + itemsHolder = DataStorageItemsHolder.refreshInfo(app); + menuItems = itemsHolder.getStorageItems(); + dataStorageRadioButtonsGroup = new ArrayList<>(); + + for (DataStorageMenuItem item : menuItems) { + CheckBoxPreference preference = new CheckBoxPreference(activity); + preference.setKey(item.getKey()); + preference.setTitle(item.getTitle()); + preference.setIcon(item.getIconResId()); + preference.setLayoutResource(R.layout.data_storage_list_item); + screen.addPreference(preference); + dataStorageRadioButtonsGroup.add(preference); + } + + currentDataStorage = itemsHolder.getCurrentStorage(); + + changeButton = new Preference(app); + changeButton.setKey(CHANGE_DIRECTORY_BUTTON); + changeButton.setLayoutResource(R.layout.bottom_sheet_item_btn_with_icon_and_text); + screen.addPreference(changeButton); + + updateView(currentDataStorage.getKey()); + } + + @Override + public boolean onPreferenceClick(Preference preference) { + if (CHANGE_DIRECTORY_BUTTON.equals(preference.getKey())) { + showFolderSelectionDialog(); + return false; + } + return super.onPreferenceClick(preference); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + super.onPreferenceChange(preference, newValue); + + if (newValue instanceof Bundle) { + //results from BottomSheets + Bundle resultData = (Bundle) newValue; + if (resultData.containsKey(ChangeDataStorageBottomSheet.TAG)) { + boolean moveMaps = resultData.getBoolean(MOVE_DATA); + DataStorageMenuItem newDataStorage = resultData.getParcelable(CHOSEN_DIRECTORY); + if (newDataStorage != null) { + if (tmpManuallySpecifiedPath != null) { + String directory = tmpManuallySpecifiedPath; + tmpManuallySpecifiedPath = null; + newDataStorage.setDirectory(directory); + } + if (moveMaps) { + moveData(currentDataStorage, newDataStorage); + } else { + confirm(app, activity, newDataStorage, false); + } + } + } else if (resultData.containsKey(SelectFolderBottomSheet.TAG)) { + boolean pathChanged = resultData.getBoolean(PATH_CHANGED); + if (pathChanged) { + tmpManuallySpecifiedPath = resultData.getString(NEW_PATH); + if (tmpManuallySpecifiedPath != null) { + DataStorageMenuItem manuallySpecified = null; + try { + manuallySpecified = (DataStorageMenuItem) itemsHolder.getManuallySpecified().clone(); + manuallySpecified.setDirectory(tmpManuallySpecifiedPath); + } catch (CloneNotSupportedException e) { + return false; + } + ChangeDataStorageBottomSheet.showInstance(getFragmentManager(), MANUALLY_SPECIFIED, + currentDataStorage, manuallySpecified, this, false); + } + } + } + } else { + //show necessary dialog + String key = preference.getKey(); + if (key != null) { + DataStorageMenuItem newDataStorage = itemsHolder.getStorage(key); + if (newDataStorage != null) { + if (!currentDataStorage.getKey().equals(newDataStorage.getKey())) { + if (newDataStorage.getType() == OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT + && !DownloadActivity.hasPermissionToWriteExternalStorage(activity)) { + ActivityCompat.requestPermissions(activity, + new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, + DownloadActivity.PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); + } else if (key.equals(MANUALLY_SPECIFIED)) { + showFolderSelectionDialog(); + } else { + ChangeDataStorageBottomSheet.showInstance(getFragmentManager(), key, + currentDataStorage, newDataStorage, DataStorageFragment.this, false); + } + } + } + } + } + return false; + } + + @Override + protected void onBindPreferenceViewHolder(Preference preference, PreferenceViewHolder holder) { + super.onBindPreferenceViewHolder(preference, holder); + String key = preference.getKey(); + if (key == null) { + return; + } + View itemView = holder.itemView; + if (preference instanceof CheckBoxPreference) { + DataStorageMenuItem item = itemsHolder.getStorage(key); + if (item != null) { + TextView tvTitle = itemView.findViewById(android.R.id.title); + TextView tvSummary = itemView.findViewById(R.id.summary); + TextView tvAdditionalDescription = itemView.findViewById(R.id.additionalDescription); + ImageView icon = itemView.findViewById(android.R.id.icon); + View divider = itemView.findViewById(R.id.divider); + View secondPart = itemView.findViewById(R.id.secondPart); + + tvTitle.setText(item.getTitle()); + icon.setImageResource(item.getIconResId()); + + String currentKey = item.getKey(); + + if (currentKey.equals(MANUALLY_SPECIFIED)) { + tvSummary.setText(item.getDirectory()); + secondPart.setVisibility(View.GONE); + tvAdditionalDescription.setVisibility(View.GONE); + divider.setVisibility(View.GONE); + } else { + tvAdditionalDescription.setVisibility(View.VISIBLE); + divider.setVisibility(View.VISIBLE); + secondPart.setVisibility(View.VISIBLE); + String space = getSpaceDescription(item.getDirectory()); + tvSummary.setText(space); + if (currentKey.equals(INTERNAL_STORAGE)) { + tvAdditionalDescription.setText(item.getDescription()); + } else { + tvAdditionalDescription.setText(item.getDirectory()); + } + } + } + } else if (key.equals(CHANGE_DIRECTORY_BUTTON)) { + ImageView icon = itemView.findViewById(R.id.button_icon); + TextView title = itemView.findViewById(R.id.button_text); + int colorResId = isNightMode() ? R.color.active_color_primary_dark : R.color.active_color_primary_light; + int color = ContextCompat.getColor(app, colorResId); + Drawable drawable = UiUtilities.getColoredSelectableDrawable(app, color, 0.3f); + AndroidUtils.setBackground(itemView, drawable); + icon.setVisibility(View.INVISIBLE); + title.setText(R.string.shared_string_change); + } + } + + private void updateView(String key) { + //selection set up + for (CheckBoxPreference preference : dataStorageRadioButtonsGroup) { + String preferenceKey = preference.getKey(); + boolean checked = preferenceKey != null && preferenceKey.equals(key); + preference.setChecked(checked); + } + boolean visible = key.equals(MANUALLY_SPECIFIED); + changeButton.setVisible(visible); + } + + private void showFolderSelectionDialog() { + DataStorageMenuItem manuallySpecified = itemsHolder.getManuallySpecified(); + if (manuallySpecified != null) { + SelectFolderBottomSheet.showInstance(getFragmentManager(), manuallySpecified.getKey(), + manuallySpecified.getDirectory(), DataStorageFragment.this, + getString(R.string.storage_directory_manual), getString(R.string.paste_Osmand_data_folder_path), + getString(R.string.shared_string_select_folder), false); + } + } + + private void moveData(final DataStorageMenuItem currentStorage, final DataStorageMenuItem newStorage) { + File fromDirectory = new File(currentStorage.getDirectory()); + File toDirectory = new File(newStorage.getDirectory()); + @SuppressLint("StaticFieldLeak") + DashChooseAppDirFragment.MoveFilesToDifferentDirectory task = new DashChooseAppDirFragment.MoveFilesToDifferentDirectory(activity, fromDirectory, toDirectory) { + + private MessageFormat formatMb = new MessageFormat("{0, number,##.#} MB", Locale.US); + + @NonNull + private String getFormattedSize(long sizeBytes) { + int size = (int) ((sizeBytes + 512) >> 10); + if (size >= 0) { + if (size > 100) { + return formatMb.format(new Object[]{(float) size / (1 << 10)}); + } else { + return size + " kB"; + } + } + return ""; + } + + private void showResultsDialog() { + StringBuilder sb = new StringBuilder(); + int moved = getMovedCount(); + int copied = getCopiedCount(); + int failed = getFailedCount(); + sb.append(activity.getString(R.string.files_moved, moved, getFormattedSize(getMovedSize()))).append("\n"); + if (copied > 0) { + sb.append(activity.getString(R.string.files_copied, copied, getFormattedSize(getCopiedSize()))).append("\n"); + } + if (failed > 0) { + sb.append(activity.getString(R.string.files_failed, failed, getFormattedSize(getFailedSize()))).append("\n"); + } + if (copied > 0 || failed > 0) { + int count = copied + failed; + sb.append(activity.getString(R.string.files_present, count, getFormattedSize(getCopiedSize() + getFailedSize()), newStorage.getDirectory())); + } + AlertDialog.Builder bld = new AlertDialog.Builder(activity); + bld.setMessage(sb.toString()); + bld.setPositiveButton(R.string.shared_string_restart, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + confirm(app, (AppCompatActivity) activity, newStorage, true); + } + }); + bld.show(); + } + + @Override + protected void onPostExecute(Boolean result) { + super.onPostExecute(result); + if (result) { + app.getResourceManager().resetStoreDirectory(); + // immediately proceed with change (to not loose where maps are currently located) + if (getCopiedCount() > 0 || getFailedCount() > 0) { + showResultsDialog(); + } else { + confirm(app, (AppCompatActivity) activity, newStorage, false); + } + } else { + showResultsDialog(); + Toast.makeText(activity, R.string.copying_osmand_file_failed, + Toast.LENGTH_SHORT).show(); + } + + } + }; + task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + + private void confirm(OsmandApplication app, Activity activity, DataStorageMenuItem newStorageDirectory, boolean silentRestart) { + String newDirectory = newStorageDirectory.getDirectory(); + int type = newStorageDirectory.getType(); + File newDirectoryFile = new File(newDirectory); + boolean wr = OsmandSettings.isWritable(newDirectoryFile); + if (wr) { + app.setExternalStorageDirectory(type, newDirectory); + reloadData(); + if (silentRestart) { + android.os.Process.killProcess(android.os.Process.myPid()); + } else { + app.restartApp(activity); + } + } else { + Toast.makeText(activity, R.string.specified_directiory_not_writeable, + Toast.LENGTH_LONG).show(); + } + updateAllSettings(); + } + + private String getSpaceDescription(String path) { + File dir = new File(path); + File dirParent = dir.getParentFile(); + while (!dir.exists() && dirParent != null) { + dir = dir.getParentFile(); + dirParent = dir.getParentFile(); + } + if (dir.exists()) { + DecimalFormat formatter = new DecimalFormat("#.##"); + return new StringBuilder(String.format(getString(R.string.free), + String.valueOf(formatter.format(AndroidUtils.getFreeSpaceGb(dir))))) + .append(" \u2022 ") + .append(formatter.format(AndroidUtils.getUsedSpaceGb(dir))) + .append(" / ") + .append(formatter.format(AndroidUtils.getTotalSpaceGb(dir))) + .append(" Gb") + .toString(); + } + return ""; + } + + protected void reloadData() { + new DashChooseAppDirFragment.ReloadData(activity, getMyApplication()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null); + } + + public static class MoveFilesToDifferentDirectory extends AsyncTask { + + private Context ctx; + private File from; + private File to; + protected ProgressImplementation progress; + private Runnable runOnSuccess; + private int movedCount; + private long movedSize; + private int copiedCount; + private long copiedSize; + private int failedCount; + private long failedSize; + + public MoveFilesToDifferentDirectory(Context ctx, File from, File to) { + this.ctx = ctx; + this.from = from; + this.to = to; + } + + public void setRunOnSuccess(Runnable runOnSuccess) { + this.runOnSuccess = runOnSuccess; + } + + public int getMovedCount() { + return movedCount; + } + + public int getCopiedCount() { + return copiedCount; + } + + public int getFailedCount() { + return failedCount; + } + + public long getMovedSize() { + return movedSize; + } + + public long getCopiedSize() { + return copiedSize; + } + + public long getFailedSize() { + return failedSize; + } + + @Override + protected void onPreExecute() { + movedCount = 0; + copiedCount = 0; + failedCount = 0; + progress = ProgressImplementation.createProgressDialog( + ctx, ctx.getString(R.string.copying_osmand_files), + ctx.getString(R.string.copying_osmand_files_descr, to.getPath()), + ProgressDialog.STYLE_HORIZONTAL); + } + + @Override + protected void onPostExecute(Boolean result) { + if (result != null) { + if (result.booleanValue() && runOnSuccess != null) { + runOnSuccess.run(); + } else if (!result.booleanValue()) { + Toast.makeText(ctx, R.string.shared_string_io_error, Toast.LENGTH_LONG).show(); + } + } + try { + if (progress.getDialog().isShowing()) { + progress.getDialog().dismiss(); + } + } catch (Exception e) { + //ignored + } + } + + private void movingFiles(File f, File t, int depth) throws IOException { + if (depth <= 2) { + progress.startTask(ctx.getString(R.string.copying_osmand_one_file_descr, t.getName()), -1); + } + if (f.isDirectory()) { + t.mkdirs(); + File[] lf = f.listFiles(); + if (lf != null) { + for (int i = 0; i < lf.length; i++) { + if (lf[i] != null) { + movingFiles(lf[i], new File(t, lf[i].getName()), depth + 1); + } + } + } + f.delete(); + } else if (f.isFile()) { + if (t.exists()) { + Algorithms.removeAllFiles(t); + } + boolean rnm = false; + long fileSize = f.length(); + try { + rnm = f.renameTo(t); + movedCount++; + movedSize += fileSize; + } catch (RuntimeException e) { + } + if (!rnm) { + FileInputStream fin = new FileInputStream(f); + FileOutputStream fout = new FileOutputStream(t); + try { + progress.startTask(ctx.getString(R.string.copying_osmand_one_file_descr, t.getName()), (int) (f.length() / 1024)); + Algorithms.streamCopy(fin, fout, progress, 1024); + copiedCount++; + copiedSize += fileSize; + } catch (IOException e) { + failedCount++; + failedSize += fileSize; + } finally { + fin.close(); + fout.close(); + } + f.delete(); + } + } + if (depth <= 2) { + progress.finishTask(); + } + } + + @Override + protected Boolean doInBackground(Void... params) { + to.mkdirs(); + try { + movingFiles(from, to, 0); + } catch (IOException e) { + return false; + } + return true; + } + + } + + public static class ReloadData extends AsyncTask { + private Context ctx; + protected ProgressImplementation progress; + private OsmandApplication app; + + public ReloadData(Context ctx, OsmandApplication app) { + this.ctx = ctx; + this.app = app; + } + + @Override + protected void onPreExecute() { + progress = ProgressImplementation.createProgressDialog(ctx, ctx.getString(R.string.loading_data), + ctx.getString(R.string.loading_data), ProgressDialog.STYLE_HORIZONTAL); + } + + @Override + protected void onPostExecute(Boolean result) { + try { + if (progress.getDialog().isShowing()) { + progress.getDialog().dismiss(); + } + } catch (Exception e) { + //ignored + } + } + + @Override + protected Boolean doInBackground(Void... params) { + app.getResourceManager().reloadIndexes(progress, new ArrayList()); + return true; + } + } +} diff --git a/OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java b/OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java new file mode 100644 index 0000000000..d85ad4fa3b --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java @@ -0,0 +1,199 @@ +package net.osmand.plus.settings; + +import android.os.Build; + +import net.osmand.ValueHolder; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.OsmandSettings; +import net.osmand.plus.R; + +import java.io.File; +import java.util.ArrayList; + +public class DataStorageItemsHolder { + public final static String INTERNAL_STORAGE = "internal_storage"; + public final static String EXTERNAL_STORAGE = "external_storage"; + public final static String SHARED_STORAGE = "shared_storage"; + public final static String MULTIUSER_STORAGE = "multiuser_storage"; + public final static String MANUALLY_SPECIFIED = "manually_specified"; + + private ArrayList menuItems; + private DataStorageMenuItem currentDataStorage; + private DataStorageMenuItem manuallySpecified; + + private int currentStorageType; + private String currentStoragePath; + + private OsmandApplication app; + private OsmandSettings settings; + + private DataStorageItemsHolder(OsmandApplication app) { + this.app = app; + this.settings = app.getSettings(); + prepareData(); + } + + public static DataStorageItemsHolder refreshInfo(OsmandApplication app) { + return new DataStorageItemsHolder(app); + } + + private void prepareData() { + + if (app == null) { + return; + } + + if (settings.getExternalStorageDirectoryTypeV19() >= 0) { + currentStorageType = settings.getExternalStorageDirectoryTypeV19(); + } else { + ValueHolder vh = new ValueHolder(); + if (vh.value != null && vh.value >= 0) { + currentStorageType = vh.value; + } else { + currentStorageType = 0; + } + } + currentStoragePath = settings.getExternalStorageDirectory().getAbsolutePath(); + + menuItems = new ArrayList<>(); + + String path; + File dir; + int iconId; + + //internal storage + path = settings.getInternalAppPath().getAbsolutePath(); + dir = new File(path); + iconId = R.drawable.ic_action_phone; + + DataStorageMenuItem internalStorageItem = DataStorageMenuItem.builder() + .buildKey(INTERNAL_STORAGE) + .buildTitle(getString(R.string.storage_directory_internal_app)) + .buildDirectory(path) + .buildDescription(getString(R.string.internal_app_storage_description)) + .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_INTERNAL_FILE) + .buildIconResId(iconId) + .build(); + addItem(internalStorageItem); + + //shared_storage + dir = settings.getDefaultInternalStorage(); + path = dir.getAbsolutePath(); + iconId = R.drawable.ic_action_phone; + + DataStorageMenuItem sharedStorageItem = DataStorageMenuItem.builder() + .buildKey(SHARED_STORAGE) + .buildTitle(getString(R.string.storage_directory_shared)) + .buildDirectory(path) + .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT) + .buildIconResId(iconId) + .build(); + addItem(sharedStorageItem); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + //external storage + File[] externals = app.getExternalFilesDirs(null); + if (externals != null) { + int i = 0; + for (File external : externals) { + if (external != null) { + ++i; + dir = external; + path = dir.getAbsolutePath(); + iconId = getIconForStorageType(dir); + DataStorageMenuItem externalStorageItem = DataStorageMenuItem.builder() + .buildKey(EXTERNAL_STORAGE + i) + .buildTitle(getString(R.string.storage_directory_external) + " " + i) + .buildDirectory(path) + .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_EXTERNAL_FILE) + .buildIconResId(iconId) + .build(); + addItem(externalStorageItem); + } + } + } + + //multi user storage + File[] obbDirs = app.getObbDirs(); + if (obbDirs != null) { + int i = 0; + for (File obb : obbDirs) { + if (obb != null) { + ++i; + dir = obb; + path = dir.getAbsolutePath(); + iconId = getIconForStorageType(dir); + DataStorageMenuItem multiuserStorageItem = DataStorageMenuItem.builder() + .buildKey(MULTIUSER_STORAGE + i) + .buildTitle(getString(R.string.storage_directory_multiuser) + " " + i) + .buildDirectory(path) + .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_OBB) + .buildIconResId(iconId) + .build(); + addItem(multiuserStorageItem); + } + } + } + } + + //manually specified storage + manuallySpecified = DataStorageMenuItem.builder() + .buildKey(MANUALLY_SPECIFIED) + .buildTitle(getString(R.string.storage_directory_manual)) + .buildDirectory(currentStoragePath) + .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_SPECIFIED) + .buildIconResId(R.drawable.ic_action_folder) + .build(); + menuItems.add(manuallySpecified); + + if (currentDataStorage == null) { + currentDataStorage = manuallySpecified; + } + } + + private String getString(int resId) { + return app.getString(resId); + } + + public ArrayList getStorageItems() { + return menuItems; + } + + private int getIconForStorageType(File dir) { + return R.drawable.ic_action_folder; + } + + public DataStorageMenuItem getCurrentStorage() { + return currentDataStorage; + } + + private void addItem(DataStorageMenuItem item) { + if (currentStorageType == item.getType() && currentStoragePath.equals(item.getDirectory())) { + currentDataStorage = item; + } + menuItems.add(item); + } + + public DataStorageMenuItem getManuallySpecified() { + return manuallySpecified; + } + + public DataStorageMenuItem getStorage(String key) { + if (menuItems != null && key != null) { + for (DataStorageMenuItem menuItem : menuItems) { + if (key.equals(menuItem.getKey())) { + return menuItem; + } + } + } + return null; + } + + public int getCurrentType() { + return currentStorageType; + } + + public String getCurrentPath() { + return currentStoragePath; + } +} diff --git a/OsmAnd/src/net/osmand/plus/settings/DataStorageMenuItem.java b/OsmAnd/src/net/osmand/plus/settings/DataStorageMenuItem.java new file mode 100644 index 0000000000..dd54a0a785 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/settings/DataStorageMenuItem.java @@ -0,0 +1,169 @@ +package net.osmand.plus.settings; + +import android.os.Parcel; +import android.os.Parcelable; +import android.support.annotation.IdRes; + +public class DataStorageMenuItem implements Parcelable, Cloneable { + + private String key; + private int type; + private String title; + private String description; + private String directory; + @IdRes + private int iconResId; + + private DataStorageMenuItem(String key, int type, String title, String description, + String directory, int iconResId) { + this.key = key; + this.type = type; + this.title = title; + this.description = description; + this.directory = directory; + this.iconResId = iconResId; + } + + private DataStorageMenuItem(Parcel in) { + key = in.readString(); + type = in.readInt(); + title = in.readString(); + description = in.readString(); + directory = in.readString(); + } + + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + public String getDirectory() { + return directory; + } + + public int getIconResId() { + return iconResId; + } + + public String getKey() { + return key; + } + + public int getType() { + return type; + } + + public void setKey(String key) { + this.key = key; + } + + public void setType(int type) { + this.type = type; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setDirectory(String directory) { + this.directory = directory; + } + + public void setIconResId(int iconResId) { + this.iconResId = iconResId; + } + + public static DataStorageMenuItemBuilder builder() { + return new DataStorageMenuItemBuilder(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(key); + dest.writeInt(type); + dest.writeString(title); + dest.writeString(description); + dest.writeString(directory); + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + + @Override + public DataStorageMenuItem createFromParcel(Parcel source) { + return new DataStorageMenuItem(source); + } + + @Override + public DataStorageMenuItem[] newArray(int size) { + return new DataStorageMenuItem[size]; + } + }; + + public static class DataStorageMenuItemBuilder { + private String key; + private int type; + private String title; + private String description; + private String directory; + @IdRes + private int iconResId; + + public DataStorageMenuItemBuilder buildKey(String key) { + this.key = key; + return this; + } + + public DataStorageMenuItemBuilder buildType(int type) { + this.type = type; + return this; + } + + public DataStorageMenuItemBuilder buildTitle(String title) { + this.title = title; + return this; + } + + public DataStorageMenuItemBuilder buildDescription(String description) { + this.description = description; + return this; + } + + public DataStorageMenuItemBuilder buildDirectory(String directory) { + this.directory = directory; + return this; + } + + public DataStorageMenuItemBuilder buildIconResId(int iconResId) { + this.iconResId = iconResId; + return this; + } + + public DataStorageMenuItem build() { + return new DataStorageMenuItem(key, type, title, description, directory, iconResId); + } + } + + @Override + public Object clone() throws CloneNotSupportedException { + return DataStorageMenuItem.builder() + .buildKey(this.key) + .buildTitle(this.title) + .buildDescription(this.description) + .buildDirectory(this.directory) + .buildType(this.type) + .buildIconResId(this.iconResId) + .build(); + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java index d3709fbc3c..84649b697f 100644 --- a/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java @@ -7,6 +7,7 @@ import android.support.v7.preference.Preference; import android.support.v7.preference.SwitchPreferenceCompat; import android.util.Pair; +import net.osmand.AndroidUtils; import net.osmand.plus.ApplicationMode; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -16,6 +17,9 @@ import net.osmand.plus.dialogs.SendAnalyticsBottomSheetDialogFragment; import net.osmand.plus.settings.preferences.ListPreferenceEx; import net.osmand.plus.settings.preferences.SwitchPreferenceEx; +import java.io.File; +import java.text.DecimalFormat; + public class GlobalSettingsFragment extends BaseSettingsFragment implements SendAnalyticsBottomSheetDialogFragment.OnSendAnalyticsPrefsUpdate, OnPreferenceChanged { @@ -134,9 +138,19 @@ public class GlobalSettingsFragment extends BaseSettingsFragment implements Send } private void setupExternalStorageDirPref() { - Preference externalStorageDir = (Preference) findPreference(OsmandSettings.EXTERNAL_STORAGE_DIR); + Preference externalStorageDir = findPreference(OsmandSettings.EXTERNAL_STORAGE_DIR); externalStorageDir.setIcon(getContentIcon(R.drawable.ic_action_folder)); - + DataStorageItemsHolder holder = DataStorageItemsHolder.refreshInfo(app); + DataStorageMenuItem currentStorage = holder.getCurrentStorage(); + File dir = new File(currentStorage.getDirectory()); + DecimalFormat formatter = new DecimalFormat("#.##"); + String summary = currentStorage.getTitle() + + " \u2022 " + + getString(R.string.shared_string_used) + + " " + + formatter.format(AndroidUtils.getUsedSpaceGb(dir)) + + " Gb"; + externalStorageDir.setSummary(summary); } private void setupSendAnonymousDataPref() { diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java new file mode 100644 index 0000000000..866fd18ed3 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java @@ -0,0 +1,199 @@ +package net.osmand.plus.settings.bottomsheets; + +import android.content.Context; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.content.ContextCompat; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.style.ForegroundColorSpan; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; + +import net.osmand.AndroidUtils; +import net.osmand.PlatformUtil; +import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; +import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; +import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; +import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; +import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; +import net.osmand.plus.settings.BaseSettingsFragment; +import net.osmand.plus.settings.DataStorageMenuItem; + +import org.apache.commons.logging.Log; + +import static net.osmand.plus.settings.DataStorageItemsHolder.MANUALLY_SPECIFIED; + +public class ChangeDataStorageBottomSheet extends BasePreferenceBottomSheet { + + public static final String TAG = "ChangeDataStorageBottomSheet"; + + private static final Log LOG = PlatformUtil.getLog(ChangeDataStorageBottomSheet.class); + + private final static String CURRENT_DIRECTORY = "current_directory"; + private final static String NEW_DIRECTORY = "new_directory"; + + public final static String MOVE_DATA = "move_data"; + public final static String CHOSEN_DIRECTORY = "chosen_storage"; + + private DataStorageMenuItem currentDirectory; + private DataStorageMenuItem newDirectory; + + @Override + public void createMenuItems(Bundle savedInstanceState) { + + Context ctx = getContext(); + + if (savedInstanceState != null) { + currentDirectory = savedInstanceState.getParcelable(CURRENT_DIRECTORY); + newDirectory = savedInstanceState.getParcelable(NEW_DIRECTORY); + } + + if (ctx == null || currentDirectory == null || newDirectory == null) { + return; + } + + items.add(new TitleItem(getString(R.string.change_osmand_data_folder_question))); + + String from = currentDirectory.getKey().equals(MANUALLY_SPECIFIED) ? currentDirectory.getDirectory() : currentDirectory.getTitle(); + String to = newDirectory.getKey().equals(MANUALLY_SPECIFIED) ? newDirectory.getDirectory() : newDirectory.getTitle(); + String fullDescription = getString(R.string.application_dir_change_warning3) + "\n" + from + " > " + to; + + SpannableStringBuilder coloredDescription = new SpannableStringBuilder( + fullDescription); + int startIndexFrom = fullDescription.indexOf(from); + int endIndexFrom = startIndexFrom + from.length(); + int startIndexTo = fullDescription.indexOf(to); + int endIndexTo = startIndexTo + to.length(); + int textColorPrimary = nightMode ? R.color.text_color_primary_dark : R.color.text_color_primary_light; + int activeColor = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light; + coloredDescription.setSpan(new ForegroundColorSpan( + ContextCompat.getColor(ctx, activeColor)), + startIndexFrom, endIndexFrom, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + coloredDescription.setSpan(new ForegroundColorSpan( + ContextCompat.getColor(ctx, activeColor)), + startIndexTo, endIndexTo, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + + BottomSheetItemWithDescription description = (BottomSheetItemWithDescription) new BottomSheetItemWithDescription.Builder() + .setDescription(coloredDescription) + .setDescriptionColorId(textColorPrimary) + .setLayoutId(R.layout.bottom_sheet_item_description_long) + .create(); + items.add(description); + + View spaceView = new FrameLayout(ctx); + spaceView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + AndroidUtils.dpToPx(ctx, getResources().getDimension(R.dimen.content_padding)))); + + BaseBottomSheetItem space = new BaseBottomSheetItem.Builder() + .setCustomView(spaceView) + .create(); + items.add(space); + + //buttons + View btnDontMoveView = View.inflate(ctx, R.layout.bottom_sheet_big_dialog_button_with_icon, null); + requiredMyApplication().getUIUtilities().setupDialogButtonWithIcon(nightMode, btnDontMoveView, UiUtilities.DialogButtonType.SECONDARY, getString(R.string.dont_move_maps), currentDirectory.getIconResId()); + BaseBottomSheetItem btnDontMove = new BaseBottomSheetItem.Builder() + .setCustomView(btnDontMoveView) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + positiveButtonsClick(false); + } + }) + .create(); + items.add(btnDontMove); + + View btnMoveView = View.inflate(ctx, R.layout.bottom_sheet_big_dialog_button_with_icon, null); + requiredMyApplication().getUIUtilities().setupDialogButtonWithIcon(nightMode, btnMoveView, UiUtilities.DialogButtonType.PRIMARY, getString(R.string.move_maps_to_new_destination), R.drawable.ic_action_folder_move); + BaseBottomSheetItem btnMove = new BaseBottomSheetItem.Builder() + .setCustomView(btnMoveView) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + positiveButtonsClick(true); + } + }) + .create(); + items.add(btnMove); + + View btnCloseView = View.inflate(ctx, R.layout.bottom_sheet_big_dialog_button_with_icon, null); + requiredMyApplication().getUIUtilities().setupDialogButtonWithIcon(nightMode, btnCloseView, UiUtilities.DialogButtonType.SECONDARY, getString(R.string.shared_string_cancel), R.drawable.ic_action_undo_dark); + BaseBottomSheetItem btnClose = new BaseBottomSheetItem.Builder() + .setCustomView(btnCloseView) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + } + }) + .create(); + items.add(btnClose); + + View bottomSpaceView = new FrameLayout(ctx); + bottomSpaceView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + AndroidUtils.dpToPx(ctx, getResources().getDimension(R.dimen.content_padding_half)))); + + BaseBottomSheetItem bottomSpace = new BaseBottomSheetItem.Builder() + .setCustomView(bottomSpaceView ) + .create(); + items.add(bottomSpace); + + } + + public void setCurrentDirectory(DataStorageMenuItem currentDirectory) { + this.currentDirectory = currentDirectory; + } + + public void setNewDirectory(DataStorageMenuItem newDirectory) { + this.newDirectory = newDirectory; + } + + private void positiveButtonsClick(boolean moveData) { + Bundle bundle = new Bundle(); + bundle.putBoolean(TAG, true); + bundle.putParcelable(CHOSEN_DIRECTORY, newDirectory); + bundle.putBoolean(MOVE_DATA, moveData); + Fragment fragment = getTargetFragment(); + if (fragment instanceof BaseSettingsFragment) { + ((BaseSettingsFragment) fragment).onPreferenceChange(getPreference(), bundle); + } + dismiss(); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putParcelable(CURRENT_DIRECTORY, currentDirectory); + outState.putParcelable(NEW_DIRECTORY, newDirectory); + } + + @Override + protected boolean hideButtonsContainer() { + return true; + } + + public static boolean showInstance(FragmentManager fm, String prefId, DataStorageMenuItem currentDirectory, + DataStorageMenuItem newDirectory, Fragment target, boolean usedOnMap) { + try { + if (fm.findFragmentByTag(TAG) == null) { + Bundle args = new Bundle(); + args.putString(PREFERENCE_ID, prefId); + + ChangeDataStorageBottomSheet fragment = new ChangeDataStorageBottomSheet(); + fragment.setCurrentDirectory(currentDirectory); + fragment.setNewDirectory(newDirectory); + fragment.setTargetFragment(target, 0); + fragment.setUsedOnMap(usedOnMap); + fragment.show(fm, TAG); + return true; + } + } catch (RuntimeException e) { + LOG.error(e.getMessage()); + } + return false; + } +} diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java new file mode 100644 index 0000000000..61165d9621 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java @@ -0,0 +1,344 @@ +package net.osmand.plus.settings.bottomsheets; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.OpenableColumns; +import android.support.annotation.NonNull; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import net.osmand.PlatformUtil; +import net.osmand.plus.R; +import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; +import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; +import net.osmand.plus.settings.BaseSettingsFragment; + +import org.apache.commons.logging.Log; + +import static android.view.View.GONE; + +public class SelectFolderBottomSheet extends BasePreferenceBottomSheet { + + public static final String TAG = "SelectFolderBottomSheet"; + private static final Log LOG = PlatformUtil.getLog(SelectFolderBottomSheet.class); + private static final int CHOOSE_FOLDER_REQUEST_CODE = 0; + + private static final String EDIT_TEXT_PREFERENCE_KEY = "edit_text_preference_key"; + private static final String DIALOG_TITLE = "dialog_title"; + private static final String DESCRIPTION = "description"; + private static final String BTN_TITLE = "btn_title"; + private static final String ET_WAS_FOCUSED = "edit_text_was_focused"; + public static final String NEW_PATH = "path"; + public static final String PATH_CHANGED = "changed"; + + private EditText editText; + + private String currentPath; + private String dialogTitle; + private String btnTitle; + private String description; + private boolean etWasFocused; + + @Override + public void createMenuItems(Bundle savedInstanceState) { + final Context ctx = getContext(); + + String text = null; + if (savedInstanceState != null) { + String folderPath = savedInstanceState.getString(NEW_PATH); + if (folderPath != null) { + currentPath = folderPath; + } + text = savedInstanceState.getString(EDIT_TEXT_PREFERENCE_KEY); + dialogTitle = savedInstanceState.getString(DIALOG_TITLE); + description = savedInstanceState.getString(DESCRIPTION); + btnTitle = savedInstanceState.getString(BTN_TITLE); + etWasFocused = savedInstanceState.getBoolean(ET_WAS_FOCUSED); + } + + if (ctx == null || currentPath == null) { + return; + } + + if (dialogTitle != null) { + items.add(new TitleItem(dialogTitle)); + } + + View mainView = View.inflate(ctx, R.layout.bottom_sheet_select_folder, null); + + TextView tvDescription = mainView.findViewById(R.id.description); + TextView tvBtnTitle = mainView.findViewById(R.id.title); + editText = mainView.findViewById(R.id.text); + + View divider = mainView.findViewById(R.id.divider); + View btnOpenChoseDialog = mainView.findViewById(R.id.button); + +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { +// if (btnTitle != null) { +// tvBtnTitle.setText(btnTitle); +// int colorResId = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light; +// int color = ContextCompat.getColor(ctx, colorResId); +// Drawable drawable = UiUtilities.getColoredSelectableDrawable(ctx, color, 0.3f); +// AndroidUtils.setBackground(btnOpenChoseDialog, drawable); +// btnOpenChoseDialog.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// openDocumentTree(); +// } +// }); +// } +// } else { + divider.setVisibility(GONE); + btnOpenChoseDialog.setVisibility(GONE); +// } + + if (text != null) { + editText.setText(text); + } + + if (description != null) { + tvDescription.setText(description); + } + + editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (hasFocus && !etWasFocused) { + etWasFocused = true; + editText.setText(currentPath); + } + } + }); + + BaseBottomSheetItem baseItem = new BaseBottomSheetItem.Builder() + .setCustomView(mainView) + .create(); + items.add(baseItem); + + } + + public static boolean showInstance(FragmentManager fm, String prefId, String currentPath, Fragment target, + String dialogTitle, String description, String btnTitle, boolean usedOnMap) { + try { + if (fm.findFragmentByTag(TAG) == null) { + Bundle args = new Bundle(); + args.putString(PREFERENCE_ID, prefId); + + SelectFolderBottomSheet fragment = new SelectFolderBottomSheet(); + fragment.setCurrentPath(currentPath); + fragment.setTargetFragment(target, 0); + fragment.setDialogTitle(dialogTitle); + fragment.setDescription(description); + fragment.setBtnTitle(btnTitle); + fragment.setUsedOnMap(usedOnMap); + fragment.show(fm, TAG); + } + return true; + } catch (RuntimeException e) { + return false; + } + } + + /*@TargetApi(Build.VERSION_CODES.LOLLIPOP) + private void openDocumentTree() { + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); + if (currentPath != null) { + Uri uri = Uri.fromFile(new File(currentPath)); + } + startActivityForResult(intent, CHOOSE_FOLDER_REQUEST_CODE); + }*/ + + + /*@Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (resultCode != RESULT_OK) { + return; + } + Uri result = data.getData(); + if (result == null) { + return; + } + if (requestCode == CHOOSE_FOLDER_REQUEST_CODE) { + DocumentFile documentFile = DocumentFile.fromTreeUri(getContext(), result); + File f = null; + try { + f = FileUtil.from(getContext(), documentFile.getUri()); + } catch (IOException e) { + e.printStackTrace(); + } + Toast.makeText(getMyApplication(), f.getAbsolutePath(), Toast.LENGTH_LONG).show(); + for (DocumentFile file : documentFile.listFiles()) { + if (file.isDirectory()) { + Toast.makeText(getMyApplication(), file.getName(), Toast.LENGTH_SHORT).show(); + etWasFocused = true; + editText.setText(file.getName()); + break; + } + } + } + super.onActivityResult(requestCode, resultCode, data); + }*/ + + @Override + protected int getDismissButtonTextId() { + return R.string.shared_string_close; + } + + @Override + protected int getRightBottomButtonTextId() { + return R.string.shared_string_apply; + } + + @Override + protected void onRightBottomButtonClick() { + Fragment fragment = getTargetFragment(); + if (fragment instanceof BaseSettingsFragment) { + String newPath = editText.getText().toString(); + if (!newPath.equals("")) { + boolean pathChanged = !newPath.equals(currentPath); + Bundle bundle = new Bundle(); + bundle.putBoolean(TAG, true); + bundle.putString(NEW_PATH, newPath); + bundle.putBoolean(PATH_CHANGED, pathChanged); + ((BaseSettingsFragment) fragment).onPreferenceChange(getPreference(), bundle); + } + } + dismiss(); + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putString(EDIT_TEXT_PREFERENCE_KEY, editText.getText().toString()); + outState.putString(NEW_PATH, currentPath); + outState.putString(DIALOG_TITLE, dialogTitle); + outState.putString(DESCRIPTION, description); + outState.putString(BTN_TITLE, btnTitle); + outState.putBoolean(ET_WAS_FOCUSED, etWasFocused); + } + + public void setCurrentPath(String currentPath) { + this.currentPath = currentPath; + } + + public void setDialogTitle(String dialogTitle) { + this.dialogTitle = dialogTitle; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setBtnTitle(String btnTitle) { + this.btnTitle = btnTitle; + } + + + + + + + + /*private static class FileUtil { + private static final int EOF = -1; + private static final int DEFAULT_BUFFER_SIZE = 1024 * 4; + + private FileUtil() { + + } + + public static File from(Context context, Uri uri) throws IOException { + InputStream inputStream = context.getContentResolver().openInputStream(uri); + String fileName = getFileName(context, uri); + String[] splitName = splitFileName(fileName); + File tempFile = File.createTempFile(splitName[0], splitName[1]); + tempFile = rename(tempFile, fileName); + tempFile.deleteOnExit(); + FileOutputStream out = null; + try { + out = new FileOutputStream(tempFile); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + if (inputStream != null) { + copy(inputStream, out); + inputStream.close(); + } + + if (out != null) { + out.close(); + } + return tempFile; + } + + private static String[] splitFileName(String fileName) { + String name = fileName; + String extension = ""; + int i = fileName.lastIndexOf("."); + if (i != -1) { + name = fileName.substring(0, i); + extension = fileName.substring(i); + } + + return new String[]{name, extension}; + } + + private static String getFileName(Context context, Uri uri) { + String result = null; + if (uri.getScheme().equals("content")) { + Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); + try { + if (cursor != null && cursor.moveToFirst()) { + result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (cursor != null) { + cursor.close(); + } + } + } + if (result == null) { + result = uri.getPath(); + int cut = result.lastIndexOf(File.separator); + if (cut != -1) { + result = result.substring(cut + 1); + } + } + return result; + } + + private static File rename(File file, String newName) { + File newFile = new File(file.getParent(), newName); + if (!newFile.equals(file)) { + if (newFile.exists() && newFile.delete()) { +// Log.d("FileUtil", "Delete old " + newName + " file"); + } + if (file.renameTo(newFile)) { +// Log.d("FileUtil", "Rename file to " + newName); + } + } + return newFile; + } + + private static long copy(InputStream input, OutputStream output) throws IOException { + long count = 0; + int n; + byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; + while (EOF != (n = input.read(buffer))) { + output.write(buffer, 0, n); + count += n; + } + return count; + } + }*/ +} From 17d0fcf062ba314ddc8bce0258ee9dac509321e1 Mon Sep 17 00:00:00 2001 From: Nazar Date: Fri, 4 Oct 2019 16:38:20 +0300 Subject: [PATCH 02/34] Refactor --- ...ttom_sheet_big_dialog_button_with_icon.xml | 67 +++++---- .../res/layout/bottom_sheet_dialog_button.xml | 39 +++-- .../layout/bottom_sheet_edit_text_item.xml | 29 ---- OsmAnd/res/values/strings.xml | 3 +- OsmAnd/src/net/osmand/plus/UiUtilities.java | 55 ++----- .../plus/settings/DataStorageFragment.java | 69 ++++++--- .../plus/settings/DataStorageItemsHolder.java | 61 ++++---- .../plus/settings/GlobalSettingsFragment.java | 6 +- .../ChangeDataStorageBottomSheet.java | 9 +- .../bottomsheets/SelectFolderBottomSheet.java | 140 ------------------ 10 files changed, 164 insertions(+), 314 deletions(-) delete mode 100644 OsmAnd/res/layout/bottom_sheet_edit_text_item.xml diff --git a/OsmAnd/res/layout/bottom_sheet_big_dialog_button_with_icon.xml b/OsmAnd/res/layout/bottom_sheet_big_dialog_button_with_icon.xml index 5267884e49..8e988a80af 100644 --- a/OsmAnd/res/layout/bottom_sheet_big_dialog_button_with_icon.xml +++ b/OsmAnd/res/layout/bottom_sheet_big_dialog_button_with_icon.xml @@ -6,45 +6,52 @@ android:layout_height="wrap_content" android:gravity="center_vertical"> - + android:layout_width="match_parent" + android:layout_height="wrap_content"> - - - + android:layout_height="@dimen/bottom_sheet_cancel_button_height" + android:orientation="horizontal"> - + + + android:layout_gravity="top" + android:orientation="vertical" + android:paddingRight="@dimen/content_padding"> - + - + + + + + diff --git a/OsmAnd/res/layout/bottom_sheet_dialog_button.xml b/OsmAnd/res/layout/bottom_sheet_dialog_button.xml index 34dfd832f4..b277cfbcab 100644 --- a/OsmAnd/res/layout/bottom_sheet_dialog_button.xml +++ b/OsmAnd/res/layout/bottom_sheet_dialog_button.xml @@ -1,29 +1,36 @@ + android:layout_weight="1" + android:orientation="vertical"> - + android:layout_height="match_parent"> - + tools:ignore="UselessParent"> - + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/bottom_sheet_edit_text_item.xml b/OsmAnd/res/layout/bottom_sheet_edit_text_item.xml deleted file mode 100644 index 5e3bc5e35e..0000000000 --- a/OsmAnd/res/layout/bottom_sheet_edit_text_item.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index b5d2b22875..9dd69e8412 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,7 +11,8 @@ Thx - Hardy --> - Used + Used %1$s GB + %1$s / %2$s GB By default Enter path to the folder Select folder diff --git a/OsmAnd/src/net/osmand/plus/UiUtilities.java b/OsmAnd/src/net/osmand/plus/UiUtilities.java index 3361743bc7..d69e123f12 100644 --- a/OsmAnd/src/net/osmand/plus/UiUtilities.java +++ b/OsmAnd/src/net/osmand/plus/UiUtilities.java @@ -324,51 +324,25 @@ public class UiUtilities { } public static void setupDialogButton(boolean nightMode, View buttonView, DialogButtonType buttonType, CharSequence buttonText) { - Context ctx = buttonView.getContext(); - TextViewEx buttonTextView = (TextViewEx) buttonView.findViewById(R.id.button_text); - boolean v21 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; - View buttonContainer = buttonView.findViewById(R.id.button_container); - switch (buttonType) { - case PRIMARY: - if (v21) { - AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.ripple_solid_light, R.drawable.ripple_solid_dark); - } - AndroidUtils.setBackground(ctx, buttonView, nightMode, R.drawable.dlg_btn_primary_light, R.drawable.dlg_btn_primary_dark); - buttonTextView.setTextColor(ContextCompat.getColorStateList(ctx, nightMode ? R.color.dlg_btn_primary_text_dark : R.color.dlg_btn_primary_text_light)); - break; - case SECONDARY: - if (v21) { - AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.ripple_solid_light, R.drawable.ripple_solid_dark); - } - AndroidUtils.setBackground(ctx, buttonView, nightMode, R.drawable.dlg_btn_secondary_light, R.drawable.dlg_btn_secondary_dark); - buttonTextView.setTextColor(ContextCompat.getColorStateList(ctx, nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light)); - break; - case STROKED: - if (v21) { - AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.ripple_light, R.drawable.ripple_dark); - } - AndroidUtils.setBackground(ctx, buttonView, nightMode, R.drawable.dlg_btn_stroked_light, R.drawable.dlg_btn_stroked_dark); - buttonTextView.setTextColor(ContextCompat.getColorStateList(ctx, nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light)); - break; - } - buttonTextView.setText(buttonText); - buttonTextView.setEnabled(buttonView.isEnabled()); + setupDialogButton(nightMode, buttonView, buttonType, buttonText, -1); } - public void setupDialogButtonWithIcon(boolean nightMode, View buttonView, DialogButtonType buttonType, CharSequence buttonText, int iconResId) { + public static void setupDialogButton(boolean nightMode, View buttonView, DialogButtonType buttonType, CharSequence buttonText, int iconResId) { Context ctx = buttonView.getContext(); TextViewEx buttonTextView = (TextViewEx) buttonView.findViewById(R.id.button_text); - ImageView img = buttonView.findViewById(R.id.button_icon); - int iconAndTextNormalColor = -1; - int iconAndTextPressedColor = -1; boolean v21 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; View buttonContainer = buttonView.findViewById(R.id.button_container); + View secondaryBtnContainer = buttonView.findViewById(R.id.secondary_btn_container); + + int iconAndTextNormalColor = -1; + int iconAndTextPressedColor = -1; + switch (buttonType) { case PRIMARY: if (v21) { AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.ripple_solid_light, R.drawable.ripple_solid_dark); } - AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.dlg_btn_primary_light, R.drawable.dlg_btn_primary_dark); + AndroidUtils.setBackground(ctx, secondaryBtnContainer, nightMode, R.drawable.dlg_btn_primary_light, R.drawable.dlg_btn_primary_dark); iconAndTextNormalColor = nightMode ? R.color.dlg_btn_primary_text_dark : R.color.dlg_btn_primary_text_light; iconAndTextPressedColor = iconAndTextNormalColor; break; @@ -376,7 +350,7 @@ public class UiUtilities { if (v21) { AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.ripple_solid_light, R.drawable.ripple_solid_dark); } - AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.dlg_btn_secondary_light, R.drawable.dlg_btn_secondary_dark); + AndroidUtils.setBackground(ctx, secondaryBtnContainer, nightMode, R.drawable.dlg_btn_secondary_light, R.drawable.dlg_btn_secondary_dark); iconAndTextNormalColor = nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light; iconAndTextPressedColor = nightMode ? R.color.dlg_btn_primary_text_dark : R.color.dlg_btn_primary_text_light; break; @@ -384,17 +358,20 @@ public class UiUtilities { if (v21) { AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.ripple_light, R.drawable.ripple_dark); } - AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.dlg_btn_stroked_light, R.drawable.dlg_btn_stroked_dark); + AndroidUtils.setBackground(ctx, secondaryBtnContainer, nightMode, R.drawable.dlg_btn_stroked_light, R.drawable.dlg_btn_stroked_dark); iconAndTextNormalColor = nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light; iconAndTextPressedColor = nightMode ? R.color.dlg_btn_primary_text_dark : R.color.dlg_btn_primary_text_light; break; } - - img.setImageDrawable(AndroidUtils.createPressedStateListDrawable(getDrawable(iconResId, iconAndTextNormalColor), - getDrawable(iconResId, iconAndTextPressedColor))); buttonTextView.setText(buttonText); buttonTextView.setTextColor(ContextCompat.getColorStateList(ctx, iconAndTextNormalColor)); buttonTextView.setEnabled(buttonView.isEnabled()); + if (iconResId != -1) { + Drawable iconNormal = tintDrawable(ContextCompat.getDrawable(ctx, iconResId), ContextCompat.getColor(ctx, iconAndTextNormalColor)); + Drawable iconPressed = tintDrawable(ContextCompat.getDrawable(ctx, iconResId), ContextCompat.getColor(ctx, iconAndTextPressedColor)); + ImageView img = buttonView.findViewById(R.id.button_icon); + img.setImageDrawable(AndroidUtils.createPressedStateListDrawable(iconNormal, iconPressed)); + } } public static Context getThemedContext(Context context, boolean nightMode) { diff --git a/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java b/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java index 1290055472..f14199a9c0 100644 --- a/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java @@ -13,15 +13,12 @@ import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; import android.support.v7.preference.CheckBoxPreference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; import android.support.v7.preference.PreferenceViewHolder; import android.view.View; -import android.widget.EditText; import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; @@ -31,7 +28,7 @@ import net.osmand.plus.OsmandSettings; import net.osmand.plus.ProgressImplementation; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; -import net.osmand.plus.dashboard.DashChooseAppDirFragment; +import net.osmand.plus.activities.OsmandActionBarActivity; import net.osmand.plus.download.DownloadActivity; import net.osmand.plus.settings.bottomsheets.ChangeDataStorageBottomSheet; import net.osmand.plus.settings.bottomsheets.SelectFolderBottomSheet; @@ -41,6 +38,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.lang.ref.WeakReference; import java.text.DecimalFormat; import java.text.MessageFormat; import java.util.ArrayList; @@ -65,7 +63,7 @@ public class DataStorageFragment extends BaseSettingsFragment { private DataStorageItemsHolder itemsHolder; private OsmandApplication app; - private Activity activity; + private OsmandActionBarActivity activity; private OsmandSettings settings; @Override @@ -254,7 +252,7 @@ public class DataStorageFragment extends BaseSettingsFragment { File fromDirectory = new File(currentStorage.getDirectory()); File toDirectory = new File(newStorage.getDirectory()); @SuppressLint("StaticFieldLeak") - DashChooseAppDirFragment.MoveFilesToDifferentDirectory task = new DashChooseAppDirFragment.MoveFilesToDifferentDirectory(activity, fromDirectory, toDirectory) { + MoveFilesToDifferentDirectory task = new MoveFilesToDifferentDirectory(activity, fromDirectory, toDirectory) { private MessageFormat formatMb = new MessageFormat("{0, number,##.#} MB", Locale.US); @@ -273,26 +271,30 @@ public class DataStorageFragment extends BaseSettingsFragment { private void showResultsDialog() { StringBuilder sb = new StringBuilder(); + Context ctx = activity.get(); + if (ctx == null) { + return; + } int moved = getMovedCount(); int copied = getCopiedCount(); int failed = getFailedCount(); - sb.append(activity.getString(R.string.files_moved, moved, getFormattedSize(getMovedSize()))).append("\n"); + sb.append(ctx.getString(R.string.files_moved, moved, getFormattedSize(getMovedSize()))).append("\n"); if (copied > 0) { - sb.append(activity.getString(R.string.files_copied, copied, getFormattedSize(getCopiedSize()))).append("\n"); + sb.append(ctx.getString(R.string.files_copied, copied, getFormattedSize(getCopiedSize()))).append("\n"); } if (failed > 0) { - sb.append(activity.getString(R.string.files_failed, failed, getFormattedSize(getFailedSize()))).append("\n"); + sb.append(ctx.getString(R.string.files_failed, failed, getFormattedSize(getFailedSize()))).append("\n"); } if (copied > 0 || failed > 0) { int count = copied + failed; - sb.append(activity.getString(R.string.files_present, count, getFormattedSize(getCopiedSize() + getFailedSize()), newStorage.getDirectory())); + sb.append(ctx.getString(R.string.files_present, count, getFormattedSize(getCopiedSize() + getFailedSize()), newStorage.getDirectory())); } - AlertDialog.Builder bld = new AlertDialog.Builder(activity); + AlertDialog.Builder bld = new AlertDialog.Builder(ctx); bld.setMessage(sb.toString()); bld.setPositiveButton(R.string.shared_string_restart, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - confirm(app, (AppCompatActivity) activity, newStorage, true); + confirm(app, activity.get(), newStorage, true); } }); bld.show(); @@ -301,17 +303,22 @@ public class DataStorageFragment extends BaseSettingsFragment { @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); + OsmandActionBarActivity a = this.activity.get(); + if (a == null) { + return; + } + OsmandApplication app = a.getMyApplication(); if (result) { app.getResourceManager().resetStoreDirectory(); // immediately proceed with change (to not loose where maps are currently located) if (getCopiedCount() > 0 || getFailedCount() > 0) { showResultsDialog(); } else { - confirm(app, (AppCompatActivity) activity, newStorage, false); + confirm(app, a, newStorage, false); } } else { showResultsDialog(); - Toast.makeText(activity, R.string.copying_osmand_file_failed, + Toast.makeText(a, R.string.copying_osmand_file_failed, Toast.LENGTH_SHORT).show(); } @@ -362,12 +369,13 @@ public class DataStorageFragment extends BaseSettingsFragment { } protected void reloadData() { - new DashChooseAppDirFragment.ReloadData(activity, getMyApplication()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null); + new ReloadData(activity, getMyApplication()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null); } public static class MoveFilesToDifferentDirectory extends AsyncTask { - private Context ctx; + protected WeakReference activity; + private WeakReference context; private File from; private File to; protected ProgressImplementation progress; @@ -379,8 +387,9 @@ public class DataStorageFragment extends BaseSettingsFragment { private int failedCount; private long failedSize; - public MoveFilesToDifferentDirectory(Context ctx, File from, File to) { - this.ctx = ctx; + public MoveFilesToDifferentDirectory(OsmandActionBarActivity activity, File from, File to) { + this.activity = new WeakReference<>(activity); + this.context = new WeakReference<>((Context) activity); this.from = from; this.to = to; } @@ -415,6 +424,10 @@ public class DataStorageFragment extends BaseSettingsFragment { @Override protected void onPreExecute() { + Context ctx = context.get(); + if (context == null) { + return; + } movedCount = 0; copiedCount = 0; failedCount = 0; @@ -427,6 +440,10 @@ public class DataStorageFragment extends BaseSettingsFragment { @Override protected void onPostExecute(Boolean result) { if (result != null) { + Context ctx = context.get(); + if (ctx == null) { + return; + } if (result.booleanValue() && runOnSuccess != null) { runOnSuccess.run(); } else if (!result.booleanValue()) { @@ -443,6 +460,10 @@ public class DataStorageFragment extends BaseSettingsFragment { } private void movingFiles(File f, File t, int depth) throws IOException { + Context ctx = context.get(); + if (ctx == null) { + return; + } if (depth <= 2) { progress.startTask(ctx.getString(R.string.copying_osmand_one_file_descr, t.getName()), -1); } @@ -506,19 +527,23 @@ public class DataStorageFragment extends BaseSettingsFragment { } public static class ReloadData extends AsyncTask { - private Context ctx; + private WeakReference ctx; protected ProgressImplementation progress; private OsmandApplication app; public ReloadData(Context ctx, OsmandApplication app) { - this.ctx = ctx; + this.ctx = new WeakReference<>(ctx); this.app = app; } @Override protected void onPreExecute() { - progress = ProgressImplementation.createProgressDialog(ctx, ctx.getString(R.string.loading_data), - ctx.getString(R.string.loading_data), ProgressDialog.STYLE_HORIZONTAL); + Context c = ctx.get(); + if (c == null) { + return; + } + progress = ProgressImplementation.createProgressDialog(c, c.getString(R.string.loading_data), + c.getString(R.string.loading_data), ProgressDialog.STYLE_HORIZONTAL); } @Override diff --git a/OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java b/OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java index d85ad4fa3b..371ef1ee8a 100644 --- a/OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java +++ b/OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java @@ -42,7 +42,7 @@ public class DataStorageItemsHolder { if (app == null) { return; } - + if (settings.getExternalStorageDirectoryTypeV19() >= 0) { currentStorageType = settings.getExternalStorageDirectoryTypeV19(); } else { @@ -61,36 +61,37 @@ public class DataStorageItemsHolder { File dir; int iconId; - //internal storage - path = settings.getInternalAppPath().getAbsolutePath(); - dir = new File(path); - iconId = R.drawable.ic_action_phone; - - DataStorageMenuItem internalStorageItem = DataStorageMenuItem.builder() - .buildKey(INTERNAL_STORAGE) - .buildTitle(getString(R.string.storage_directory_internal_app)) - .buildDirectory(path) - .buildDescription(getString(R.string.internal_app_storage_description)) - .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_INTERNAL_FILE) - .buildIconResId(iconId) - .build(); - addItem(internalStorageItem); - - //shared_storage - dir = settings.getDefaultInternalStorage(); - path = dir.getAbsolutePath(); - iconId = R.drawable.ic_action_phone; - - DataStorageMenuItem sharedStorageItem = DataStorageMenuItem.builder() - .buildKey(SHARED_STORAGE) - .buildTitle(getString(R.string.storage_directory_shared)) - .buildDirectory(path) - .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT) - .buildIconResId(iconId) - .build(); - addItem(sharedStorageItem); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + + //internal storage + path = settings.getInternalAppPath().getAbsolutePath(); + dir = new File(path); + iconId = R.drawable.ic_action_phone; + + DataStorageMenuItem internalStorageItem = DataStorageMenuItem.builder() + .buildKey(INTERNAL_STORAGE) + .buildTitle(getString(R.string.storage_directory_internal_app)) + .buildDirectory(path) + .buildDescription(getString(R.string.internal_app_storage_description)) + .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_INTERNAL_FILE) + .buildIconResId(iconId) + .build(); + addItem(internalStorageItem); + + //shared_storage + dir = settings.getDefaultInternalStorage(); + path = dir.getAbsolutePath(); + iconId = R.drawable.ic_action_phone; + + DataStorageMenuItem sharedStorageItem = DataStorageMenuItem.builder() + .buildKey(SHARED_STORAGE) + .buildTitle(getString(R.string.storage_directory_shared)) + .buildDirectory(path) + .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT) + .buildIconResId(iconId) + .build(); + addItem(sharedStorageItem); + //external storage File[] externals = app.getExternalFilesDirs(null); if (externals != null) { diff --git a/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java index 84649b697f..eced1abd1f 100644 --- a/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java @@ -146,10 +146,8 @@ public class GlobalSettingsFragment extends BaseSettingsFragment implements Send DecimalFormat formatter = new DecimalFormat("#.##"); String summary = currentStorage.getTitle() + " \u2022 " + - getString(R.string.shared_string_used) + - " " + - formatter.format(AndroidUtils.getUsedSpaceGb(dir)) + - " Gb"; + String.format(getString(R.string.description_used_gb), + formatter.format(AndroidUtils.getUsedSpaceGb(dir))); externalStorageDir.setSummary(summary); } diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java index 866fd18ed3..6180c2d3cb 100644 --- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java @@ -95,7 +95,8 @@ public class ChangeDataStorageBottomSheet extends BasePreferenceBottomSheet { //buttons View btnDontMoveView = View.inflate(ctx, R.layout.bottom_sheet_big_dialog_button_with_icon, null); - requiredMyApplication().getUIUtilities().setupDialogButtonWithIcon(nightMode, btnDontMoveView, UiUtilities.DialogButtonType.SECONDARY, getString(R.string.dont_move_maps), currentDirectory.getIconResId()); + UiUtilities.setupDialogButton(nightMode, btnDontMoveView, UiUtilities.DialogButtonType.SECONDARY, + getString(R.string.dont_move_maps), currentDirectory.getIconResId()); BaseBottomSheetItem btnDontMove = new BaseBottomSheetItem.Builder() .setCustomView(btnDontMoveView) .setOnClickListener(new View.OnClickListener() { @@ -108,7 +109,8 @@ public class ChangeDataStorageBottomSheet extends BasePreferenceBottomSheet { items.add(btnDontMove); View btnMoveView = View.inflate(ctx, R.layout.bottom_sheet_big_dialog_button_with_icon, null); - requiredMyApplication().getUIUtilities().setupDialogButtonWithIcon(nightMode, btnMoveView, UiUtilities.DialogButtonType.PRIMARY, getString(R.string.move_maps_to_new_destination), R.drawable.ic_action_folder_move); + UiUtilities.setupDialogButton(nightMode, btnMoveView, UiUtilities.DialogButtonType.PRIMARY, + getString(R.string.move_maps_to_new_destination), R.drawable.ic_action_folder_move); BaseBottomSheetItem btnMove = new BaseBottomSheetItem.Builder() .setCustomView(btnMoveView) .setOnClickListener(new View.OnClickListener() { @@ -121,7 +123,8 @@ public class ChangeDataStorageBottomSheet extends BasePreferenceBottomSheet { items.add(btnMove); View btnCloseView = View.inflate(ctx, R.layout.bottom_sheet_big_dialog_button_with_icon, null); - requiredMyApplication().getUIUtilities().setupDialogButtonWithIcon(nightMode, btnCloseView, UiUtilities.DialogButtonType.SECONDARY, getString(R.string.shared_string_cancel), R.drawable.ic_action_undo_dark); + UiUtilities.setupDialogButton(nightMode, btnCloseView, UiUtilities.DialogButtonType.SECONDARY, + getString(R.string.shared_string_cancel), R.drawable.ic_action_undo_dark); BaseBottomSheetItem btnClose = new BaseBottomSheetItem.Builder() .setCustomView(btnCloseView) .setOnClickListener(new View.OnClickListener() { diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java index 61165d9621..1686158991 100644 --- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java @@ -147,46 +147,6 @@ public class SelectFolderBottomSheet extends BasePreferenceBottomSheet { } } - /*@TargetApi(Build.VERSION_CODES.LOLLIPOP) - private void openDocumentTree() { - Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); - if (currentPath != null) { - Uri uri = Uri.fromFile(new File(currentPath)); - } - startActivityForResult(intent, CHOOSE_FOLDER_REQUEST_CODE); - }*/ - - - /*@Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (resultCode != RESULT_OK) { - return; - } - Uri result = data.getData(); - if (result == null) { - return; - } - if (requestCode == CHOOSE_FOLDER_REQUEST_CODE) { - DocumentFile documentFile = DocumentFile.fromTreeUri(getContext(), result); - File f = null; - try { - f = FileUtil.from(getContext(), documentFile.getUri()); - } catch (IOException e) { - e.printStackTrace(); - } - Toast.makeText(getMyApplication(), f.getAbsolutePath(), Toast.LENGTH_LONG).show(); - for (DocumentFile file : documentFile.listFiles()) { - if (file.isDirectory()) { - Toast.makeText(getMyApplication(), file.getName(), Toast.LENGTH_SHORT).show(); - etWasFocused = true; - editText.setText(file.getName()); - break; - } - } - } - super.onActivityResult(requestCode, resultCode, data); - }*/ - @Override protected int getDismissButtonTextId() { return R.string.shared_string_close; @@ -241,104 +201,4 @@ public class SelectFolderBottomSheet extends BasePreferenceBottomSheet { this.btnTitle = btnTitle; } - - - - - - - /*private static class FileUtil { - private static final int EOF = -1; - private static final int DEFAULT_BUFFER_SIZE = 1024 * 4; - - private FileUtil() { - - } - - public static File from(Context context, Uri uri) throws IOException { - InputStream inputStream = context.getContentResolver().openInputStream(uri); - String fileName = getFileName(context, uri); - String[] splitName = splitFileName(fileName); - File tempFile = File.createTempFile(splitName[0], splitName[1]); - tempFile = rename(tempFile, fileName); - tempFile.deleteOnExit(); - FileOutputStream out = null; - try { - out = new FileOutputStream(tempFile); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - if (inputStream != null) { - copy(inputStream, out); - inputStream.close(); - } - - if (out != null) { - out.close(); - } - return tempFile; - } - - private static String[] splitFileName(String fileName) { - String name = fileName; - String extension = ""; - int i = fileName.lastIndexOf("."); - if (i != -1) { - name = fileName.substring(0, i); - extension = fileName.substring(i); - } - - return new String[]{name, extension}; - } - - private static String getFileName(Context context, Uri uri) { - String result = null; - if (uri.getScheme().equals("content")) { - Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); - try { - if (cursor != null && cursor.moveToFirst()) { - result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (cursor != null) { - cursor.close(); - } - } - } - if (result == null) { - result = uri.getPath(); - int cut = result.lastIndexOf(File.separator); - if (cut != -1) { - result = result.substring(cut + 1); - } - } - return result; - } - - private static File rename(File file, String newName) { - File newFile = new File(file.getParent(), newName); - if (!newFile.equals(file)) { - if (newFile.exists() && newFile.delete()) { -// Log.d("FileUtil", "Delete old " + newName + " file"); - } - if (file.renameTo(newFile)) { -// Log.d("FileUtil", "Rename file to " + newName); - } - } - return newFile; - } - - private static long copy(InputStream input, OutputStream output) throws IOException { - long count = 0; - int n; - byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; - while (EOF != (n = input.read(buffer))) { - output.write(buffer, 0, n); - count += n; - } - return count; - } - }*/ } From 60026f3a423cdd9dec2355f2ea2abd6554c1a73b Mon Sep 17 00:00:00 2001 From: Dmitry Date: Fri, 4 Oct 2019 17:57:08 +0300 Subject: [PATCH 03/34] Change string translation --- OsmAnd/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index f79aeb24ff..43107afd94 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -3247,7 +3247,7 @@ Карта во время навигации Карта во время навигации Вес, высота, скорость - Параметры автомобиля + Параметры транспортного средства Голосовые объявления воспроизводятся только во время навигации. Навигационные инструкции и объявления Голосовые объявления From 90daf2293e67354bae0e8d74306da9e47eb9776d Mon Sep 17 00:00:00 2001 From: max-klaus Date: Fri, 4 Oct 2019 18:39:14 +0300 Subject: [PATCH 04/34] Added new download card --- .../java/net/osmand/map/OsmandRegions.java | 4 + OsmAnd/res/drawable/bg_top_menu_dark.xml | 13 ++ OsmAnd/res/drawable/bg_top_menu_light.xml | 13 ++ ..._top_sheet_bottom_sides_landscape_dark.xml | 13 ++ ...top_sheet_bottom_sides_landscape_light.xml | 13 ++ OsmAnd/res/layout-land/map_hud_top.xml | 1 + .../layout/download_detailed_map_widget.xml | 82 +++++++++++ OsmAnd/res/layout/map_hud_top.xml | 3 +- OsmAnd/res/values-large/sizes.xml | 1 + OsmAnd/res/values/sizes.xml | 1 + OsmAnd/res/values/strings.xml | 1 + .../osmand/plus/activities/MapActivity.java | 16 ++- .../plus/activities/MapActivityLayers.java | 2 +- .../ui/DownloadMapToolbarController.java | 135 ++++++++++++++++++ .../plus/views/DownloadedRegionsLayer.java | 96 +++++++++++++ .../net/osmand/plus/views/MapInfoLayer.java | 6 + .../mapwidgets/MapInfoWidgetsFactory.java | 74 +++++++--- 17 files changed, 452 insertions(+), 22 deletions(-) create mode 100644 OsmAnd/res/drawable/bg_top_menu_dark.xml create mode 100644 OsmAnd/res/drawable/bg_top_menu_light.xml create mode 100644 OsmAnd/res/drawable/bg_top_sheet_bottom_sides_landscape_dark.xml create mode 100644 OsmAnd/res/drawable/bg_top_sheet_bottom_sides_landscape_light.xml create mode 100644 OsmAnd/res/layout/download_detailed_map_widget.xml create mode 100644 OsmAnd/src/net/osmand/plus/download/ui/DownloadMapToolbarController.java diff --git a/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java b/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java index 13f3ed42f1..ca7e67ab43 100644 --- a/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java +++ b/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java @@ -707,6 +707,10 @@ public class OsmandRegions { public BinaryMapDataObject getSmallestBinaryMapDataObjectAt(LatLon latLon) throws IOException { List mapDataObjects = getBinaryMapDataObjectsAt(latLon); + return getSmallestBinaryMapDataObjectAt(mapDataObjects); + } + + public BinaryMapDataObject getSmallestBinaryMapDataObjectAt(List mapDataObjects) { BinaryMapDataObject res = null; double smallestArea = -1; for (BinaryMapDataObject o : mapDataObjects) { diff --git a/OsmAnd/res/drawable/bg_top_menu_dark.xml b/OsmAnd/res/drawable/bg_top_menu_dark.xml new file mode 100644 index 0000000000..2ef9d04f24 --- /dev/null +++ b/OsmAnd/res/drawable/bg_top_menu_dark.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/bg_top_menu_light.xml b/OsmAnd/res/drawable/bg_top_menu_light.xml new file mode 100644 index 0000000000..0bc7186f50 --- /dev/null +++ b/OsmAnd/res/drawable/bg_top_menu_light.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/bg_top_sheet_bottom_sides_landscape_dark.xml b/OsmAnd/res/drawable/bg_top_sheet_bottom_sides_landscape_dark.xml new file mode 100644 index 0000000000..7abde0796c --- /dev/null +++ b/OsmAnd/res/drawable/bg_top_sheet_bottom_sides_landscape_dark.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/bg_top_sheet_bottom_sides_landscape_light.xml b/OsmAnd/res/drawable/bg_top_sheet_bottom_sides_landscape_light.xml new file mode 100644 index 0000000000..ff0f70412f --- /dev/null +++ b/OsmAnd/res/drawable/bg_top_sheet_bottom_sides_landscape_light.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout-land/map_hud_top.xml b/OsmAnd/res/layout-land/map_hud_top.xml index 55bc73daac..268fc0bf0e 100644 --- a/OsmAnd/res/layout-land/map_hud_top.xml +++ b/OsmAnd/res/layout-land/map_hud_top.xml @@ -606,6 +606,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" + android:animateLayoutChanges="true" android:visibility="gone"/> diff --git a/OsmAnd/res/layout/download_detailed_map_widget.xml b/OsmAnd/res/layout/download_detailed_map_widget.xml new file mode 100644 index 0000000000..51dbd287a9 --- /dev/null +++ b/OsmAnd/res/layout/download_detailed_map_widget.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/map_hud_top.xml b/OsmAnd/res/layout/map_hud_top.xml index d3f48efd91..4bed940040 100644 --- a/OsmAnd/res/layout/map_hud_top.xml +++ b/OsmAnd/res/layout/map_hud_top.xml @@ -383,7 +383,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:visibility="gone"/> + android:animateLayoutChanges="true" + android:visibility="gone"/> + 42dp 120dp 35sp 33sp diff --git a/OsmAnd/res/values/sizes.xml b/OsmAnd/res/values/sizes.xml index 5ec78f9bce..f1b65b58c8 100644 --- a/OsmAnd/res/values/sizes.xml +++ b/OsmAnd/res/values/sizes.xml @@ -1,6 +1,7 @@ + 28dp 16dp 60dp 72dp diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index f81ba0fc96..5a481e052d 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,6 +11,7 @@ Thx - Hardy --> + Download detailed %s map, to view this area. By default Plugin settings Logcat buffer diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 00dd5af656..a260a8310b 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -973,9 +973,10 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven } int color = TopToolbarController.NO_COLOR; boolean mapControlsVisible = findViewById(R.id.MapHudButtonsOverlay).getVisibility() == View.VISIBLE; + boolean topToolbarVisible = getMapLayers().getMapInfoLayer().isTopToolbarViewVisible(); boolean night = app.getDaynightHelper().isNightModeForMapControls(); TopToolbarController toolbarController = getMapLayers().getMapInfoLayer().getTopToolbarController(); - if (toolbarController != null && mapControlsVisible) { + if (toolbarController != null && mapControlsVisible && topToolbarVisible) { color = toolbarController.getStatusBarColor(this, night); } if (color == TopToolbarController.NO_COLOR) { @@ -2265,23 +2266,30 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven return mapInfoLayer.hasTopToolbar(); } - public TopToolbarController getTopToolbarController(TopToolbarControllerType type) { + public TopToolbarController getTopToolbarController(@NonNull TopToolbarControllerType type) { MapInfoLayer mapInfoLayer = getMapLayers().getMapInfoLayer(); return mapInfoLayer.getTopToolbarController(type); } - public void showTopToolbar(TopToolbarController controller) { + public void showTopToolbar(@NonNull TopToolbarController controller) { MapInfoLayer mapInfoLayer = getMapLayers().getMapInfoLayer(); mapInfoLayer.addTopToolbarController(controller); updateStatusBarColor(); } - public void hideTopToolbar(TopToolbarController controller) { + public void hideTopToolbar(@NonNull TopToolbarController controller) { MapInfoLayer mapInfoLayer = getMapLayers().getMapInfoLayer(); mapInfoLayer.removeTopToolbarController(controller); updateStatusBarColor(); } + public void hideTopToolbar(@NonNull TopToolbarControllerType type) { + TopToolbarController controller = getTopToolbarController(type); + if (controller != null) { + hideTopToolbar(controller); + } + } + public void registerActivityResultListener(ActivityResultListener listener) { activityResultListeners.add(listener); } diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityLayers.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityLayers.java index 8c10132637..71849b7298 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityLayers.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityLayers.java @@ -133,7 +133,7 @@ public class MapActivityLayers { mapVectorLayer = new MapVectorLayer(mapTileLayer, false); mapView.addLayer(mapVectorLayer, 0.5f); - downloadedRegionsLayer = new DownloadedRegionsLayer(); + downloadedRegionsLayer = new DownloadedRegionsLayer(activity); mapView.addLayer(downloadedRegionsLayer, 0.5f); // 0.9 gpx layer diff --git a/OsmAnd/src/net/osmand/plus/download/ui/DownloadMapToolbarController.java b/OsmAnd/src/net/osmand/plus/download/ui/DownloadMapToolbarController.java new file mode 100644 index 0000000000..a7c04b2882 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/download/ui/DownloadMapToolbarController.java @@ -0,0 +1,135 @@ +package net.osmand.plus.download.ui; + +import android.content.Context; +import android.graphics.Typeface; +import android.support.annotation.DrawableRes; +import android.support.annotation.NonNull; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.view.ContextThemeWrapper; +import android.view.View; +import android.widget.TextView; + +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.download.DownloadValidationManager; +import net.osmand.plus.download.IndexItem; +import net.osmand.plus.helpers.AndroidUiHelper; +import net.osmand.plus.helpers.FontCache; +import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController; +import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarControllerType; +import net.osmand.plus.widgets.style.CustomTypefaceSpan; + +public class DownloadMapToolbarController extends TopToolbarController { + + private MapActivity mapActivity; + private DownloadValidationManager downloadValidationManager; + + private boolean nightMode; + + private View btnClose; + private View btnDownload; + private TextView tvDescription; + private TextView tvSize; + + private IndexItem indexItem; + private String regionName; + + private static String lastProcessedRegionName; + + public DownloadMapToolbarController(@NonNull MapActivity mapActivity, @NonNull IndexItem indexItem, @NonNull String regionName) { + super(TopToolbarControllerType.DOWNLOAD_MAP); + this.mapActivity = mapActivity; + this.indexItem = indexItem; + this.regionName = regionName; + + OsmandApplication app = mapActivity.getMyApplication(); + downloadValidationManager = new DownloadValidationManager(app); + nightMode = app.getDaynightHelper().isNightModeForMapControls(); + int themeRes = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme; + View mainView = View.inflate(new ContextThemeWrapper(mapActivity, themeRes), R.layout.download_detailed_map_widget, null); + + if (!AndroidUiHelper.isOrientationPortrait(mapActivity)) { + mainView.setBackgroundResource(getLandscapeBottomSidesBgResId()); + } else { + mainView.setBackgroundResource(getPortraitBgResId()); + } + + tvDescription = mainView.findViewById(R.id.description); + tvSize = mainView.findViewById(R.id.fileSize); + btnClose = mainView.findViewById(R.id.btnClose); + btnDownload = mainView.findViewById(R.id.btnDownload); + + UiUtilities.setupDialogButton(nightMode, btnClose, UiUtilities.DialogButtonType.SECONDARY, mapActivity.getString(R.string.shared_string_close)); + UiUtilities.setupDialogButton(nightMode, btnDownload, UiUtilities.DialogButtonType.PRIMARY, mapActivity.getString(R.string.shared_string_download)); + + refreshView(); + + setBottomView(mainView); + setTopViewVisible(false); + setShadowViewVisible(false); + } + + public static String getLastProcessedRegionName() { + return lastProcessedRegionName; + } + + public IndexItem getIndexItem() { + return indexItem; + } + + public String getRegionName() { + return regionName; + } + + private void refreshView() { + if (regionName != null) { + String descriptionText = String.format(mapActivity.getString(R.string.download_detailed_map), regionName); + int startIndex = descriptionText.indexOf(regionName); + int endIndex = startIndex + regionName.length(); + + SpannableStringBuilder description = new SpannableStringBuilder(descriptionText); + Typeface typeface = FontCache.getRobotoMedium(mapActivity); + description.setSpan(new CustomTypefaceSpan(typeface), startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + + tvDescription.setText(description); + } + + if (indexItem != null) { + String size = indexItem.getSizeDescription(mapActivity); + tvSize.setText(size); + + btnDownload.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + downloadValidationManager.startDownload(mapActivity, indexItem); + dismiss(); + } + }); + } + + btnClose.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + } + }); + } + + private void dismiss() { + lastProcessedRegionName = regionName; + mapActivity.hideTopToolbar(DownloadMapToolbarController.this); + } + + @DrawableRes + private int getPortraitBgResId() { + return nightMode ? R.drawable.bg_top_menu_dark : R.drawable.bg_top_menu_light; + } + + @DrawableRes + private int getLandscapeBottomSidesBgResId() { + return nightMode ? R.drawable.bg_top_sheet_bottom_sides_landscape_dark : R.drawable.bg_top_sheet_bottom_sides_landscape_light; + } +} diff --git a/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java b/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java index d4d52b7418..4424461c50 100644 --- a/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java @@ -8,6 +8,7 @@ import android.graphics.Paint.Join; import android.graphics.Paint.Style; import android.graphics.Path; import android.graphics.PointF; +import android.support.annotation.NonNull; import android.text.TextPaint; import android.util.DisplayMetrics; import android.view.WindowManager; @@ -26,12 +27,16 @@ import net.osmand.plus.activities.LocalIndexHelper; import net.osmand.plus.activities.LocalIndexInfo; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.download.DownloadActivityType; +import net.osmand.plus.download.DownloadIndexesThread; import net.osmand.plus.download.IndexItem; +import net.osmand.plus.download.ui.DownloadMapToolbarController; import net.osmand.plus.mapcontextmenu.MapContextMenu; import net.osmand.plus.mapcontextmenu.other.MapMultiSelectionMenu; import net.osmand.plus.resources.ResourceManager; import net.osmand.plus.views.ContextMenuLayer.IContextMenuProvider; import net.osmand.plus.views.ContextMenuLayer.IContextMenuProviderSelection; +import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController; +import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarControllerType; import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; @@ -50,6 +55,7 @@ public class DownloadedRegionsLayer extends OsmandMapLayer implements IContextMe private static final int ZOOM_THRESHOLD = 2; private OsmandApplication app; + private MapActivity mapActivity; private OsmandMapTileView view; private Paint paintDownloaded; private Path pathDownloaded; @@ -73,6 +79,8 @@ public class DownloadedRegionsLayer extends OsmandMapLayer implements IContextMe private static int ZOOM_TO_SHOW_BORDERS = 7; private static int ZOOM_TO_SHOW_SELECTION_ST = 3; private static int ZOOM_TO_SHOW_SELECTION = 8; + private static int ZOOM_MIN_TO_SHOW_DOWNLOAD_DIALOG = 9; + private static int ZOOM_MAX_TO_SHOW_DOWNLOAD_DIALOG = 11; public static class DownloadMapObject { private BinaryMapDataObject dataObject; @@ -105,6 +113,10 @@ public class DownloadedRegionsLayer extends OsmandMapLayer implements IContextMe } } + public DownloadedRegionsLayer(@NonNull MapActivity mapActivity) { + this.mapActivity = mapActivity; + } + @Override public void initLayer(final OsmandMapTileView view) { this.view = view; @@ -180,6 +192,8 @@ public class DownloadedRegionsLayer extends OsmandMapLayer implements IContextMe if(zoom < ZOOM_TO_SHOW_SELECTION_ST) { return; } + //make sure no maps are loaded for the location + checkMapToDownload(zoom, data.results); // draw objects if (osmandRegions.isInitialized() && zoom >= ZOOM_TO_SHOW_SELECTION_ST && zoom < ZOOM_TO_SHOW_SELECTION) { final List currentObjects = new LinkedList<>(); @@ -217,6 +231,88 @@ public class DownloadedRegionsLayer extends OsmandMapLayer implements IContextMe } } + private void checkMapToDownload(int zoom, List currentObjects) { + if (zoom >= ZOOM_MIN_TO_SHOW_DOWNLOAD_DIALOG && zoom <= ZOOM_MAX_TO_SHOW_DOWNLOAD_DIALOG + && currentObjects != null) { + WorldRegion regionData; + int cx = view.getCurrentRotatedTileBox().getCenter31X(); + int cy = view.getCurrentRotatedTileBox().getCenter31Y(); + for (int i = 0; i < currentObjects.size(); i++) { + final BinaryMapDataObject o = currentObjects.get(i); + if (!osmandRegions.contain(o, cx, cy)) { + continue; + } + String fullName = osmandRegions.getFullName(o); + regionData = osmandRegions.getRegionData(fullName); + if (regionData != null && regionData.isRegionMapDownload()) { + String regionDownloadName = regionData.getRegionDownloadName(); + if (regionDownloadName != null && checkIfObjectDownloaded(regionDownloadName)) { + hideDownloadMapToolbar(); + return; + } + } + } + + IndexItem indexItem = null; + String name = null; + BinaryMapDataObject smallestRegion = app.getRegions().getSmallestBinaryMapDataObjectAt(currentObjects); + if (smallestRegion != null) { + String fullName = osmandRegions.getFullName(smallestRegion); + regionData = osmandRegions.getRegionData(fullName); + + DownloadIndexesThread downloadThread = app.getDownloadThread(); + List indexItems = downloadThread.getIndexes().getIndexItems(regionData); + if (indexItems.size() == 0) { + if (!downloadThread.getIndexes().isDownloadedFromInternet && app.getSettings().isInternetConnectionAvailable()) { + downloadThread.runReloadIndexFilesSilent(); + } + } else { + for (IndexItem item : indexItems) { + if (item.getType() == DownloadActivityType.NORMAL_FILE + && !(item.isDownloaded() || downloadThread.isDownloading(item))) { + indexItem = item; + name = regionData.getLocaleName(); + break; + } + } + } + } + if (indexItem != null && name != null) { + showDownloadMapToolbar(indexItem, name); + } else { + hideDownloadMapToolbar(); + } + } else { + hideDownloadMapToolbar(); + } + } + + private void showDownloadMapToolbar(final @NonNull IndexItem indexItem, final @NonNull String regionName) { + if (!regionName.equals(DownloadMapToolbarController.getLastProcessedRegionName())) { + app.runInUIThread(new Runnable() { + @Override + public void run() { + if (!regionName.equals(DownloadMapToolbarController.getLastProcessedRegionName())) { + TopToolbarController controller = mapActivity.getTopToolbarController(TopToolbarControllerType.DOWNLOAD_MAP); + if (controller == null || !((DownloadMapToolbarController) controller).getRegionName().equals(regionName)) { + controller = new DownloadMapToolbarController(mapActivity, indexItem, regionName); + mapActivity.showTopToolbar(controller); + } + } + } + }); + } + } + + private void hideDownloadMapToolbar() { + app.runInUIThread(new Runnable() { + @Override + public void run() { + mapActivity.hideTopToolbar(TopToolbarControllerType.DOWNLOAD_MAP); + } + }); + } + private void removeObjectsFromList(List list, List objects) { Iterator it = list.iterator(); while (it.hasNext()) { diff --git a/OsmAnd/src/net/osmand/plus/views/MapInfoLayer.java b/OsmAnd/src/net/osmand/plus/views/MapInfoLayer.java index c65611b10d..1fdd1a1e0a 100644 --- a/OsmAnd/src/net/osmand/plus/views/MapInfoLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/MapInfoLayer.java @@ -2,6 +2,7 @@ package net.osmand.plus.views; import android.graphics.Canvas; +import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.view.View; import android.view.View.OnClickListener; @@ -129,10 +130,15 @@ public class MapInfoLayer extends OsmandMapLayer { return topToolbarView == null ? null : topToolbarView.getTopController(); } + @Nullable public TopToolbarController getTopToolbarController(TopToolbarControllerType type) { return topToolbarView == null ? null : topToolbarView.getController(type); } + public boolean isTopToolbarViewVisible() { + return topToolbarView != null && topToolbarView.isTopToolbarViewVisible(); + } + public void registerAllControls(){ RouteInfoWidgetsFactory ric = new RouteInfoWidgetsFactory(); MapInfoWidgetsFactory mic = new MapInfoWidgetsFactory(); diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java index 3385f2eb82..3dc5997513 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java @@ -1,11 +1,13 @@ package net.osmand.plus.views.mapwidgets; +import android.animation.LayoutTransition; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Typeface; import android.graphics.drawable.Drawable; +import android.os.Build; import android.os.Bundle; import android.support.annotation.ColorInt; import android.support.annotation.ColorRes; @@ -19,6 +21,7 @@ import android.support.v7.widget.SwitchCompat; import android.text.ClipboardManager; import android.view.View; import android.view.View.OnClickListener; +import android.view.ViewGroup; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.ImageButton; import android.widget.ImageView; @@ -72,7 +75,8 @@ public class MapInfoWidgetsFactory { TRACK_DETAILS, DISCOUNT, MEASUREMENT_TOOL, - POI_FILTER + POI_FILTER, + DOWNLOAD_MAP } public TextInfoWidget createAltitudeControl(final MapActivity map) { @@ -383,6 +387,10 @@ public class MapInfoWidgetsFactory { Runnable onCloseToolbarListener; View bottomView = null; + boolean topViewVisible = true; + boolean shadowViewVisible = true; + + private boolean bottomViewAdded = false; public TopToolbarController(TopToolbarControllerType type) { this.type = type; @@ -409,6 +417,22 @@ public class MapInfoWidgetsFactory { this.bottomView = bottomView; } + public boolean isTopViewVisible() { + return topViewVisible; + } + + public void setTopViewVisible(boolean topViewVisible) { + this.topViewVisible = topViewVisible; + } + + public boolean isShadowViewVisible() { + return shadowViewVisible; + } + + public void setShadowViewVisible(boolean shadowViewVisible) { + this.shadowViewVisible = shadowViewVisible; + } + public void setSingleLineTitle(boolean singleLineTitle) { this.singleLineTitle = singleLineTitle; } @@ -573,11 +597,14 @@ public class MapInfoWidgetsFactory { AndroidUiHelper.updateVisibility(descrView, false); } if (bottomView != null) { - bottomViewLayout.removeAllViews(); - bottomViewLayout.addView(bottomView); - AndroidUiHelper.updateVisibility(bottomViewLayout, true); + if (!bottomViewAdded) { + bottomViewLayout.removeAllViews(); + bottomViewLayout.addView(bottomView); + bottomViewLayout.setVisibility(View.VISIBLE); + bottomViewAdded = true; + } } else { - AndroidUiHelper.updateVisibility(bottomViewLayout, false); + bottomViewLayout.setVisibility(View.GONE); } AndroidUiHelper.updateVisibility(switchCompat, topBarSwitchVisible); if (topBarSwitchVisible) { @@ -586,8 +613,9 @@ public class MapInfoWidgetsFactory { DrawableCompat.setTint(switchCompat.getTrackDrawable(), ContextCompat.getColor(switchCompat.getContext(), R.color.map_toolbar_switch_track_color)); } } - if (view.getShadowView() != null) { - view.getShadowView().setVisibility(View.VISIBLE); + View shadowView = view.getShadowView(); + if (shadowView != null) { + AndroidUiHelper.updateVisibility(shadowView, isShadowViewVisible()); } } } @@ -638,6 +666,10 @@ public class MapInfoWidgetsFactory { return topbar; } + public boolean isTopToolbarViewVisible() { + return topbar.getVisibility() == View.VISIBLE; + } + public View getTopBarLayout() { return topBarLayout; } @@ -706,6 +738,7 @@ public class MapInfoWidgetsFactory { } } controllers.add(controller); + map.getMapLayers().getMapMarkersLayer().getWidgetsFactory().updateInfo(null, map.getMapView().getZoom()); updateColors(); updateInfo(); } @@ -738,12 +771,15 @@ public class MapInfoWidgetsFactory { initToolbar(defaultController); defaultController.updateToolbar(this); } - AndroidUiHelper.updateVisibility(topbar, controller != null && !MapRouteInfoMenu.chooseRoutesVisible && !MapRouteInfoMenu.waypointsVisible && + boolean updated = AndroidUiHelper.updateVisibility(topbar, controller != null && !MapRouteInfoMenu.chooseRoutesVisible && !MapRouteInfoMenu.waypointsVisible && (!map.getContextMenu().isVisible() || controller.getType() == TopToolbarControllerType.CONTEXT_MENU)); + if (updated) { + map.updateStatusBarColor(); + } } public void updateColors(TopToolbarController controller) { - OsmandApplication app = map.getMyApplication(); + UiUtilities uiUtils = map.getMyApplication().getUIUtilities(); controller.nightMode = nightMode; boolean portrait = AndroidUiHelper.isOrientationPortrait(map); @@ -766,29 +802,35 @@ public class MapInfoWidgetsFactory { int descrTextClrId = nightMode ? controller.descrTextClrDarkId : controller.descrTextClrLightId; int textBtnTitleClr = nightMode ? controller.textBtnTitleClrDark : controller.textBtnTitleClrLight; - if (bg != null) { - topBarLayout.setBackgroundDrawable(bg); + if (controller.isTopViewVisible()) { + if (bg != null) { + topBarLayout.setBackgroundDrawable(bg); + } else { + topBarLayout.setBackgroundResource(bgId); + } + topBarLayout.setVisibility(View.VISIBLE); } else { - topBarLayout.setBackgroundResource(bgId); + topBarLayout.setVisibility(View.GONE); } + if (backBtnIconId == 0) { backButton.setImageDrawable(null); } else { if (backBtnIconClr != -1) { - backButton.setImageDrawable(app.getUIUtilities().getPaintedIcon(backBtnIconId, backBtnIconClr)); + backButton.setImageDrawable(uiUtils.getPaintedIcon(backBtnIconId, backBtnIconClr)); } else { - backButton.setImageDrawable(app.getUIUtilities().getIcon(backBtnIconId, backBtnIconClrId)); + backButton.setImageDrawable(uiUtils.getIcon(backBtnIconId, backBtnIconClrId)); } } if (closeBtnIconId == 0) { closeButton.setImageDrawable(null); } else { - closeButton.setImageDrawable(app.getUIUtilities().getIcon(closeBtnIconId, closeBtnIconClrId)); + closeButton.setImageDrawable(uiUtils.getIcon(closeBtnIconId, closeBtnIconClrId)); } if (refreshBtnIconId == 0) { refreshButton.setImageDrawable(null); } else { - refreshButton.setImageDrawable(app.getUIUtilities().getIcon(refreshBtnIconId, refreshBtnIconClrId)); + refreshButton.setImageDrawable(uiUtils.getIcon(refreshBtnIconId, refreshBtnIconClrId)); } int titleColor = titleTextClr != -1 ? titleTextClr : map.getResources().getColor(titleTextClrId); int descrColor = descrTextClr != -1 ? descrTextClr : map.getResources().getColor(descrTextClrId); From b610ded8fd02d0d349240224323a3493af4c12c2 Mon Sep 17 00:00:00 2001 From: max-klaus <53395422+max-klaus@users.noreply.github.com> Date: Sat, 5 Oct 2019 15:09:35 +0300 Subject: [PATCH 05/34] Revert "Data Storage" --- ...ttom_sheet_big_dialog_button_with_icon.xml | 57 -- .../res/layout/bottom_sheet_dialog_button.xml | 39 +- ...ttom_sheet_item_btn_with_icon_and_text.xml | 45 -- .../res/layout/bottom_sheet_select_folder.xml | 64 -- OsmAnd/res/layout/data_storage_list_item.xml | 122 ---- OsmAnd/res/values/strings.xml | 9 - OsmAnd/res/xml/data_storage.xml | 10 - OsmAnd/res/xml/global_settings.xml | 1 - OsmAnd/src/net/osmand/AndroidUtils.java | 23 - OsmAnd/src/net/osmand/plus/UiUtilities.java | 31 +- .../plus/settings/BaseSettingsFragment.java | 5 +- .../plus/settings/DataStorageFragment.java | 566 ------------------ .../plus/settings/DataStorageItemsHolder.java | 200 ------- .../plus/settings/DataStorageMenuItem.java | 169 ------ .../plus/settings/GlobalSettingsFragment.java | 16 +- .../ChangeDataStorageBottomSheet.java | 202 ------- .../bottomsheets/SelectFolderBottomSheet.java | 204 ------- 17 files changed, 26 insertions(+), 1737 deletions(-) delete mode 100644 OsmAnd/res/layout/bottom_sheet_big_dialog_button_with_icon.xml delete mode 100644 OsmAnd/res/layout/bottom_sheet_item_btn_with_icon_and_text.xml delete mode 100644 OsmAnd/res/layout/bottom_sheet_select_folder.xml delete mode 100644 OsmAnd/res/layout/data_storage_list_item.xml delete mode 100644 OsmAnd/res/xml/data_storage.xml delete mode 100644 OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java delete mode 100644 OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java delete mode 100644 OsmAnd/src/net/osmand/plus/settings/DataStorageMenuItem.java delete mode 100644 OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java delete mode 100644 OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java diff --git a/OsmAnd/res/layout/bottom_sheet_big_dialog_button_with_icon.xml b/OsmAnd/res/layout/bottom_sheet_big_dialog_button_with_icon.xml deleted file mode 100644 index 8e988a80af..0000000000 --- a/OsmAnd/res/layout/bottom_sheet_big_dialog_button_with_icon.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/OsmAnd/res/layout/bottom_sheet_dialog_button.xml b/OsmAnd/res/layout/bottom_sheet_dialog_button.xml index b277cfbcab..34dfd832f4 100644 --- a/OsmAnd/res/layout/bottom_sheet_dialog_button.xml +++ b/OsmAnd/res/layout/bottom_sheet_dialog_button.xml @@ -1,36 +1,29 @@ + android:layout_weight="1"> - + android:layout_height="match_parent" + tools:ignore="UselessParent"> - + android:paddingLeft="@dimen/content_padding_small" + android:paddingRight="@dimen/content_padding_small" + android:gravity="center" + android:textSize="@dimen/default_desc_text_size" + osmand:typeface="@string/font_roboto_medium" + tools:text="Button" /> - - - - - + \ No newline at end of file diff --git a/OsmAnd/res/layout/bottom_sheet_item_btn_with_icon_and_text.xml b/OsmAnd/res/layout/bottom_sheet_item_btn_with_icon_and_text.xml deleted file mode 100644 index 6adcae70ac..0000000000 --- a/OsmAnd/res/layout/bottom_sheet_item_btn_with_icon_and_text.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/OsmAnd/res/layout/bottom_sheet_select_folder.xml b/OsmAnd/res/layout/bottom_sheet_select_folder.xml deleted file mode 100644 index cf26b881e5..0000000000 --- a/OsmAnd/res/layout/bottom_sheet_select_folder.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OsmAnd/res/layout/data_storage_list_item.xml b/OsmAnd/res/layout/data_storage_list_item.xml deleted file mode 100644 index 2efd2d799a..0000000000 --- a/OsmAnd/res/layout/data_storage_list_item.xml +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 7c5c1412f0..5a481e052d 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,17 +11,8 @@ Thx - Hardy --> - Used %1$s GB - %1$s / %2$s GB Download detailed %s map, to view this area. By default - Enter path to the folder - Select folder - Paste path to the folder with OsmAnd data - Change OsmAnd data folder? - Move to the new destination - Internal storage, hiden from user and other apps, so noone exept OsmAnd can’t get access to your data - Change data storage folder Plugin settings Logcat buffer Application profile changed to \"%s\" diff --git a/OsmAnd/res/xml/data_storage.xml b/OsmAnd/res/xml/data_storage.xml deleted file mode 100644 index 1179f2d841..0000000000 --- a/OsmAnd/res/xml/data_storage.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/OsmAnd/res/xml/global_settings.xml b/OsmAnd/res/xml/global_settings.xml index 2e95524c79..5194192ab7 100644 --- a/OsmAnd/res/xml/global_settings.xml +++ b/OsmAnd/res/xml/global_settings.xml @@ -21,7 +21,6 @@ android:layout="@layout/preference_with_descr" android:persistent="false" android:title="@string/application_dir" - app:fragment="net.osmand.plus.settings.DataStorageFragment" tools:icon="@drawable/ic_action_folder" /> = Build.VERSION_CODES.LOLLIPOP; View buttonContainer = buttonView.findViewById(R.id.button_container); - View secondaryBtnContainer = buttonView.findViewById(R.id.secondary_btn_container); - - int iconAndTextNormalColor = -1; - int iconAndTextPressedColor = -1; - switch (buttonType) { case PRIMARY: if (v21) { AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.ripple_solid_light, R.drawable.ripple_solid_dark); } - AndroidUtils.setBackground(ctx, secondaryBtnContainer, nightMode, R.drawable.dlg_btn_primary_light, R.drawable.dlg_btn_primary_dark); - iconAndTextNormalColor = nightMode ? R.color.dlg_btn_primary_text_dark : R.color.dlg_btn_primary_text_light; - iconAndTextPressedColor = iconAndTextNormalColor; + AndroidUtils.setBackground(ctx, buttonView, nightMode, R.drawable.dlg_btn_primary_light, R.drawable.dlg_btn_primary_dark); + buttonTextView.setTextColor(ContextCompat.getColorStateList(ctx, nightMode ? R.color.dlg_btn_primary_text_dark : R.color.dlg_btn_primary_text_light)); break; case SECONDARY: if (v21) { AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.ripple_solid_light, R.drawable.ripple_solid_dark); } - AndroidUtils.setBackground(ctx, secondaryBtnContainer, nightMode, R.drawable.dlg_btn_secondary_light, R.drawable.dlg_btn_secondary_dark); - iconAndTextNormalColor = nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light; - iconAndTextPressedColor = nightMode ? R.color.dlg_btn_primary_text_dark : R.color.dlg_btn_primary_text_light; + AndroidUtils.setBackground(ctx, buttonView, nightMode, R.drawable.dlg_btn_secondary_light, R.drawable.dlg_btn_secondary_dark); + buttonTextView.setTextColor(ContextCompat.getColorStateList(ctx, nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light)); break; case STROKED: if (v21) { AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.ripple_light, R.drawable.ripple_dark); } - AndroidUtils.setBackground(ctx, secondaryBtnContainer, nightMode, R.drawable.dlg_btn_stroked_light, R.drawable.dlg_btn_stroked_dark); - iconAndTextNormalColor = nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light; - iconAndTextPressedColor = nightMode ? R.color.dlg_btn_primary_text_dark : R.color.dlg_btn_primary_text_light; + AndroidUtils.setBackground(ctx, buttonView, nightMode, R.drawable.dlg_btn_stroked_light, R.drawable.dlg_btn_stroked_dark); + buttonTextView.setTextColor(ContextCompat.getColorStateList(ctx, nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light)); break; } buttonTextView.setText(buttonText); - buttonTextView.setTextColor(ContextCompat.getColorStateList(ctx, iconAndTextNormalColor)); buttonTextView.setEnabled(buttonView.isEnabled()); - if (iconResId != -1) { - Drawable iconNormal = tintDrawable(ContextCompat.getDrawable(ctx, iconResId), ContextCompat.getColor(ctx, iconAndTextNormalColor)); - Drawable iconPressed = tintDrawable(ContextCompat.getDrawable(ctx, iconResId), ContextCompat.getColor(ctx, iconAndTextPressedColor)); - ImageView img = buttonView.findViewById(R.id.button_icon); - img.setImageDrawable(AndroidUtils.createPressedStateListDrawable(iconNormal, iconPressed)); - } } public static Context getThemedContext(Context context, boolean nightMode) { diff --git a/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java index 97f2245695..2163069af1 100644 --- a/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java @@ -93,8 +93,7 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat impl VOICE_ANNOUNCES(VoiceAnnouncesFragment.class.getName(), true, R.xml.voice_announces, R.layout.profile_preference_toolbar_with_switch), VEHICLE_PARAMETERS(VehicleParametersFragment.class.getName(), true, R.xml.vehicle_parameters, R.layout.profile_preference_toolbar), MAP_DURING_NAVIGATION(MapDuringNavigationFragment.class.getName(), true, R.xml.map_during_navigation, R.layout.profile_preference_toolbar), - TURN_SCREEN_ON(TurnScreenOnFragment.class.getName(), true, R.xml.turn_screen_on, R.layout.profile_preference_toolbar_with_switch), - DATA_STORAGE(DataStorageFragment.class.getName(), false, R.xml.data_storage, R.layout.global_preference_toolbar); + TURN_SCREEN_ON(TurnScreenOnFragment.class.getName(), true, R.xml.turn_screen_on, R.layout.profile_preference_toolbar_with_switch); public final String fragmentName; public final boolean profileDependent; @@ -120,7 +119,7 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat impl @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { getPreferenceManager().setPreferenceDataStore(settings.getDataStore()); - } + } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { diff --git a/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java b/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java deleted file mode 100644 index f14199a9c0..0000000000 --- a/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java +++ /dev/null @@ -1,566 +0,0 @@ -package net.osmand.plus.settings; - -import android.Manifest; -import android.annotation.SuppressLint; -import android.app.Activity; -import android.app.ProgressDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.graphics.drawable.Drawable; -import android.os.AsyncTask; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.support.v7.app.AlertDialog; -import android.support.v7.preference.CheckBoxPreference; -import android.support.v7.preference.Preference; -import android.support.v7.preference.PreferenceScreen; -import android.support.v7.preference.PreferenceViewHolder; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import net.osmand.AndroidUtils; -import net.osmand.plus.OsmandApplication; -import net.osmand.plus.OsmandSettings; -import net.osmand.plus.ProgressImplementation; -import net.osmand.plus.R; -import net.osmand.plus.UiUtilities; -import net.osmand.plus.activities.OsmandActionBarActivity; -import net.osmand.plus.download.DownloadActivity; -import net.osmand.plus.settings.bottomsheets.ChangeDataStorageBottomSheet; -import net.osmand.plus.settings.bottomsheets.SelectFolderBottomSheet; -import net.osmand.util.Algorithms; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.lang.ref.WeakReference; -import java.text.DecimalFormat; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Locale; - -import static net.osmand.plus.settings.DataStorageItemsHolder.INTERNAL_STORAGE; -import static net.osmand.plus.settings.DataStorageItemsHolder.MANUALLY_SPECIFIED; -import static net.osmand.plus.settings.bottomsheets.ChangeDataStorageBottomSheet.CHOSEN_DIRECTORY; -import static net.osmand.plus.settings.bottomsheets.ChangeDataStorageBottomSheet.MOVE_DATA; -import static net.osmand.plus.settings.bottomsheets.SelectFolderBottomSheet.PATH_CHANGED; -import static net.osmand.plus.settings.bottomsheets.SelectFolderBottomSheet.NEW_PATH; - -public class DataStorageFragment extends BaseSettingsFragment { - - private final static String CHANGE_DIRECTORY_BUTTON = "change_directory"; - - private ArrayList menuItems; - private ArrayList dataStorageRadioButtonsGroup; - private Preference changeButton; - private DataStorageMenuItem currentDataStorage; - private String tmpManuallySpecifiedPath; - private DataStorageItemsHolder itemsHolder; - - private OsmandApplication app; - private OsmandActionBarActivity activity; - private OsmandSettings settings; - - @Override - protected void setupPreferences() { - app = getMyApplication(); - activity = getMyActivity(); - PreferenceScreen screen = getPreferenceScreen(); - - if (screen == null || app == null || activity == null) { - return; - } - settings = app.getSettings(); - - itemsHolder = DataStorageItemsHolder.refreshInfo(app); - menuItems = itemsHolder.getStorageItems(); - dataStorageRadioButtonsGroup = new ArrayList<>(); - - for (DataStorageMenuItem item : menuItems) { - CheckBoxPreference preference = new CheckBoxPreference(activity); - preference.setKey(item.getKey()); - preference.setTitle(item.getTitle()); - preference.setIcon(item.getIconResId()); - preference.setLayoutResource(R.layout.data_storage_list_item); - screen.addPreference(preference); - dataStorageRadioButtonsGroup.add(preference); - } - - currentDataStorage = itemsHolder.getCurrentStorage(); - - changeButton = new Preference(app); - changeButton.setKey(CHANGE_DIRECTORY_BUTTON); - changeButton.setLayoutResource(R.layout.bottom_sheet_item_btn_with_icon_and_text); - screen.addPreference(changeButton); - - updateView(currentDataStorage.getKey()); - } - - @Override - public boolean onPreferenceClick(Preference preference) { - if (CHANGE_DIRECTORY_BUTTON.equals(preference.getKey())) { - showFolderSelectionDialog(); - return false; - } - return super.onPreferenceClick(preference); - } - - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - super.onPreferenceChange(preference, newValue); - - if (newValue instanceof Bundle) { - //results from BottomSheets - Bundle resultData = (Bundle) newValue; - if (resultData.containsKey(ChangeDataStorageBottomSheet.TAG)) { - boolean moveMaps = resultData.getBoolean(MOVE_DATA); - DataStorageMenuItem newDataStorage = resultData.getParcelable(CHOSEN_DIRECTORY); - if (newDataStorage != null) { - if (tmpManuallySpecifiedPath != null) { - String directory = tmpManuallySpecifiedPath; - tmpManuallySpecifiedPath = null; - newDataStorage.setDirectory(directory); - } - if (moveMaps) { - moveData(currentDataStorage, newDataStorage); - } else { - confirm(app, activity, newDataStorage, false); - } - } - } else if (resultData.containsKey(SelectFolderBottomSheet.TAG)) { - boolean pathChanged = resultData.getBoolean(PATH_CHANGED); - if (pathChanged) { - tmpManuallySpecifiedPath = resultData.getString(NEW_PATH); - if (tmpManuallySpecifiedPath != null) { - DataStorageMenuItem manuallySpecified = null; - try { - manuallySpecified = (DataStorageMenuItem) itemsHolder.getManuallySpecified().clone(); - manuallySpecified.setDirectory(tmpManuallySpecifiedPath); - } catch (CloneNotSupportedException e) { - return false; - } - ChangeDataStorageBottomSheet.showInstance(getFragmentManager(), MANUALLY_SPECIFIED, - currentDataStorage, manuallySpecified, this, false); - } - } - } - } else { - //show necessary dialog - String key = preference.getKey(); - if (key != null) { - DataStorageMenuItem newDataStorage = itemsHolder.getStorage(key); - if (newDataStorage != null) { - if (!currentDataStorage.getKey().equals(newDataStorage.getKey())) { - if (newDataStorage.getType() == OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT - && !DownloadActivity.hasPermissionToWriteExternalStorage(activity)) { - ActivityCompat.requestPermissions(activity, - new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, - DownloadActivity.PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); - } else if (key.equals(MANUALLY_SPECIFIED)) { - showFolderSelectionDialog(); - } else { - ChangeDataStorageBottomSheet.showInstance(getFragmentManager(), key, - currentDataStorage, newDataStorage, DataStorageFragment.this, false); - } - } - } - } - } - return false; - } - - @Override - protected void onBindPreferenceViewHolder(Preference preference, PreferenceViewHolder holder) { - super.onBindPreferenceViewHolder(preference, holder); - String key = preference.getKey(); - if (key == null) { - return; - } - View itemView = holder.itemView; - if (preference instanceof CheckBoxPreference) { - DataStorageMenuItem item = itemsHolder.getStorage(key); - if (item != null) { - TextView tvTitle = itemView.findViewById(android.R.id.title); - TextView tvSummary = itemView.findViewById(R.id.summary); - TextView tvAdditionalDescription = itemView.findViewById(R.id.additionalDescription); - ImageView icon = itemView.findViewById(android.R.id.icon); - View divider = itemView.findViewById(R.id.divider); - View secondPart = itemView.findViewById(R.id.secondPart); - - tvTitle.setText(item.getTitle()); - icon.setImageResource(item.getIconResId()); - - String currentKey = item.getKey(); - - if (currentKey.equals(MANUALLY_SPECIFIED)) { - tvSummary.setText(item.getDirectory()); - secondPart.setVisibility(View.GONE); - tvAdditionalDescription.setVisibility(View.GONE); - divider.setVisibility(View.GONE); - } else { - tvAdditionalDescription.setVisibility(View.VISIBLE); - divider.setVisibility(View.VISIBLE); - secondPart.setVisibility(View.VISIBLE); - String space = getSpaceDescription(item.getDirectory()); - tvSummary.setText(space); - if (currentKey.equals(INTERNAL_STORAGE)) { - tvAdditionalDescription.setText(item.getDescription()); - } else { - tvAdditionalDescription.setText(item.getDirectory()); - } - } - } - } else if (key.equals(CHANGE_DIRECTORY_BUTTON)) { - ImageView icon = itemView.findViewById(R.id.button_icon); - TextView title = itemView.findViewById(R.id.button_text); - int colorResId = isNightMode() ? R.color.active_color_primary_dark : R.color.active_color_primary_light; - int color = ContextCompat.getColor(app, colorResId); - Drawable drawable = UiUtilities.getColoredSelectableDrawable(app, color, 0.3f); - AndroidUtils.setBackground(itemView, drawable); - icon.setVisibility(View.INVISIBLE); - title.setText(R.string.shared_string_change); - } - } - - private void updateView(String key) { - //selection set up - for (CheckBoxPreference preference : dataStorageRadioButtonsGroup) { - String preferenceKey = preference.getKey(); - boolean checked = preferenceKey != null && preferenceKey.equals(key); - preference.setChecked(checked); - } - boolean visible = key.equals(MANUALLY_SPECIFIED); - changeButton.setVisible(visible); - } - - private void showFolderSelectionDialog() { - DataStorageMenuItem manuallySpecified = itemsHolder.getManuallySpecified(); - if (manuallySpecified != null) { - SelectFolderBottomSheet.showInstance(getFragmentManager(), manuallySpecified.getKey(), - manuallySpecified.getDirectory(), DataStorageFragment.this, - getString(R.string.storage_directory_manual), getString(R.string.paste_Osmand_data_folder_path), - getString(R.string.shared_string_select_folder), false); - } - } - - private void moveData(final DataStorageMenuItem currentStorage, final DataStorageMenuItem newStorage) { - File fromDirectory = new File(currentStorage.getDirectory()); - File toDirectory = new File(newStorage.getDirectory()); - @SuppressLint("StaticFieldLeak") - MoveFilesToDifferentDirectory task = new MoveFilesToDifferentDirectory(activity, fromDirectory, toDirectory) { - - private MessageFormat formatMb = new MessageFormat("{0, number,##.#} MB", Locale.US); - - @NonNull - private String getFormattedSize(long sizeBytes) { - int size = (int) ((sizeBytes + 512) >> 10); - if (size >= 0) { - if (size > 100) { - return formatMb.format(new Object[]{(float) size / (1 << 10)}); - } else { - return size + " kB"; - } - } - return ""; - } - - private void showResultsDialog() { - StringBuilder sb = new StringBuilder(); - Context ctx = activity.get(); - if (ctx == null) { - return; - } - int moved = getMovedCount(); - int copied = getCopiedCount(); - int failed = getFailedCount(); - sb.append(ctx.getString(R.string.files_moved, moved, getFormattedSize(getMovedSize()))).append("\n"); - if (copied > 0) { - sb.append(ctx.getString(R.string.files_copied, copied, getFormattedSize(getCopiedSize()))).append("\n"); - } - if (failed > 0) { - sb.append(ctx.getString(R.string.files_failed, failed, getFormattedSize(getFailedSize()))).append("\n"); - } - if (copied > 0 || failed > 0) { - int count = copied + failed; - sb.append(ctx.getString(R.string.files_present, count, getFormattedSize(getCopiedSize() + getFailedSize()), newStorage.getDirectory())); - } - AlertDialog.Builder bld = new AlertDialog.Builder(ctx); - bld.setMessage(sb.toString()); - bld.setPositiveButton(R.string.shared_string_restart, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - confirm(app, activity.get(), newStorage, true); - } - }); - bld.show(); - } - - @Override - protected void onPostExecute(Boolean result) { - super.onPostExecute(result); - OsmandActionBarActivity a = this.activity.get(); - if (a == null) { - return; - } - OsmandApplication app = a.getMyApplication(); - if (result) { - app.getResourceManager().resetStoreDirectory(); - // immediately proceed with change (to not loose where maps are currently located) - if (getCopiedCount() > 0 || getFailedCount() > 0) { - showResultsDialog(); - } else { - confirm(app, a, newStorage, false); - } - } else { - showResultsDialog(); - Toast.makeText(a, R.string.copying_osmand_file_failed, - Toast.LENGTH_SHORT).show(); - } - - } - }; - task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } - - private void confirm(OsmandApplication app, Activity activity, DataStorageMenuItem newStorageDirectory, boolean silentRestart) { - String newDirectory = newStorageDirectory.getDirectory(); - int type = newStorageDirectory.getType(); - File newDirectoryFile = new File(newDirectory); - boolean wr = OsmandSettings.isWritable(newDirectoryFile); - if (wr) { - app.setExternalStorageDirectory(type, newDirectory); - reloadData(); - if (silentRestart) { - android.os.Process.killProcess(android.os.Process.myPid()); - } else { - app.restartApp(activity); - } - } else { - Toast.makeText(activity, R.string.specified_directiory_not_writeable, - Toast.LENGTH_LONG).show(); - } - updateAllSettings(); - } - - private String getSpaceDescription(String path) { - File dir = new File(path); - File dirParent = dir.getParentFile(); - while (!dir.exists() && dirParent != null) { - dir = dir.getParentFile(); - dirParent = dir.getParentFile(); - } - if (dir.exists()) { - DecimalFormat formatter = new DecimalFormat("#.##"); - return new StringBuilder(String.format(getString(R.string.free), - String.valueOf(formatter.format(AndroidUtils.getFreeSpaceGb(dir))))) - .append(" \u2022 ") - .append(formatter.format(AndroidUtils.getUsedSpaceGb(dir))) - .append(" / ") - .append(formatter.format(AndroidUtils.getTotalSpaceGb(dir))) - .append(" Gb") - .toString(); - } - return ""; - } - - protected void reloadData() { - new ReloadData(activity, getMyApplication()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null); - } - - public static class MoveFilesToDifferentDirectory extends AsyncTask { - - protected WeakReference activity; - private WeakReference context; - private File from; - private File to; - protected ProgressImplementation progress; - private Runnable runOnSuccess; - private int movedCount; - private long movedSize; - private int copiedCount; - private long copiedSize; - private int failedCount; - private long failedSize; - - public MoveFilesToDifferentDirectory(OsmandActionBarActivity activity, File from, File to) { - this.activity = new WeakReference<>(activity); - this.context = new WeakReference<>((Context) activity); - this.from = from; - this.to = to; - } - - public void setRunOnSuccess(Runnable runOnSuccess) { - this.runOnSuccess = runOnSuccess; - } - - public int getMovedCount() { - return movedCount; - } - - public int getCopiedCount() { - return copiedCount; - } - - public int getFailedCount() { - return failedCount; - } - - public long getMovedSize() { - return movedSize; - } - - public long getCopiedSize() { - return copiedSize; - } - - public long getFailedSize() { - return failedSize; - } - - @Override - protected void onPreExecute() { - Context ctx = context.get(); - if (context == null) { - return; - } - movedCount = 0; - copiedCount = 0; - failedCount = 0; - progress = ProgressImplementation.createProgressDialog( - ctx, ctx.getString(R.string.copying_osmand_files), - ctx.getString(R.string.copying_osmand_files_descr, to.getPath()), - ProgressDialog.STYLE_HORIZONTAL); - } - - @Override - protected void onPostExecute(Boolean result) { - if (result != null) { - Context ctx = context.get(); - if (ctx == null) { - return; - } - if (result.booleanValue() && runOnSuccess != null) { - runOnSuccess.run(); - } else if (!result.booleanValue()) { - Toast.makeText(ctx, R.string.shared_string_io_error, Toast.LENGTH_LONG).show(); - } - } - try { - if (progress.getDialog().isShowing()) { - progress.getDialog().dismiss(); - } - } catch (Exception e) { - //ignored - } - } - - private void movingFiles(File f, File t, int depth) throws IOException { - Context ctx = context.get(); - if (ctx == null) { - return; - } - if (depth <= 2) { - progress.startTask(ctx.getString(R.string.copying_osmand_one_file_descr, t.getName()), -1); - } - if (f.isDirectory()) { - t.mkdirs(); - File[] lf = f.listFiles(); - if (lf != null) { - for (int i = 0; i < lf.length; i++) { - if (lf[i] != null) { - movingFiles(lf[i], new File(t, lf[i].getName()), depth + 1); - } - } - } - f.delete(); - } else if (f.isFile()) { - if (t.exists()) { - Algorithms.removeAllFiles(t); - } - boolean rnm = false; - long fileSize = f.length(); - try { - rnm = f.renameTo(t); - movedCount++; - movedSize += fileSize; - } catch (RuntimeException e) { - } - if (!rnm) { - FileInputStream fin = new FileInputStream(f); - FileOutputStream fout = new FileOutputStream(t); - try { - progress.startTask(ctx.getString(R.string.copying_osmand_one_file_descr, t.getName()), (int) (f.length() / 1024)); - Algorithms.streamCopy(fin, fout, progress, 1024); - copiedCount++; - copiedSize += fileSize; - } catch (IOException e) { - failedCount++; - failedSize += fileSize; - } finally { - fin.close(); - fout.close(); - } - f.delete(); - } - } - if (depth <= 2) { - progress.finishTask(); - } - } - - @Override - protected Boolean doInBackground(Void... params) { - to.mkdirs(); - try { - movingFiles(from, to, 0); - } catch (IOException e) { - return false; - } - return true; - } - - } - - public static class ReloadData extends AsyncTask { - private WeakReference ctx; - protected ProgressImplementation progress; - private OsmandApplication app; - - public ReloadData(Context ctx, OsmandApplication app) { - this.ctx = new WeakReference<>(ctx); - this.app = app; - } - - @Override - protected void onPreExecute() { - Context c = ctx.get(); - if (c == null) { - return; - } - progress = ProgressImplementation.createProgressDialog(c, c.getString(R.string.loading_data), - c.getString(R.string.loading_data), ProgressDialog.STYLE_HORIZONTAL); - } - - @Override - protected void onPostExecute(Boolean result) { - try { - if (progress.getDialog().isShowing()) { - progress.getDialog().dismiss(); - } - } catch (Exception e) { - //ignored - } - } - - @Override - protected Boolean doInBackground(Void... params) { - app.getResourceManager().reloadIndexes(progress, new ArrayList()); - return true; - } - } -} diff --git a/OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java b/OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java deleted file mode 100644 index 371ef1ee8a..0000000000 --- a/OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java +++ /dev/null @@ -1,200 +0,0 @@ -package net.osmand.plus.settings; - -import android.os.Build; - -import net.osmand.ValueHolder; -import net.osmand.plus.OsmandApplication; -import net.osmand.plus.OsmandSettings; -import net.osmand.plus.R; - -import java.io.File; -import java.util.ArrayList; - -public class DataStorageItemsHolder { - public final static String INTERNAL_STORAGE = "internal_storage"; - public final static String EXTERNAL_STORAGE = "external_storage"; - public final static String SHARED_STORAGE = "shared_storage"; - public final static String MULTIUSER_STORAGE = "multiuser_storage"; - public final static String MANUALLY_SPECIFIED = "manually_specified"; - - private ArrayList menuItems; - private DataStorageMenuItem currentDataStorage; - private DataStorageMenuItem manuallySpecified; - - private int currentStorageType; - private String currentStoragePath; - - private OsmandApplication app; - private OsmandSettings settings; - - private DataStorageItemsHolder(OsmandApplication app) { - this.app = app; - this.settings = app.getSettings(); - prepareData(); - } - - public static DataStorageItemsHolder refreshInfo(OsmandApplication app) { - return new DataStorageItemsHolder(app); - } - - private void prepareData() { - - if (app == null) { - return; - } - - if (settings.getExternalStorageDirectoryTypeV19() >= 0) { - currentStorageType = settings.getExternalStorageDirectoryTypeV19(); - } else { - ValueHolder vh = new ValueHolder(); - if (vh.value != null && vh.value >= 0) { - currentStorageType = vh.value; - } else { - currentStorageType = 0; - } - } - currentStoragePath = settings.getExternalStorageDirectory().getAbsolutePath(); - - menuItems = new ArrayList<>(); - - String path; - File dir; - int iconId; - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - - //internal storage - path = settings.getInternalAppPath().getAbsolutePath(); - dir = new File(path); - iconId = R.drawable.ic_action_phone; - - DataStorageMenuItem internalStorageItem = DataStorageMenuItem.builder() - .buildKey(INTERNAL_STORAGE) - .buildTitle(getString(R.string.storage_directory_internal_app)) - .buildDirectory(path) - .buildDescription(getString(R.string.internal_app_storage_description)) - .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_INTERNAL_FILE) - .buildIconResId(iconId) - .build(); - addItem(internalStorageItem); - - //shared_storage - dir = settings.getDefaultInternalStorage(); - path = dir.getAbsolutePath(); - iconId = R.drawable.ic_action_phone; - - DataStorageMenuItem sharedStorageItem = DataStorageMenuItem.builder() - .buildKey(SHARED_STORAGE) - .buildTitle(getString(R.string.storage_directory_shared)) - .buildDirectory(path) - .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT) - .buildIconResId(iconId) - .build(); - addItem(sharedStorageItem); - - //external storage - File[] externals = app.getExternalFilesDirs(null); - if (externals != null) { - int i = 0; - for (File external : externals) { - if (external != null) { - ++i; - dir = external; - path = dir.getAbsolutePath(); - iconId = getIconForStorageType(dir); - DataStorageMenuItem externalStorageItem = DataStorageMenuItem.builder() - .buildKey(EXTERNAL_STORAGE + i) - .buildTitle(getString(R.string.storage_directory_external) + " " + i) - .buildDirectory(path) - .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_EXTERNAL_FILE) - .buildIconResId(iconId) - .build(); - addItem(externalStorageItem); - } - } - } - - //multi user storage - File[] obbDirs = app.getObbDirs(); - if (obbDirs != null) { - int i = 0; - for (File obb : obbDirs) { - if (obb != null) { - ++i; - dir = obb; - path = dir.getAbsolutePath(); - iconId = getIconForStorageType(dir); - DataStorageMenuItem multiuserStorageItem = DataStorageMenuItem.builder() - .buildKey(MULTIUSER_STORAGE + i) - .buildTitle(getString(R.string.storage_directory_multiuser) + " " + i) - .buildDirectory(path) - .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_OBB) - .buildIconResId(iconId) - .build(); - addItem(multiuserStorageItem); - } - } - } - } - - //manually specified storage - manuallySpecified = DataStorageMenuItem.builder() - .buildKey(MANUALLY_SPECIFIED) - .buildTitle(getString(R.string.storage_directory_manual)) - .buildDirectory(currentStoragePath) - .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_SPECIFIED) - .buildIconResId(R.drawable.ic_action_folder) - .build(); - menuItems.add(manuallySpecified); - - if (currentDataStorage == null) { - currentDataStorage = manuallySpecified; - } - } - - private String getString(int resId) { - return app.getString(resId); - } - - public ArrayList getStorageItems() { - return menuItems; - } - - private int getIconForStorageType(File dir) { - return R.drawable.ic_action_folder; - } - - public DataStorageMenuItem getCurrentStorage() { - return currentDataStorage; - } - - private void addItem(DataStorageMenuItem item) { - if (currentStorageType == item.getType() && currentStoragePath.equals(item.getDirectory())) { - currentDataStorage = item; - } - menuItems.add(item); - } - - public DataStorageMenuItem getManuallySpecified() { - return manuallySpecified; - } - - public DataStorageMenuItem getStorage(String key) { - if (menuItems != null && key != null) { - for (DataStorageMenuItem menuItem : menuItems) { - if (key.equals(menuItem.getKey())) { - return menuItem; - } - } - } - return null; - } - - public int getCurrentType() { - return currentStorageType; - } - - public String getCurrentPath() { - return currentStoragePath; - } -} diff --git a/OsmAnd/src/net/osmand/plus/settings/DataStorageMenuItem.java b/OsmAnd/src/net/osmand/plus/settings/DataStorageMenuItem.java deleted file mode 100644 index dd54a0a785..0000000000 --- a/OsmAnd/src/net/osmand/plus/settings/DataStorageMenuItem.java +++ /dev/null @@ -1,169 +0,0 @@ -package net.osmand.plus.settings; - -import android.os.Parcel; -import android.os.Parcelable; -import android.support.annotation.IdRes; - -public class DataStorageMenuItem implements Parcelable, Cloneable { - - private String key; - private int type; - private String title; - private String description; - private String directory; - @IdRes - private int iconResId; - - private DataStorageMenuItem(String key, int type, String title, String description, - String directory, int iconResId) { - this.key = key; - this.type = type; - this.title = title; - this.description = description; - this.directory = directory; - this.iconResId = iconResId; - } - - private DataStorageMenuItem(Parcel in) { - key = in.readString(); - type = in.readInt(); - title = in.readString(); - description = in.readString(); - directory = in.readString(); - } - - public String getTitle() { - return title; - } - - public String getDescription() { - return description; - } - - public String getDirectory() { - return directory; - } - - public int getIconResId() { - return iconResId; - } - - public String getKey() { - return key; - } - - public int getType() { - return type; - } - - public void setKey(String key) { - this.key = key; - } - - public void setType(int type) { - this.type = type; - } - - public void setTitle(String title) { - this.title = title; - } - - public void setDescription(String description) { - this.description = description; - } - - public void setDirectory(String directory) { - this.directory = directory; - } - - public void setIconResId(int iconResId) { - this.iconResId = iconResId; - } - - public static DataStorageMenuItemBuilder builder() { - return new DataStorageMenuItemBuilder(); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(key); - dest.writeInt(type); - dest.writeString(title); - dest.writeString(description); - dest.writeString(directory); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - - @Override - public DataStorageMenuItem createFromParcel(Parcel source) { - return new DataStorageMenuItem(source); - } - - @Override - public DataStorageMenuItem[] newArray(int size) { - return new DataStorageMenuItem[size]; - } - }; - - public static class DataStorageMenuItemBuilder { - private String key; - private int type; - private String title; - private String description; - private String directory; - @IdRes - private int iconResId; - - public DataStorageMenuItemBuilder buildKey(String key) { - this.key = key; - return this; - } - - public DataStorageMenuItemBuilder buildType(int type) { - this.type = type; - return this; - } - - public DataStorageMenuItemBuilder buildTitle(String title) { - this.title = title; - return this; - } - - public DataStorageMenuItemBuilder buildDescription(String description) { - this.description = description; - return this; - } - - public DataStorageMenuItemBuilder buildDirectory(String directory) { - this.directory = directory; - return this; - } - - public DataStorageMenuItemBuilder buildIconResId(int iconResId) { - this.iconResId = iconResId; - return this; - } - - public DataStorageMenuItem build() { - return new DataStorageMenuItem(key, type, title, description, directory, iconResId); - } - } - - @Override - public Object clone() throws CloneNotSupportedException { - return DataStorageMenuItem.builder() - .buildKey(this.key) - .buildTitle(this.title) - .buildDescription(this.description) - .buildDirectory(this.directory) - .buildType(this.type) - .buildIconResId(this.iconResId) - .build(); - } -} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java index eced1abd1f..d3709fbc3c 100644 --- a/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java @@ -7,7 +7,6 @@ import android.support.v7.preference.Preference; import android.support.v7.preference.SwitchPreferenceCompat; import android.util.Pair; -import net.osmand.AndroidUtils; import net.osmand.plus.ApplicationMode; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -17,9 +16,6 @@ import net.osmand.plus.dialogs.SendAnalyticsBottomSheetDialogFragment; import net.osmand.plus.settings.preferences.ListPreferenceEx; import net.osmand.plus.settings.preferences.SwitchPreferenceEx; -import java.io.File; -import java.text.DecimalFormat; - public class GlobalSettingsFragment extends BaseSettingsFragment implements SendAnalyticsBottomSheetDialogFragment.OnSendAnalyticsPrefsUpdate, OnPreferenceChanged { @@ -138,17 +134,9 @@ public class GlobalSettingsFragment extends BaseSettingsFragment implements Send } private void setupExternalStorageDirPref() { - Preference externalStorageDir = findPreference(OsmandSettings.EXTERNAL_STORAGE_DIR); + Preference externalStorageDir = (Preference) findPreference(OsmandSettings.EXTERNAL_STORAGE_DIR); externalStorageDir.setIcon(getContentIcon(R.drawable.ic_action_folder)); - DataStorageItemsHolder holder = DataStorageItemsHolder.refreshInfo(app); - DataStorageMenuItem currentStorage = holder.getCurrentStorage(); - File dir = new File(currentStorage.getDirectory()); - DecimalFormat formatter = new DecimalFormat("#.##"); - String summary = currentStorage.getTitle() + - " \u2022 " + - String.format(getString(R.string.description_used_gb), - formatter.format(AndroidUtils.getUsedSpaceGb(dir))); - externalStorageDir.setSummary(summary); + } private void setupSendAnonymousDataPref() { diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java deleted file mode 100644 index 6180c2d3cb..0000000000 --- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java +++ /dev/null @@ -1,202 +0,0 @@ -package net.osmand.plus.settings.bottomsheets; - -import android.content.Context; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.content.ContextCompat; -import android.text.Spannable; -import android.text.SpannableStringBuilder; -import android.text.style.ForegroundColorSpan; -import android.view.View; -import android.view.ViewGroup; -import android.widget.FrameLayout; - -import net.osmand.AndroidUtils; -import net.osmand.PlatformUtil; -import net.osmand.plus.R; -import net.osmand.plus.UiUtilities; -import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; -import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; -import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; -import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; -import net.osmand.plus.settings.BaseSettingsFragment; -import net.osmand.plus.settings.DataStorageMenuItem; - -import org.apache.commons.logging.Log; - -import static net.osmand.plus.settings.DataStorageItemsHolder.MANUALLY_SPECIFIED; - -public class ChangeDataStorageBottomSheet extends BasePreferenceBottomSheet { - - public static final String TAG = "ChangeDataStorageBottomSheet"; - - private static final Log LOG = PlatformUtil.getLog(ChangeDataStorageBottomSheet.class); - - private final static String CURRENT_DIRECTORY = "current_directory"; - private final static String NEW_DIRECTORY = "new_directory"; - - public final static String MOVE_DATA = "move_data"; - public final static String CHOSEN_DIRECTORY = "chosen_storage"; - - private DataStorageMenuItem currentDirectory; - private DataStorageMenuItem newDirectory; - - @Override - public void createMenuItems(Bundle savedInstanceState) { - - Context ctx = getContext(); - - if (savedInstanceState != null) { - currentDirectory = savedInstanceState.getParcelable(CURRENT_DIRECTORY); - newDirectory = savedInstanceState.getParcelable(NEW_DIRECTORY); - } - - if (ctx == null || currentDirectory == null || newDirectory == null) { - return; - } - - items.add(new TitleItem(getString(R.string.change_osmand_data_folder_question))); - - String from = currentDirectory.getKey().equals(MANUALLY_SPECIFIED) ? currentDirectory.getDirectory() : currentDirectory.getTitle(); - String to = newDirectory.getKey().equals(MANUALLY_SPECIFIED) ? newDirectory.getDirectory() : newDirectory.getTitle(); - String fullDescription = getString(R.string.application_dir_change_warning3) + "\n" + from + " > " + to; - - SpannableStringBuilder coloredDescription = new SpannableStringBuilder( - fullDescription); - int startIndexFrom = fullDescription.indexOf(from); - int endIndexFrom = startIndexFrom + from.length(); - int startIndexTo = fullDescription.indexOf(to); - int endIndexTo = startIndexTo + to.length(); - int textColorPrimary = nightMode ? R.color.text_color_primary_dark : R.color.text_color_primary_light; - int activeColor = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light; - coloredDescription.setSpan(new ForegroundColorSpan( - ContextCompat.getColor(ctx, activeColor)), - startIndexFrom, endIndexFrom, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - coloredDescription.setSpan(new ForegroundColorSpan( - ContextCompat.getColor(ctx, activeColor)), - startIndexTo, endIndexTo, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - - BottomSheetItemWithDescription description = (BottomSheetItemWithDescription) new BottomSheetItemWithDescription.Builder() - .setDescription(coloredDescription) - .setDescriptionColorId(textColorPrimary) - .setLayoutId(R.layout.bottom_sheet_item_description_long) - .create(); - items.add(description); - - View spaceView = new FrameLayout(ctx); - spaceView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, - AndroidUtils.dpToPx(ctx, getResources().getDimension(R.dimen.content_padding)))); - - BaseBottomSheetItem space = new BaseBottomSheetItem.Builder() - .setCustomView(spaceView) - .create(); - items.add(space); - - //buttons - View btnDontMoveView = View.inflate(ctx, R.layout.bottom_sheet_big_dialog_button_with_icon, null); - UiUtilities.setupDialogButton(nightMode, btnDontMoveView, UiUtilities.DialogButtonType.SECONDARY, - getString(R.string.dont_move_maps), currentDirectory.getIconResId()); - BaseBottomSheetItem btnDontMove = new BaseBottomSheetItem.Builder() - .setCustomView(btnDontMoveView) - .setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - positiveButtonsClick(false); - } - }) - .create(); - items.add(btnDontMove); - - View btnMoveView = View.inflate(ctx, R.layout.bottom_sheet_big_dialog_button_with_icon, null); - UiUtilities.setupDialogButton(nightMode, btnMoveView, UiUtilities.DialogButtonType.PRIMARY, - getString(R.string.move_maps_to_new_destination), R.drawable.ic_action_folder_move); - BaseBottomSheetItem btnMove = new BaseBottomSheetItem.Builder() - .setCustomView(btnMoveView) - .setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - positiveButtonsClick(true); - } - }) - .create(); - items.add(btnMove); - - View btnCloseView = View.inflate(ctx, R.layout.bottom_sheet_big_dialog_button_with_icon, null); - UiUtilities.setupDialogButton(nightMode, btnCloseView, UiUtilities.DialogButtonType.SECONDARY, - getString(R.string.shared_string_cancel), R.drawable.ic_action_undo_dark); - BaseBottomSheetItem btnClose = new BaseBottomSheetItem.Builder() - .setCustomView(btnCloseView) - .setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - dismiss(); - } - }) - .create(); - items.add(btnClose); - - View bottomSpaceView = new FrameLayout(ctx); - bottomSpaceView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, - AndroidUtils.dpToPx(ctx, getResources().getDimension(R.dimen.content_padding_half)))); - - BaseBottomSheetItem bottomSpace = new BaseBottomSheetItem.Builder() - .setCustomView(bottomSpaceView ) - .create(); - items.add(bottomSpace); - - } - - public void setCurrentDirectory(DataStorageMenuItem currentDirectory) { - this.currentDirectory = currentDirectory; - } - - public void setNewDirectory(DataStorageMenuItem newDirectory) { - this.newDirectory = newDirectory; - } - - private void positiveButtonsClick(boolean moveData) { - Bundle bundle = new Bundle(); - bundle.putBoolean(TAG, true); - bundle.putParcelable(CHOSEN_DIRECTORY, newDirectory); - bundle.putBoolean(MOVE_DATA, moveData); - Fragment fragment = getTargetFragment(); - if (fragment instanceof BaseSettingsFragment) { - ((BaseSettingsFragment) fragment).onPreferenceChange(getPreference(), bundle); - } - dismiss(); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putParcelable(CURRENT_DIRECTORY, currentDirectory); - outState.putParcelable(NEW_DIRECTORY, newDirectory); - } - - @Override - protected boolean hideButtonsContainer() { - return true; - } - - public static boolean showInstance(FragmentManager fm, String prefId, DataStorageMenuItem currentDirectory, - DataStorageMenuItem newDirectory, Fragment target, boolean usedOnMap) { - try { - if (fm.findFragmentByTag(TAG) == null) { - Bundle args = new Bundle(); - args.putString(PREFERENCE_ID, prefId); - - ChangeDataStorageBottomSheet fragment = new ChangeDataStorageBottomSheet(); - fragment.setCurrentDirectory(currentDirectory); - fragment.setNewDirectory(newDirectory); - fragment.setTargetFragment(target, 0); - fragment.setUsedOnMap(usedOnMap); - fragment.show(fm, TAG); - return true; - } - } catch (RuntimeException e) { - LOG.error(e.getMessage()); - } - return false; - } -} diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java deleted file mode 100644 index 1686158991..0000000000 --- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java +++ /dev/null @@ -1,204 +0,0 @@ -package net.osmand.plus.settings.bottomsheets; - -import android.annotation.TargetApi; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.provider.OpenableColumns; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.view.View; -import android.widget.EditText; -import android.widget.TextView; - -import net.osmand.PlatformUtil; -import net.osmand.plus.R; -import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; -import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; -import net.osmand.plus.settings.BaseSettingsFragment; - -import org.apache.commons.logging.Log; - -import static android.view.View.GONE; - -public class SelectFolderBottomSheet extends BasePreferenceBottomSheet { - - public static final String TAG = "SelectFolderBottomSheet"; - private static final Log LOG = PlatformUtil.getLog(SelectFolderBottomSheet.class); - private static final int CHOOSE_FOLDER_REQUEST_CODE = 0; - - private static final String EDIT_TEXT_PREFERENCE_KEY = "edit_text_preference_key"; - private static final String DIALOG_TITLE = "dialog_title"; - private static final String DESCRIPTION = "description"; - private static final String BTN_TITLE = "btn_title"; - private static final String ET_WAS_FOCUSED = "edit_text_was_focused"; - public static final String NEW_PATH = "path"; - public static final String PATH_CHANGED = "changed"; - - private EditText editText; - - private String currentPath; - private String dialogTitle; - private String btnTitle; - private String description; - private boolean etWasFocused; - - @Override - public void createMenuItems(Bundle savedInstanceState) { - final Context ctx = getContext(); - - String text = null; - if (savedInstanceState != null) { - String folderPath = savedInstanceState.getString(NEW_PATH); - if (folderPath != null) { - currentPath = folderPath; - } - text = savedInstanceState.getString(EDIT_TEXT_PREFERENCE_KEY); - dialogTitle = savedInstanceState.getString(DIALOG_TITLE); - description = savedInstanceState.getString(DESCRIPTION); - btnTitle = savedInstanceState.getString(BTN_TITLE); - etWasFocused = savedInstanceState.getBoolean(ET_WAS_FOCUSED); - } - - if (ctx == null || currentPath == null) { - return; - } - - if (dialogTitle != null) { - items.add(new TitleItem(dialogTitle)); - } - - View mainView = View.inflate(ctx, R.layout.bottom_sheet_select_folder, null); - - TextView tvDescription = mainView.findViewById(R.id.description); - TextView tvBtnTitle = mainView.findViewById(R.id.title); - editText = mainView.findViewById(R.id.text); - - View divider = mainView.findViewById(R.id.divider); - View btnOpenChoseDialog = mainView.findViewById(R.id.button); - -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { -// if (btnTitle != null) { -// tvBtnTitle.setText(btnTitle); -// int colorResId = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light; -// int color = ContextCompat.getColor(ctx, colorResId); -// Drawable drawable = UiUtilities.getColoredSelectableDrawable(ctx, color, 0.3f); -// AndroidUtils.setBackground(btnOpenChoseDialog, drawable); -// btnOpenChoseDialog.setOnClickListener(new View.OnClickListener() { -// @Override -// public void onClick(View v) { -// openDocumentTree(); -// } -// }); -// } -// } else { - divider.setVisibility(GONE); - btnOpenChoseDialog.setVisibility(GONE); -// } - - if (text != null) { - editText.setText(text); - } - - if (description != null) { - tvDescription.setText(description); - } - - editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { - @Override - public void onFocusChange(View v, boolean hasFocus) { - if (hasFocus && !etWasFocused) { - etWasFocused = true; - editText.setText(currentPath); - } - } - }); - - BaseBottomSheetItem baseItem = new BaseBottomSheetItem.Builder() - .setCustomView(mainView) - .create(); - items.add(baseItem); - - } - - public static boolean showInstance(FragmentManager fm, String prefId, String currentPath, Fragment target, - String dialogTitle, String description, String btnTitle, boolean usedOnMap) { - try { - if (fm.findFragmentByTag(TAG) == null) { - Bundle args = new Bundle(); - args.putString(PREFERENCE_ID, prefId); - - SelectFolderBottomSheet fragment = new SelectFolderBottomSheet(); - fragment.setCurrentPath(currentPath); - fragment.setTargetFragment(target, 0); - fragment.setDialogTitle(dialogTitle); - fragment.setDescription(description); - fragment.setBtnTitle(btnTitle); - fragment.setUsedOnMap(usedOnMap); - fragment.show(fm, TAG); - } - return true; - } catch (RuntimeException e) { - return false; - } - } - - @Override - protected int getDismissButtonTextId() { - return R.string.shared_string_close; - } - - @Override - protected int getRightBottomButtonTextId() { - return R.string.shared_string_apply; - } - - @Override - protected void onRightBottomButtonClick() { - Fragment fragment = getTargetFragment(); - if (fragment instanceof BaseSettingsFragment) { - String newPath = editText.getText().toString(); - if (!newPath.equals("")) { - boolean pathChanged = !newPath.equals(currentPath); - Bundle bundle = new Bundle(); - bundle.putBoolean(TAG, true); - bundle.putString(NEW_PATH, newPath); - bundle.putBoolean(PATH_CHANGED, pathChanged); - ((BaseSettingsFragment) fragment).onPreferenceChange(getPreference(), bundle); - } - } - dismiss(); - } - - @Override - public void onSaveInstanceState(@NonNull Bundle outState) { - super.onSaveInstanceState(outState); - outState.putString(EDIT_TEXT_PREFERENCE_KEY, editText.getText().toString()); - outState.putString(NEW_PATH, currentPath); - outState.putString(DIALOG_TITLE, dialogTitle); - outState.putString(DESCRIPTION, description); - outState.putString(BTN_TITLE, btnTitle); - outState.putBoolean(ET_WAS_FOCUSED, etWasFocused); - } - - public void setCurrentPath(String currentPath) { - this.currentPath = currentPath; - } - - public void setDialogTitle(String dialogTitle) { - this.dialogTitle = dialogTitle; - } - - public void setDescription(String description) { - this.description = description; - } - - public void setBtnTitle(String btnTitle) { - this.btnTitle = btnTitle; - } - -} From 414255eaa96d6c5de6b0b82fa76332b624c659a4 Mon Sep 17 00:00:00 2001 From: ccpr1l Date: Fri, 4 Oct 2019 11:09:14 +0000 Subject: [PATCH 06/34] Translated using Weblate (Galician) Currently translated at 100.0% (2985 of 2985 strings) --- OsmAnd/res/values-gl/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-gl/strings.xml b/OsmAnd/res/values-gl/strings.xml index f17b717f26..d1b3f82f4d 100644 --- a/OsmAnd/res/values-gl/strings.xml +++ b/OsmAnd/res/values-gl/strings.xml @@ -900,8 +900,8 @@ Tamaño do tipo de letra do mapa Información de fallo de renderizado Amosar rendemento do renderizado. - Estasen a desempaquetar datos novos… - Hai un servizo de navegación con conexión seleccionadoo, mais non hai ningunha conexión á Internet. + Estanse a desempaquetar datos novos… + Hai un servizo de navegación con conexión seleccionado, mais non hai ningunha conexión á Internet. Esta lingua non está dispoñíbel A lingua elixida non está dispoñíbel no motor TTS (texto lido) do Android. Desexa procurar outro motor do TTS na Google Play\? Se non, tense que emprega-la lingua do TTS predeterminado. faltan datos From a3d55c98527cde2451f0d4bcd17e72b218d7ffbe Mon Sep 17 00:00:00 2001 From: Guntis Ozols Date: Sat, 5 Oct 2019 08:31:59 +0000 Subject: [PATCH 07/34] Translated using Weblate (Latvian) Currently translated at 82.4% (2459 of 2985 strings) --- OsmAnd/res/values-lv/strings.xml | 131 ++++++++++++++++++++++++------- 1 file changed, 104 insertions(+), 27 deletions(-) diff --git a/OsmAnd/res/values-lv/strings.xml b/OsmAnd/res/values-lv/strings.xml index df43e81d26..167db631d7 100644 --- a/OsmAnd/res/values-lv/strings.xml +++ b/OsmAnd/res/values-lv/strings.xml @@ -2059,7 +2059,7 @@ kas tiks pievienots jūsu Kategorijas sadaļai. Serbu (latīņu) Ķīniešu (Honkongas) Nerādīt ūdenstilpnes - Atvērt Lokācijas Kodu (OLC) + Atvērtais Lokācijas Kods (OLC) Nepareizs OLC Nepilnīgs OLC @@ -2199,14 +2199,14 @@ Apraksta laukumu: %1$s x %2$s Berberu Rādīt OSM piezīmes Nerādīt OSM piezīmes - Nospiežot pogu, tiks rādītas vai slēptas OEM piezīmes uz kartes. + Nospiežot darbības pogu, tiek rādītas vai slēptas OEM piezīmes uz kartes. Sakārtots pēc distances - Izlases meklēšana + Meklēt Izlasē Lai attēlotu reljefa griezumu kartē, ir nepieciešams lejupielādēt reljefa virsklāja karti šim reğionam. Lai attēlotu reljefa griezumu kartē, ir nepieciešams iegādāties un instalēt Kontūrlīniju spraudni - Lai redzētu kontūrlīnijas uz kartes, nepieciešams lejupielādēt kontūrlīniju karti šim reğionam. + "Lejupielādējiet \"Kontūrlīnijas\" karti šim reğionam." Spraudnis - Lai redzētu kontūrlīnijas kartē, ir nepieciešams nopirkt un instalēt Kontūrlīniju spraudni + Lai redzētu kontūrlīnijas uz kartes, jums ir nepieciešams nopirkt un instalēt \"Kontūrlīniju\" spraudni Krāsu shēma Privātās teritorijas Nosaukums @@ -2224,21 +2224,21 @@ Apraksta laukumu: %1$s x %2$s Izvēlieties pasta kodu Kartes automātiskā tālummaiņa iesl/izsl Automātiski - Galamērķis atrodas privātā teritorijā. Vai atļaut maršrutā iekļaut ierobežotas pieejamības ceļus? + Galamērķis atrodas privātas teritorijas vietā. Vai iekļaut maršrutā ierobežotas piekļuves ceļus\? Meklēt atkārtoti Paplašināt meklēšanas rādiusu - Neko neatradu :( + Neko neatrada Meklējiet pēc cita vārda vai palieliniet meklēšanas rādiusu. Rādīt/nerādīt OSM piezīmes Atļaut piekļūšanu privātajām teritorijām. - Maršruta gaitā rādīt kustīgu animāciju manā atrašanās vietā. - Spiežot darbības pogu, tiks ieslēgta vai izslēgta automātiskā kartes mērogošana, atkarībā no kustības ātruma. + Maršruta gaitā iespējot kartes pagriešanas animāciju no manas atrašanās vietas. + Darbības pogas nospiešana ieslēdz vai izslēdz kartes auto mērogošanu pēc kustības ātruma. Pievienot mērķi Nomainīt mērķi Pievienot pirmo starppunktu - Spiežot darbības pogu, kartes centrā tiks izveidots jauns galamērķis, bet iepriekšējais galamērķis tiks pārveidots par pēdējo starppunktu. - "Spiežot darbības pogu, nomainīsies mērķis uz pašreizējo ekrāna centra punktu." - Spiežot darbības pogu, tiks pievienots pirmais starppunkts ekrāna centrā. + Spiežot šo darbības pogu, ekrāna centrs kļūst par galamērķi, bet iepriekš izvēlētais galamērķis par pēdējo starppunktu. + "Spiežot šo darbības pogu, ekrāna centrs kļūst par jauno galamērķi, nomainot iepriekšējo (ja tāds bija)." + Spiežot šo darbības pogu, ekrāna centrs kļūst par pirmo starppunku maršrutā. Nav virsklāja Nav apakšklāja Kļūda @@ -2411,17 +2411,15 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl \n OsmAnd ir atvērtā koda un aktīvā izstrādē esoša lietotne. Ikviens var piedalīties tā veidošanā, ziņojot par kļūdām, uzlabojot tulkojumus vai kodējot jaunas iespējas. Projekts atrodas patstāvīgā mijiedarbībā starp izstrādātājiem un lietotnes lietotājiem. Tāpat arī projekta progress balstās uz finansiālajiem ziedojumiem aplikācijas kodēšanai un jauno iespēju testēšanai \n Pievienot fotogrāfijas - Pievienojiet savus ielas līmeņa skatus ar Mapillary. + Pievienojiet savus šīs vietas ielas līmeņa skatus caur Mapillary. Mapillary logrīks - Ātrā piekļuve Mapillary. + Ļauj ātri piekļūt Mapillary. Tiešsaistes ielas līmeņa fotoattēli ikvienam. Atklājiet vietas, kopīgojiet, iemūžiniet pasauli. Mapillary Atvērt Mapillary Instalēt Uzlabot bilžu pārklājumu ar Mapillary - Uzņemiet vienu vai vairākus fotoattēlus un pievienojiet vietām uz kartes. -\n -\nLai to darītu, instalējiet Mapillary aplikāciju no Google Play. + Instalējiet Mapillary, lai pievienotu vienu vai vairākas forogrāfijas uz šīs vietas kartē. Tiešsaistes fotoattēli Mums nav fotogrāfiju šai vietai. Ielas līmeņa fotoattēli ikvienam - atklājiet vietas, kopīgojiet, iemūžiniet pasauli. @@ -2433,13 +2431,13 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl Lūdzu pievienojiet vismaz vienu punktu. GPX faila vārds: Pēc saglabāšanas rādīt uz kartes - Atsākt/pauzēt navigāciju + Pauzēt/atsākt navigāciju Pieskarieties pogai, lai nopauzētu vai atsāktu navigāciju. Rādīt Navigācija pabeigta dialogu Sākt/apturēt navigāciju Pieskarieties šai pogai, lai sāktu vai apturētu navigācijas norādes. Saglabāt treka ierakstus mēneša mapēs - Ierakstītie treki tiks saglabāti apakšmapēs pēc mēneša datuma (piemēram, 2017-01). + Saglabā Ierakstītos trekus apakš-mapēs pēc mēneša datuma (piemēram, 2017-01). Rādiusa lineāls Nepareiza ievade Ievadiet jaunu vārdu @@ -2485,7 +2483,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl Pēc datuma Kārtot pēc: OsmAnd apvienos punktus ar maršrutiem izvēlētajam profilam. - Jūs varat saglabāt punktus vai nu kā maršruta punktus vai kā līniju. + Saglabā punktus kā maršruta punktus vai kā līniju. Pārlūkojiet karti un pievienojiet punktus Mērīt attālumu Pieskāriens uz kartes ieslēdz pogas un logrīkus. @@ -2512,7 +2510,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl Pārvietot visu uz vēsturi Distances indikācija Kārtot pēc - Nelietot animāciju + Nelietot animācijas Neanimēt darbības uz ekrāna. Turpināt rādīt uz kartes Aizvērt bez saglabāšanas? @@ -2529,15 +2527,15 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl Pārlādēt Atjaunot flīzes, lai redzētu aktuālos datus. Bilžu kešatmiņa - Nepareizs lietotājvārds! + Nepareizs lietotājvārds Līdz No - Skatīt bildes, kas pievienotas noteiktā laikaposmā. - Datumi + Skatīt bildes pēc datuma + Datums Ievadiet lietotājvārdu - Skatīt bildes, kuras pievienojis konkrēts lietotājs. + Skatīt lietotāja bildes Lietotājvārds - Jūs varat filtrēt bildes pēc lietotāja vai datuma. Filtri tiek lietoti tikai tuvos mērogos. + "Filtrē bildes pēc iesūtītāja, datuma vai tipa. Filtri darbojas tikai tuvos mērogos." Distance ir koriģēta Tumši dzeltens Caurspīdīgs rozā @@ -2638,7 +2636,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl Punkts %1$s izdzēsts Pasaule Mēs nosūtīsim jūsu meklēšanas pieprasījumu: \"%1$s\", kā arī atrašanās vietas datus.
-
" Personīgā informācija netiek iekļauta, šie dati tiek izmantoti vienīgi meklēšanas algoritma uzlabošanai. "
+
" Personīgā informācija netiks iekļauta, šie dati tiks izmantoti vienīgi meklēšanas algoritma uzlabošanai. "
Sūtīt meklēšanas pieprasījumu\? Paldies par Jūsu atsauksmi @@ -3145,4 +3143,83 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl Dot priekšroku izvēlētajai grūtības pakāpei, lai arī vieglāki un grūtāki maršruti joprojām ir iespējami, ja tie ir pietiekami īsi. Beztrases Brīvā stila un beztrases ir neoficiālie maršruti un pārejas. Parasti neiebraukti un oficiāli netiek neuzturēti. Brauciet tikai uz savu risku. + • Rāda laiku starp pārsēšanām sabiedriskajā transportā +\n +\n • Izlabota lietotāja saskarsme maršruta detaļās +\n +\n • Salabota tumšā tēma Norādījumu izvēlnē un Maršruta Detaļās +\n +\n • Rāda azimutu iekš Mērīt Attālumu +\n +\n + "• Lietotnes profili: veidojiet personisku profilu savām vajadzībām, izvēlieties ikonu un krāsu +\n +\n • Tagad mainiet katra profila noklusējumus un min/max ātrumus +\n +\n • pievienots tekošo koordināšu logrīks +\n +\n • Pievienota opcija rādīt kompasu un rādiusa lineālu uz kartes +\n +\n • Salabota treka logošana fonā +\n +\n • Uzlabota karšu lejupielāde fonā +\n +\n • Atgriezta \"ieslēgt ekrānu\" opcija +\n +\n • Salabota Vikipēdijas valodas izvēlne +\n +\n • Salabota kompasa pogas darbība navigācijas laikā +\n +\n • Citi kļūdu labojumi +\n +\n" + Visi zemāk esošie iestatījumi attiecas tikai uz izvēlēto profilu. + OsmAnd lieto UTM standarta formātu, kas ir līdzīgs, bet ne vienāds ar UTM NATO formātu. + Piemērs + UTM standarts + Open Location Code + Izvēlētais formāts tiks piemērots visās lietotnes sadaļās. + Iestatījums ir izvēlēts kā noklusētais sekojošiem profiliem: %s + Mainīt noklusētos iestatījumus + Atcelt izmaiņas + Pielietot %1$s profilam + Pielietot visiem profiliem + Startēšanas ziņa + Analītika + Navigācijas laikā rādīt karti bloķēšanas ekrānā. + Šie parametri ietekmēs maršruta izveidošanu. Tiks piemēroti tikai izvēlētajam profilam: %1$s. + Pamošanās laiks + Mērvienības un formāti + Izskats + Ikonas, logrīki + Kartes skats + Instalēto spraudņu saraksts + Konfigurēt navigāciju + Lietotnes tēma, mērvienības, reģions + Iestatīt profilu + Tiks rādīti paziņojumi navigācijas laikā ekrāna apakšā kreisajā pusē. + Mainīt profilu + Valoda un izvade + Atiestatīt uz noklusējumiem + Veidot, importēt un labot profilus + Pārvaldīt lietotnes profilus… + Ietekmē visu aplikāciju + OsmAnd iestatījumi + Kopēt no cita profila + Ieslēgt ekrānu + Karte navigācijas laikā + Karte navigācijas laikā + Citi + Svars, augstums, ātrums + Transportlīdzekļa parametri + Balss uzvednes tiek atskaņotas tikai navigācijas laikā. + Navigācijas instrukcijas un uzvednes + Balss uzvednes + Ekrāna paziņojumi + Konfigurēt maršruta parametrus + Maršruta parametri + Lietotnes profils nomainīts uz \"%s\" + Logcat buferis + Spraudņu iestatījumi + Pēc noklusējuma \ No newline at end of file From 220059145d12a7bfd1c8d0ce73ab703114c9eeee Mon Sep 17 00:00:00 2001 From: IgorEliezer Date: Sat, 5 Oct 2019 05:31:41 +0000 Subject: [PATCH 08/34] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2985 of 2985 strings) --- OsmAnd/res/values-pt-rBR/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml index a9a63a1e8a..f26ea34f29 100644 --- a/OsmAnd/res/values-pt-rBR/strings.xml +++ b/OsmAnd/res/values-pt-rBR/strings.xml @@ -782,7 +782,7 @@ Pôr do Sol: %2$s Minutos O carro foi estacionado em Gerenciar mapas - Pesquisar nas proximidades + Pesquisar entorno Gerenciar mapas. Usar posição… Exibir rota @@ -1365,7 +1365,7 @@ Pôr do Sol: %2$s Vire levemente à esquerda e siga Aguardando sinal… Pesquisar próximo ao centro do mapa - Pesquisar nas proximidades + Pesquisar entorno Mesma do aparelho Vertical Horizontal From e0b9c3c78e24c3f7c627132097a396e92ee2cd59 Mon Sep 17 00:00:00 2001 From: Verdulo Date: Thu, 3 Oct 2019 21:39:52 +0000 Subject: [PATCH 09/34] Translated using Weblate (Esperanto) Currently translated at 100.0% (2985 of 2985 strings) --- OsmAnd/res/values-eo/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index fe99ccb914..5ad8996afa 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -3271,4 +3271,5 @@ Indikas lokon: %1$s x %2$s" Profilo de aplikaĵo ŝanĝita al “%s” Bufro logcat Agordoj pri kromprogramo + Implicite \ No newline at end of file From 0d84b49c04dbf961b2b91d5bbc70cb7a12629d2d Mon Sep 17 00:00:00 2001 From: Zmicer Turok Date: Fri, 4 Oct 2019 09:06:35 +0000 Subject: [PATCH 10/34] Translated using Weblate (Belarusian) Currently translated at 99.9% (2983 of 2985 strings) --- OsmAnd/res/values-be/strings.xml | 37 ++++++++++++++++---------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/OsmAnd/res/values-be/strings.xml b/OsmAnd/res/values-be/strings.xml index 74b2161e3c..5504d763af 100644 --- a/OsmAnd/res/values-be/strings.xml +++ b/OsmAnd/res/values-be/strings.xml @@ -518,7 +518,7 @@ Вікіпедыя (пазасеціўная) Вызначанае карыстальнікам Файл з экспартаванымі ўлюбёнымі ўжо існуе. Замяніць яго\? - Налады профіля + Налады профілю Навігацыя Вызначыць параметры навігацыі. Агульныя налады @@ -1913,7 +1913,7 @@ Дзякуй вам за падтрымку OsmAnd! \nКаб актываваць усе новыя функцыі, неабходна перазапусціць OsmAnd. Частка вашага ахвяравання будзе накіроўвацца OSM-карыстальнікам, якія ўнеслі змены ў мапу гэтага рэгіёна. - Адаслаць вашую OSM-нататку ананімна альбо праз свой профіль OpenStreetMap.org. + Запампаваць вашую OSM-нататку ананімна альбо праз свой профіль OpenStreetMap.org. Адаслаць OSM-нататку Справаздача Перамясціць ↑ @@ -2488,7 +2488,7 @@ Дадаць пункт перад Дадаць пункт пасля Параметры - OsmAnd злучыць пункты з маршрутам для абранага профіля. + OsmAnd злучыць пункты з маршрутам для абранага профілю. Захаваць пункты як пункты маршруту ці як лінію. Абраць профіль навігацыі Дадаць пункты маршруту @@ -3048,7 +3048,7 @@ Віджэт каардынат Бездарожжа Наладзіць профіль - У кожнага профіля свае налады + У кожнага профілю свае налады Вызначце час, цягам якога экран уключыцца. Выкарыстоўваць датчык адлегласці Правядзіце рукой па верхняй частцы экрана, каб уключыць яго падчас навігацыі. @@ -3067,9 +3067,9 @@ НЛА Дакладнасць па гарызанталі: %1$s, па вертыкалі: %2$s Дакладнасць па гарызанталі: %s - Абярыце прадвызначаныя параметры мапы для профіля - Абярыце прадвызначаныя параметры экрана для профіля - Абярыце прадвызначаныя налады навігацыі для профіля + Абярыце прадвызначаныя параметры мапы для профілю + Абярыце прадвызначаныя параметры экрана для профілю + Абярыце прадвызначаныя налады навігацыі для профілю Вызначце максімальную колькасць змен Колькасць змен Калі ласка, выдаткуйце нам 30 секунд, пакінце водгук і ацаніце нашу працу на Google Play. @@ -3107,7 +3107,7 @@ Абярыце, якімі данымі вы будзеце дзяліцца з намі Не, дзякуй Дазволіць - Назва профіля + Назва профілю Тып навігацыі Таксі Рэйсавы аўтобус @@ -3126,9 +3126,9 @@ Тып: %s Базавы профіль Абярыце тып навігацыі - Калі ласка, абярыце тып навігацыі для новага профіля праграмы - Увядзіце назву профіля - Назва профіля не можа быць пустой! + Калі ласка, абярыце тып навігацыі для новага профілю дадатку + Увядзіце назву профілю + Назва профілю не можа быць пустой! Дублікат назвы Ужо ёсць профіль з такой назвай Вы не можаце выдаліць базавыя профілі OsmAnd @@ -3146,8 +3146,8 @@ BRouter (па-за сецівам) Адвольны профіль маршрутызацыі Адмысловая маршрутызацыя - Абярыце профілі, што будуць бачныя ў праграме. - Профілі праграмы + Абярыце профілі, што будуць бачныя ў дадатку. + Профілі дадатку Лыжныя туры Трасы для гарналыжных тураў. Санкі @@ -3195,10 +3195,10 @@ пасля %1$s Скасаваць падпіску %1$s • Эканомія %2$s - Усе пададзеныя ніжэй налады датычацца толькі абранага профіля. + Усе пададзеныя ніжэй налады датычацца толькі абранага профілю. OsmAnd выкарыстоўвае фармат UTM Standard, які падобны, але не ідэнтычны фармату UTM Nato. Прыклад - Налады профіля + Налады профілю Змяніць профіль Буфер logcat UTM Standard @@ -3207,7 +3207,7 @@ Параметр прадвызначана абраны для профіляў: %s Змяніць прадвызначаныя налады Адкінуць змены - Ужыць да бягучага профіля %1$s + Ужыць да бягучага профілю %1$s Ужыць да ўсіх профіляў Паведамленне падчас запуску Аналітыка @@ -3259,7 +3259,7 @@ Аксітанская Пікап Паказваць мапу падчас навігацыі па-над заблакаваным экранам. - Гэтыя налады ўплываюць на пабудову маршруту. Ужываюцца толькі да абранага профіля: %1$s. + Гэтыя налады ўплываюць на пабудову маршруту. Ужываюцца толькі да абранага профілю: %1$s. Час абуджэння Адзінкі вымярэння і фарматы Выгляд @@ -3275,7 +3275,7 @@ Кіраванне профілямі дадатку… Уплывае на ўвесь дадатак Налады OsmAnd - Скапіяваць з іншага профіля + Скапіяваць з іншага профілю Уключыць экран Мапа падчас навігацыі Мапа падчас навігацыі @@ -3288,4 +3288,5 @@ Экранныя апавяшчэнні Наладзіць параметры маршруту Параметры маршруту + Прадвызначана \ No newline at end of file From 800e5d0d9c48dad25da9a53b09b5e0d39ee307f5 Mon Sep 17 00:00:00 2001 From: uievawkejf Date: Sat, 5 Oct 2019 13:37:39 +0000 Subject: [PATCH 11/34] Translated using Weblate (Ukrainian) Currently translated at 100.0% (2985 of 2985 strings) --- OsmAnd/res/values-uk/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml index 4acacfb30a..d1c84899fc 100644 --- a/OsmAnd/res/values-uk/strings.xml +++ b/OsmAnd/res/values-uk/strings.xml @@ -1923,7 +1923,7 @@ Не активний Будь ласка, введіть дійсну електронну адресу Налаштування підписки - Виберіть позначку + Оберіть позначку на мапі Вивантажено анонімно Показати прозору пошукову панель Звіт @@ -3303,4 +3303,5 @@ Інструкції і попередження при навігації Буфер logcat Налаштування втулка + Типово \ No newline at end of file From bc42f37632cc078ece07ac46b3f1f930691abb56 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 3 Oct 2019 13:28:39 +0000 Subject: [PATCH 12/34] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2985 of 2985 strings) --- OsmAnd/res/values-zh-rTW/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index 66c1b29015..bbca0b8f42 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -3279,4 +3279,5 @@ 應用程式設定檔變更為「%s」 Logcat 緩衝 外掛程式設定 + 預設值 \ No newline at end of file From 53de1cfa237ac485b8c31fc9a8efb3411daa8353 Mon Sep 17 00:00:00 2001 From: Eduardo Addad de Oliveira Date: Fri, 4 Oct 2019 18:52:35 +0000 Subject: [PATCH 13/34] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (3708 of 3708 strings) --- OsmAnd/res/values-pt-rBR/phrases.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/OsmAnd/res/values-pt-rBR/phrases.xml b/OsmAnd/res/values-pt-rBR/phrases.xml index 8d15b1a08c..b3fbe305fd 100644 --- a/OsmAnd/res/values-pt-rBR/phrases.xml +++ b/OsmAnd/res/values-pt-rBR/phrases.xml @@ -2604,7 +2604,7 @@ Sim Cobrança: sim Cobrança: não - Estação de auto-reparo de bicicletas + Estação de reparação de bicicletas Sim Medicina paliativa Voo livre (esporte) @@ -3719,10 +3719,10 @@ Destino Entrada da adega Alimentação saudável - - - - - - + Construtora + Destilaria + Marceneiro + Murro + Padaria + Marceneiro \ No newline at end of file From 539ae346fd37b8146083bf0b98c19998978d0378 Mon Sep 17 00:00:00 2001 From: Verdulo Date: Thu, 3 Oct 2019 21:42:47 +0000 Subject: [PATCH 14/34] Translated using Weblate (Esperanto) Currently translated at 100.0% (3708 of 3708 strings) --- OsmAnd/res/values-eo/phrases.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-eo/phrases.xml b/OsmAnd/res/values-eo/phrases.xml index fffb0044e9..2aba7be841 100644 --- a/OsmAnd/res/values-eo/phrases.xml +++ b/OsmAnd/res/values-eo/phrases.xml @@ -2335,7 +2335,7 @@ Akvokrano Butonprema: jes Butonprema: ne - Bicikla mem-riparejo + Bicikla mem-riparejo;memriparejo bicikla;riparejo bicikla;pumpilo bicikla;aerpumpilo bicikla Aersportoj elteriĝejo surteriĝejo @@ -3712,4 +3712,10 @@ destinita Enirejo al kelo Saniga manĝaĵo + Oficejo de konstruisto + Alkohol-distilejo + Laborejo de lignaĵisto + Oficejo de plank‑metisto + Bakejo (ne vendejo) + Laborejo de meblisto \ No newline at end of file From 3a1c553aae00537b15464c4e76ed4e2212888330 Mon Sep 17 00:00:00 2001 From: Zmicer Turok Date: Fri, 4 Oct 2019 09:14:20 +0000 Subject: [PATCH 15/34] Translated using Weblate (Belarusian) Currently translated at 97.0% (3595 of 3708 strings) --- OsmAnd/res/values-be/phrases.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-be/phrases.xml b/OsmAnd/res/values-be/phrases.xml index 48ae29e9eb..2af23af16e 100644 --- a/OsmAnd/res/values-be/phrases.xml +++ b/OsmAnd/res/values-be/phrases.xml @@ -2434,7 +2434,7 @@ Без пыласоса Пыласос Вольны палёт (спорт) - Стойка для рамонту ровараў + Стойка для рамонту ровараў; стойка для самастойнага рамонту ровараў Вадаправодны кран Уключаецца кнопкай: так Уключаецца кнопкай: не From 8dce9cefca3584b293bc6c464d750d9948de94fb Mon Sep 17 00:00:00 2001 From: uievawkejf Date: Sat, 5 Oct 2019 13:35:53 +0000 Subject: [PATCH 16/34] Translated using Weblate (Ukrainian) Currently translated at 96.8% (3590 of 3708 strings) --- OsmAnd/res/values-uk/phrases.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-uk/phrases.xml b/OsmAnd/res/values-uk/phrases.xml index 74d0efc259..c917117e75 100644 --- a/OsmAnd/res/values-uk/phrases.xml +++ b/OsmAnd/res/values-uk/phrases.xml @@ -2177,7 +2177,7 @@ Oyster Так Сіль - Стійка для самостійного ремонту велосипедів + Стійка для ремонту / самостійного ремонту велосипедів Карнавальні костюми Міні-футбол Інструкції для гостей: немає @@ -3594,5 +3594,5 @@ Джерело енергії: біомаса Доступ для снігоходів Доступ для автобусів - Доступ для будинків на колесах + Доступ для автопричепів \ No newline at end of file From f5945aaed91b68cc1d8e17a5f4d6b3d73f69fb47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sveinn=20=C3=AD=20Felli?= Date: Thu, 3 Oct 2019 14:26:17 +0000 Subject: [PATCH 17/34] Translated using Weblate (Icelandic) Currently translated at 100.0% (3708 of 3708 strings) --- OsmAnd/res/values-is/phrases.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/OsmAnd/res/values-is/phrases.xml b/OsmAnd/res/values-is/phrases.xml index 6a517cdadf..d08bfadc6b 100644 --- a/OsmAnd/res/values-is/phrases.xml +++ b/OsmAnd/res/values-is/phrases.xml @@ -2311,7 +2311,7 @@ Yfirborð: mold Sala á notuðum reiðhjólum Sala á notuðum reiðhjólum: nei - Stöð til að gera sjálf við reiðhjól + Reiðhjólaviðgerðastöð;Stöð til að gera sjálf við reiðhjól Athugasemd Módelflugsvæði Sögulegur kílómetrasteinn @@ -3704,10 +3704,10 @@ Sérstakt Kjallarainngangur Heilsufæði - - - - - - + Byggingafyrirtæki + Eimingarstöð + Trésmíði + Gólflagnafyrirtæki + Bökunarfyrirtæki + Skápasmíði \ No newline at end of file From 2830ece7ffd1e30b1f19d64b978aecc2db8dbd24 Mon Sep 17 00:00:00 2001 From: Oguz Ersen Date: Sat, 5 Oct 2019 19:43:12 +0000 Subject: [PATCH 18/34] Translated using Weblate (Turkish) Currently translated at 86.8% (2591 of 2986 strings) --- OsmAnd/res/values-tr/strings.xml | 1179 +++++++++++++++++------------- 1 file changed, 689 insertions(+), 490 deletions(-) diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml index 0454c751e2..dd35332226 100644 --- a/OsmAnd/res/values-tr/strings.xml +++ b/OsmAnd/res/values-tr/strings.xml @@ -1,11 +1,11 @@ Değişiklik listesini kapat - ZXing Barcode Scanner uygulaması kurulu değil. Uygulama marketinde aramak ister misiniz? + ZXing Barcode Scanner uygulaması yüklü değil. Google Play\'de ara\? Yol renk şemasını seç: Yol renk şeması Hedef yönü göster - Konum kayıt tutma hizmetlerini (GPX kaydı tutma, çevrim içi tracking) kullanmak için seyahat kaydetme eklentisini etkinleştir + Konum günlüğü hizmetlerini kullanmak için \"Yolculuk kaydı\" eklentisini etkinleştirin (GPX günlüğü, çevrimiçi izleme) Uzak hedefler için tahmini rotayı hesapla Lütfen GPS\'yi ayarlardan açık konuma getirin Log servisi @@ -15,13 +15,13 @@ Intermediate hedef %1$s Son ara nokta olarak ekle İlk ara hedef eklemek - Son ara nokta olarak ekle - İlk ara nokta olarak ekle + Son ara varış noktası olarak ekle + İlk ara varış noktası olarak ekle Varış noktasını değiştir Varış noktası halihazırda ayarlı: Varış noktaları Ara hedef %1$s çok uzak en yakın yol var. - Ara hedefine ulaştın + Ara hedefe ulaşıldı Ara hedef olarak eklemek Seyahatte ara hedef Bitiş noktası en yakın yoldan çok uzakta. @@ -41,7 +41,7 @@ Uyarıları göster… Pusulayı kullan Otoyollardan geçme - Hızınıza göre haritayı kendiliğinden yakınlaştırma (geçerli konum ile haritanız eşzamanlandığında) + Hızınıza göre zoom seviyesi (harita mevcut konumla senkronize edilirken). Haritayı kendiliğinden yakınlaştır POI filtresi yarat Ulaşım modu: @@ -52,7 +52,7 @@ Aktifleştir\nUygulamayı arka planda Durdur\nArka planda çalışan Uygulamayı Devam et - Ekran kilidini açmak için kilit simgesine basın + Ekran kilidini açmak için kilit simgesine dokunun Sokak ismi Neredeyim Ekran kilidi @@ -75,44 +75,44 @@ Takvim uygulamasına bir bildirim ekle ÖS ÖÖ - Park noktası - Uygulamayı güvenli kipte çalıştır (sisteme özgü kod yerine yavaş Android kodu kullanılarak). + Park yeri + Uygulamayı güvenli modda çalıştırın (yerel kod yerine daha yavaş Android kullanarak). Güvenli kip - Uygulama güvenli kipte çalışıyor (Ayarlar menüsünden kapatabilirsiniz). - Osmand arka plan hizmeti hala çalışıyor. Sen de bunu durdurmak istiyor musunuz? + Uygulama güvenli modda çalışıyor (\'Ayarlar\'dan kapatın). + OsmAnd arka plan hizmeti hala çalışıyor. Onu da durdur\? Ses/Video verisi Navigasyonu durdurmak istediğinize emin misiniz? Hedefi (ve ara hedefleri) temizlemek istediğinize emin misiniz\? Hassas yönlendirme (alfa) Göster - %2$s fotoğrafın %1$s cisi + Fotoğraf %1$s %2$s Fotoğraf çek Fotoğraf çek - Dropbox eklentisi, yol tariflerini ve ses/video notlarını dropbox hesabınızla eşitlemenize olanak verir. + Dropbox eklentisi, yol-izlerini ve ses/video notlarını Dropbox hesabınızla eşitlemenize olanak sağlar. Dropbox eklentisi Sıralamayı değiştir - Programın geliştirilebilmesi için lütfen çevreleme çizgileri eklentisini Mağazadan almayı da düşünün. + Lütfen geliştirmenin devamını desteklemek için \'Eşyükselti çizgileri\' eklentisini satın almayı düşünün. Çevreleme çizgileri eklentisi Video çek Ses kaydet - Varsayılan eklenti eylemini seçin + Varsayılan widget eylemini seçin. Varsayılan eklenti eylemi Video çıkış formatını seçin. Video formatı - Video için dahili kaydediciyi kullan + Video için sistem kayıt cihazını kullanın. Dahili kaydediciyi kullan Ses ve video ayarlarını yapılandır. Ses/Video ayarları - Kayıt sırasında hata oluştu - Kamera kullanılabilir değil + Kayıt başarısız + Kamera mevcut değil AB Açık haritası Kusursuz ve hassas rota hesapla. Henüz uzaklık kısıtlıdır ve yavaştır. Fotoğraflar için sistem uygulamasını kullan. Kamera uygulamasını kullan - Ses/Video kayıt ediliyor. Durdurmak için bu AV ikonuna basın. + Ses/video kaydediliyor. AV widget\'ine dokunarak durdurun. Belirtilen kayıttan bir ses çalınıyor.\n%1$s Harici oynatıcı aç - Bu kaydı silmek istiyor musunuz? + Bu ögeyi sil\? kullanılamaz Sesli bir not al Bir video notu al @@ -120,20 +120,24 @@ Kayıt oynatılamaz Kayıt sil Kayıt %3$s nın %1$s %2$s - kayıt + Kayıt Durdur Başlat Ses/video notları Çevrim dışı çevreleme çizgileri için OsmAnd eklentisi - "Bu eklenti OsmAnd çevrimdışı haritalarda eşyükseltileri (kabartma olarak) ve gölgeli yamaçları gösterir. Bu özellik çoğunlukla sporcular, uzun yürüyüşcüler, yürüyüşçüler ve tabii ki bir manzaranın kabartma yapısıyla ilgilenen herkesin takdirinedir.\n\nGlobal veri (70 derece kuzey ve 70 derece güney arasındaki) SRTM (Mekik Radar Topografi Misyonu) ve ASTER (Gelişmiş Uzay Termal Yayılma ve Yansıma Radyometre), bir görüntüleme aracı onboard Terra, NASA&#39;nın Earth Gözlem amiral gemisi uydudan ölçümleri esas Sistemi. ASTER NASA arasında bir kooperatif çabadır, Ekonomi, Ticaret ve Sanayi Odası (METI) ve Japonya Uzay Sistemleri (J-spacesystems) Japonya Bakanlığı. " + Bu eklenti OsmAnd çevrimdışı haritalarda eşyükseltileri (kabartma olarak) ve gölgeli yamaçları gösterir. Bu özellik çoğunlukla sporcular, uzun yürüyüşcüler, doğa yürüyüşçüleri ve tabii ki bir manzaranın kabartma yapısıyla ilgilenen herkes tarafından takdir edilecektir. +\n +\nGlobal veriler (70° kuzey ve 70° güney arasındaki) SRTM (Shuttle Radar Topography Mission) ve ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), NASA\'nın Dünya Gözlem Sisteminin amiral uydusu olan Terra üzerindeki bir görüntüleme aracı, tarafından yapılan ölçümlere dayanmaktadır. ASTER NASA, Japonya Ekonomi, Ticaret ve Sanayi Bakanlığı (METI) , ve Japon Uzay Sistemleri (J-spacesystems) arasında ortak bir efordur. Mesafe ölçümü - Notu ile ilişkilendirmek Yer henüz tanımlanmamıştır. &quot;Konumu kullan ...&quot; Belirtilen yere not atamak + Notla ilişkilendirilecek konum henüz tanımlanmadı. Belirtilen konuma bir not atamak için \"Konumu kullan...\". Sesli notlar Ses / video eklentisi harita üzerinde herhangi bir pozisyon için harita ekranında bir düğme veya doğrudan bağlam menüsünü kullanarak, bir yolculuk sırasında ses / fotoğraf / video notlar almak için işlevsellik sağlar belirtiyor. Ses/video notları bölümler Çevreleme çizgileri - "Bu eklenti OsmAnd çevrimdışı haritalarda eşyükseltileri (kabartma olarak) ve gölgeli yamaçları gösterir. Bu özellik çoğunlukla sporcular, uzun yürüyüşcüler, yürüyüşçüler ve tabii ki bir manzaranın kabartma yapısıyla ilgilenen herkesin takdirinedir. " + Bu eklenti OsmAnd çevrimdışı haritalarda eşyükseltileri (kabartma olarak) ve gölgeli yamaçları gösterir. Bu özellik çoğunlukla sporcular, uzun yürüyüşcüler, doğa yürüyüşçüleri ve tabii ki bir manzaranın kabartma yapısıyla ilgilenen herkes tarafından takdir edilecektir. (Lütfen, eşyükselti çizgisi ve/veya kabartma verilerinin ayrı olduğunu, eklentiyi etkinleştirdikten sonra ek indirmeler bulunduğunu unutmayın.) +\n +\nGlobal veriler (70° kuzey ve 70° güney arasındaki) SRTM (Shuttle Radar Topography Mission) ve ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), NASA\'nın Dünya Gözlem Sisteminin amiral uydusu olan Terra üzerindeki bir görüntüleme aracı, tarafından yapılan ölçümlere dayanmaktadır. ASTER NASA, Japonya Ekonomi, Ticaret ve Sanayi Bakanlığı (METI) , ve Japon Uzay Sistemleri (J-spacesystems) arasında ortak bir efordur. Eşyükselti çizgileri Diğer haritalar Sadece yollar @@ -141,21 +145,62 @@ Standart Harita Yalnızca yolları gösteren harita Sınırlar - Bölgesel sınırların gösterimini sakla (admin düzeyleri 5-9) + Bölgesel sınırların gösterilmesini önle (yönetici düzeyleri 5-9). Hız sınırı Enlem %1$.3f, boylam %2$.3f Bina bulunmadı. Adım adım şehiri arama - + Daha fazla köy/posta kodu ara sadece haritalar görüntülemek için seç-sadece haritalar: Yollar-sadece haritalar - Trafik uyarıları (hız sınırları, zorunlu duruşlar, hız tümsekleri), hız kamerası uyarıları ve şerit bilgilerini yapılandırma - + Trafik uyarıları (hız sınırları, zorunlu duruşlar, hız tümsekleri, tüneller), hız kamerası uyarıları ve şerit bilgilerini yapılandır. + Başka bir başlık algılanmadığında pusulayı kullan. Navigasyon sırasında konumu yola uydur. Yola tuttur - " ↵ →→OsmAnd (OSM Otomatik Navigasyon Var)↵ ↵ →→OsmAnd küresel bir yelpazede erişimi olan açık kaynak kodlu bir navigasyon uygulaması OpenStreetMap (OSM) verileri.Tüm harita verisi ( vektör veya kiremit haritaları ) çevrimdışı kullanım içintelefon hafıza kartında saklanabilir .OsmAnd da turn - by-turn sesli rehberlik dahil offline ve online yönlendirme işlevselliği sunuyor.↵ ↵ →→Çekirdek özelliklerden bazıları:↵ →→- Komple isimli işlevselliği (seçilebilir bir klasöre mağaza indirilen vektör veya kiremit haritaları)↵ →→- Kompakt isimli vektör mevcuttüm dünya için haritalar↵ →→- Ülkenin veya bölgenin indirinapp doğrudan harita ↵ →→- GPX veya navigasyon parça , Görülecek Yerler gibi olası çeşitli harita katmanları , Yerleşimi, sık , kontur çizgileri , toplu taşıma durakları , özelleştirilebilir şeffaflık ek haritaları↵ →→- Adresler ve yerler için çevrimdışı arama (POIs)↵ →→- Kısa mesafeler için Çevrimdışı yönlendirme (deneysel)↵ →→- Ile otomobil , bisiklet ve yaya modları:↵ →→- İsteğe bağlı otomatik gündüz / gece görünümü anahtarlama↵ →→- İsteğe bağlı hız bağımlı harita yakınlaştırma↵ →→- hareket pusula veya yöne göre isteğe haritası hizalama↵ →→- İsteğe bağlı şerit rehberlik , hız sınırı göstergesi , kaydedilmiş ve TTS sesler↵ ↵ →→OsmAnd bu ücretsiz sürümü Sınırlamaları:↵ →→- Sınırlı harita indirilme sayısı↵ →→- Wikipedia erişim isimli POIs yok↵ ↵ →→OsmAnd aktif gelişmiş ve bizim proje ve daha fazla ilerlemegelişimini finanse etmek için mali katkılar dayanır ve yeni işlevler testdriving ediliyor .Osmand.net üzerinde genel bir bağış OsmAnd satın alma , ya da belirli yeni özellikler fon veya yapmayı düşünün lütfen.↵ → " + OsmAnd (OSM Automated Navigation Directions) +\n +\n OsmAnd, çok geniş ölçekte global OpenStreetMap (OSM) verilerine erişim sağlayan açık kaynaklı bir yazılımsal navigasyon uygulamasıdır. Tüm harita verileri (vektör veya karo haritaları) çevrimdışı kullanım için telefonun hafıza kartında saklanabilir. Sırayla sesli rehberlik de dahil olmak üzere çevrimdışı ve çevrimiçi yönlendirme işlevi de sunulmaktadır. +\n +\n Temel özelliklerden bazıları: +\n - Eksiksiz çevrimdışı işlevsellik (indirilen vektör veya karo haritalarını aygıt deposunda saklayın) +\n - Tüm dünya için kompakt çevrimdışı vektör haritaları +\n - Doğrudan uygulamadan ülke veya bölge haritalarının indirilmesi +\n - GPX veya navigasyon rotaları, Points of Interest, Sık Kullanılanlar, eşyükselti çizgileri, toplu taşıma durakları, özelleştirilebilir şeffaflığa sahip ek haritalar gibi birkaç harita katmanının üst üste konması +\n - Adresleri ve yerleri çevrimdışı arama (POI\'ler) +\n - Orta menzilli mesafeler için çevrimdışı yönlendirme +\n - İsteğe bağlı olarak araba, bisiklet ve yaya modları: +\n - Otomatik gündüz/gece görünümü değiştirme +\n - Hıza bağlı harita yakınlaştırma +\n - Pusulaya veya hareket yönüne göre harita hizalama +\n - Şerit yönlendirme, hız sınırı göstergesi, kaydedilmiş ve TTS sesleri +\n +\n OsmAnd\'ın bu ücretsiz sürümünün sınırlamaları: +\n - Harita indirme sayısı sınırlı +\n - Wikipedia POI\'lerine çevrimdışı erişim yok +\n +\n OsmAnd aktif olarak geliştirilmektedir ve projemiz ve devam eden ilerlemesi, yeni işlevsellik geliştirmek ve test etmek için finansal katkılara dayanmaktadır. Lütfen OsmAnd+ ürününü satın almayı ya da belirli yeni özellikleri finanse etmeyi veya https://osmand.net adresinden genel bağışta bulunmayı düşünün. Küresel Mobil Harita Görüntüleme & Yolbul için Çevrim Dışı ve Çevrim İçi OSM Haritaları - " OsmAnd (OSM Automated Gezinti Tarifi) OsmAnd küresel OpenStreetMap (OSM) veri çok çeşitli erişimi olan bir açık kaynak navigasyon bir uygulamadır. Tüm harita verisi (vektör veya kiremit harita) çevrimdışı kullanım için telefonun hafıza kartında saklanabilir. OsmAnd zamanda turn-by-turn sesli yönlendirme dahil olmak üzere çevrimiçi ve çevrimdışı yönlendirme işlevselliği sunuyor. OsmAnd Eğer, projeyi destekleyen yeni özellikler geliştirme fonu, ve en son güncellemeleri almak onu satın alarak, ücretli uygulama sürümüdür. Temel özelliklerden bazıları: - Komple çevrimdışı işlevsellik (seçilebilir klasör deposu indirilen vektör veya kiremit harita) - Mevcut tüm dünya için Kompakt çevrimdışı vektör haritaları - doğrudan app ülke veya bölge haritaları Sınırsız indirme - Çevrimdışı Vikipedi özelliği (indir İÇN Wikipedia), gezi için büyük - adresleri ve yerleri (POI) için Çevrimdışı arama - GPX veya navigasyon parçaları, İlgi Çekici Nokta, sık, kontür çizgileri, toplu taşıma durakları, özelleştirilebilir şeffaflık ek haritalar gibi olası birçok harita katmanları Yerleşimi, - - İsteğe bağlı otomatik gündüz / gece görüntüsüyle anahtarlama - yakınlaştırma opsiyonel hız bağımlı haritası - hareket pusula veya yönüne göre opsiyonel harita hizalama - İsteğe bağlı şerit takibi, hız: Otomobil, bisiklet ve yaya ile modları - Kısa mesafelerde (deneysel) için Çevrimdışı yönlendirme sınırı göstergesi kaydedilmeli ve TTS sesleri " + OsmAnd+ (OSM Automated Navigation Directions) +\n +\n OsmAnd+, çok geniş ölçekte global OpenStreetMap (OSM) verilerine erişim sağlayan açık kaynaklı bir yazılımsal navigasyon uygulamasıdır. Tüm harita verileri (vektör veya karo haritaları) çevrimdışı kullanım için telefonun hafıza kartında saklanabilir. Sırayla sesli rehberlik de dahil olmak üzere çevrimdışı ve çevrimiçi yönlendirme işlevi de sunulmaktadır. +\n +\n OsmAnd+, uygulamanın ücretli versiyonudur, onu satın alarak projeyi desteklemekte, yeni özelliklerin gelişimini finanse etmekte ve en son güncellemeleri almaktasınız +\n. +\n Temel özelliklerden bazıları: +\n - Eksiksiz çevrimdışı işlevsellik (indirilen vektör veya karo haritalarını aygıt deposunda saklayın) +\n - Tüm dünya için kompakt çevrimdışı vektör haritaları +\n - Doğrudan uygulamadan sınırsız olarak ülke veya bölge haritalarının indirilmesi +\n - Çevrimdışı Wikipedia özelliği (Wikipedia POI\'lerini indir), gezip görmek için harikadır +\n - GPX veya navigasyon rotaları, Points of Interest, Sık Kullanılanlar, eşyükselti çizgileri, toplu taşıma durakları, özelleştirilebilir şeffaflığa sahip ek haritalar gibi birkaç harita katmanının üst üste konması +\n +\n - Adresleri ve yerleri çevrimdışı arama (POI\'ler) +\n - Orta menzilli mesafeler için çevrimdışı yönlendirme +\n - İsteğe bağlı olarak araba, bisiklet ve yaya modları: +\n - Otomatik gündüz/gece görünümü değiştirme +\n - Hıza bağlı harita yakınlaştırma +\n - Pusulaya veya hareket yönüne göre harita hizalama +\n - Şerit yönlendirme, hız sınırı göstergesi, kaydedilmiş ve TTS sesleri +\n Gün doğumu:%1$s \nGün batımı:%2$s Öznitelikleri oluşturma @@ -165,7 +210,7 @@ Asfaltsız yollardan kaçın Feribotlardan kaçın Kaçın… - Paralı yollardan, asfaltsız yollardan, feribotlardan kaçın + Örn. paralı yollardan, asfaltsız yollardan, feribotlardan kaçının. Floresan rotalar Cetvel Şeffaf widget\'lar @@ -182,7 +227,7 @@ e-posta Araba şu zamanda park edildi Başlangıç noktası en yakın yoldan çok uzakta. - Arabayı park ettiğiniz konumu silmek istiyor musunuz? + Park yeri işaretleyicisini sil\? Zaman-sınırlı Zaman-sınırsız Süresi kısıtlı park @@ -192,23 +237,23 @@ Sağda kalın ve devam edin Haritayı daha detaylı göster Adres arama - Favorileri arama - Başlangıç noktası henüz belirtilmedi + Sık Kullanılanları aramanın bir yolu + Başlangıç noktası henüz belirlenmedi Konum henüz bilinmiyor - Dosya indirirken iptal etmek istiyor musunuz? - Hiçbir şey bulunamadı. Eğer bölgenizi bulamıyorsanız, kendiniz yapabilirsiniz (bakınız: http://osmand.net). + Dosya indirmeyi iptal et\? + Hiçbir şey bulunamadı. Eğer bölgenizi bulamıyorsanız, kendiniz yapabilirsiniz (bakınız: https://osmand.net). Standart haritalar (vektör) Çevrim içi haritalar Destek Yardım Açık Kapalı - Menüye Geri Dön + Menüye dön Uzaklaştır Yaklaştır kuzey Buradayım - POI açıklaması göster + POI açıklamasını göster. Avrupa Avrupa - Fransa Avrupa - Almanya @@ -239,20 +284,20 @@ Hayır, teşekkürler İndir Yeni Arama - Haritadaki yer adları için yazı boyutunu seçin + Haritadaki adlar için metin boyutunu seçin. Harita yazı karakteri boyutu - Dil desteklenmemektedir + Desteklenmeyen dil Kayıp data - Harita zaten yüklenmiş, Ayarlar güncellenecek - Çevrim dışı aramada hata oluştu - Coğrafi konum ara + Harita zaten kurulu, \'Ayarlar\' güncellenecek. + Çevrimdışı arama gerçekleştirilemedi. + Coğrafi konuma göre ara Sistem - Ekran dilini seç (değiştirdikten sonra lütfen OsmAnd\'ı yeniden başlatın) + Ekran dilini seçin (OsmAnd yeniden başlatıldığında etkinleşir). Ekran dili Tamamlanmamış Sonraki Önceki - Uzunluk ve hız birimlerini değiştir + Mesafe ölçüm birimini değiştirin. Kilometre/metre Eğitim Acil durum @@ -274,10 +319,10 @@ Yüksek çözünürlüklü ekran Kaydedilen Ses Vektör haritalar yüklenmedi - Çevrim dışı vektör haritaları + Çevrimdışı vektör haritaları POI sil - Favoriler şuraya başarıyla kaydedildi: {0} - Kaydedecek favori noktalar yok + Sık Kullanılanlar {0} konumuna kaydedildi + Kaydedilecek Sık Kullanılan nokta yok Rapor gönder Herhangi Yandex Trafik @@ -301,7 +346,7 @@ Sola hafifçe dönün ve ilerleyin U dönüşü yapın ve ilerleyin Sonra - Sinyal aranıyor… + Sinyal bekleniyor… Rotalar Ok Hepsini temizle @@ -311,7 +356,7 @@ Yolbul hizmeti Adres İndirildi - İÇN yükleniyor… + POI yükleniyor… başarısız Posta kodları yükleniyor… Şehirler yükleniyor… @@ -328,10 +373,10 @@ Ayarlar Haritayı güncelle "Hedef " - Favorilere ekle - Haritalarda ingilizce yer adlarını kullan - 3D harita görünümünü etkinleştir - POI göster + \'Sık Kullanılanlar\'a ekle + Haritalarda İngilizce isimler kullanın + Haritanın 3D görünümünü etkinleştirin. + POI yerleşimini göster Harita kaynağı İnterneti kullan Pozisyonunuzu göster @@ -341,9 +386,9 @@ POI seç Daha fazla bul Varsayılan - Araba - Bisiklet - Yaya + Araba sürme + Bisiklet sürme + Yürüme Merkez Haritada göster Adres seç @@ -355,16 +400,16 @@ Ekle Hayır Favori - Favoriyi sil + Sık Kullanılanı sil Mesaj Yazar adı - Yorum başarıyla eklendi - İstisnai durum oluştu: yorum eklenemedi + Yorum eklendi + Yorum eklenemedi POI düzenle POI oluştur POI sil Sil - POI başarıyla silindi + POI silindi ekle değiştir @@ -373,31 +418,30 @@ ACİL Oynat Uyandırma aralığı ayarlayın: - Önceki navigasyon bitmemiş. Onu izlemeye devam et? (%1$s saniye) - Pozisyon bulundu sonra rota hesaplanacak + Önceki bitmemiş navigasyonu izlemeye devam et\? (%1$s saniye) + Rotayı hesaplamak için pozisyon bekleniyor Rota hızlanma animasyonu seçin Ayrılan bellek %1$s MB(Android sınırı %2$s MB, Dalvik %3$s MB). - Uygulaması tarafından ayrılan toplam yerel bellek %1$s MB (Dalvik %2$s MB, diğer %3$s MB. tarafından tahsis. Orantılı bellek %4$s MB (Android limiti %5$s MB, Dalvik %6$s MB). + Uygulama tarafından ayrılan toplam yerel bellek %1$s MB (Dalvik %2$s MB, diğer %3$s MB). Oransal bellek %4$s MB (Android limiti %5$s MB, Dalvik %6$s MB). Paylaşılan konum Park yerinden arabayı almak - Aracını almak için Bildirim önceden takvimine eklendi.Onu elden silinceye kadar orada kalacaktır. - Park etme süre sınırı ayarla + Aracınızı almaya ilişkin bir bildirim takviminize eklendi. Manuel olarak silene kadar orada kalacaktır. + Park süresi limitini ayarla Bir park etme işareti sil Park etme türü seç Zaman-sınırsız park et - De arabayı almak için: - Park yeri konumu eklentisi arabanızın nerede park edildiğini ve (eğer zaman limiti varsa) ne kadar park süresi kaldığını hatırlamanızı sağlar. -\n -\nPark konumu ve park süresi OsmAnd kontrol panelinde ve harita ekranındaki widget ta görüntülenir. Android takvimine hatırlatıcı olarak bir alarm eklenebilir. + Aracı almak için: + Park yeri eklentisi, aracınızın nereye park edildiğini ve ne kadar park süresi kaldığını (bir süre sınırı varsa) kaydetmenizi sağlar. +\nHem konum hem de zaman OsmAnd gösterge panelinde ve harita ekranındaki bir widget\'ta görünür. Android takvimine hatırlatıcı olarak alarm eklenebilir. Park Etme Konumu - Bir park etme işareti sil + Park etme işaretini sil Halk Teşhis edilebilir Takip edilebilir Özel - Yaklaşık yuvarlak olarak: al %1$d çık ve git - Haritadaki tüm alansal arazi özelliklerini şeffaf Yap - + Döner kavşak: %1$d çıkışa girin ve devam edin + Tüm arazi alan özelliklerini harita üzerinde şeffaf hale getirin. + Çokgenler işleme modu Için haritayı optimize et Yakınlaştırma düzeyindenekran(gerektirir kontur veriler): @@ -409,43 +453,47 @@ Koordinatlar Toplu taşıma arama OsmAnd çevrim dışı yolbul geçici olarak kullanılamıyor. - Soldan-direksiyonlu araç sürüşü - Sol taraftan akan trafiğe sahip ülkeler için seçin + Soldan akan trafik + İnsanların yolun sol tarafında araba kullandığı ülkeler için. "Şeffaflık değiştir(0 -Şeffaf,255-opak) " - OsmAnd kullandığınız için teşekkür ederiz. Bu uygulamanın bir çok özelliği için \'Ayarlar\' → \'Veri Yönetimi\' kısmından edinebileceğiniz bölgesel çevrim dışı veriye ihtiyacınız var. Daha sonra haritaları görebilir, adres bulabilir, POI (İhtiyaç Noktalarına) bakabilir ve toplu taşıma bulabilirsiniz. - Baz haritası doğru uygulama çalışması için gereklidir ve indirmek için seçildi. + OsmAnd\'ı kullandığınız için teşekkür ederiz. Haritaları görüntülemek, adresleri bulmak, POI\'leri aramak, toplu taşıma araçlarını bulmak ve daha fazlasını yapmak için \'Ayarlar\' → \'Harita dosyalarını yönet\' ile çevrimdışı kullanım için bölgesel verileri indirin. + Uygulamanın çalışması için gerekli Temel Harita indirme için seçildi. Çevrim içi ve önbelleğe alınan döşeme haritalar - Aygıtınızda saklanan çevrim dışı harita dosyaları yönet ve indir - Farklı harita kaynaklarını seçmek için Online haritalar eklentisi etkinleştirme + Cihazınızda depolanan çevrimdışı harita dosyalarını indirin ve yönetin. + Farklı harita kaynaklarını seçmek için \'Çevrimiçi haritalar\' eklentisini etkinleştirin Çevrimiçi ve çini harita - Çevrimiçi haritalar kullan (SD kart üzerine indirme ve önbellek verisi) - Çevrimiçi veya önbelleğe alınmış çini harita kaynaklarını yapılandırın - "Bu eklenti ile bir çok çevirimiçi (karo ya da raster) haritaya erişebilirsiniz, önceden tanımlanmış Openstreetmap karolarından (Mapnik gibi) uydu görüntülerine, hava haritaları gibi özel amaçlı katmanları, iklim haritaları, jeolojik haritalar, tepe katmanları, vb\n\nHerhangi bir harita ana (taban) olarak kullanılabilir ve OsmAnd ana harita ekranında gösterilir, veya başka bir ana haritaya üstlük, ya da altlık olabilir (normal OsmAnd çevrimdışı haritalar gibi). Herhangi bir altlık haritayı daha görünür yapmak, veya istediğiniz unsurları gizlemek için ‘Haritayı yapılandır’ bölümünden seçilebilir.\n\nKaro haritalar doğrudan çevrimiçi edinilebilir, veya çevrimdışı kullanmak için sqlite veritabanı üçüncü parti harita hazırlama araçları ile oluşturup hazırlanabilir (OsmAnd klasörüne elle kopyalamak gerekir). " - Bu eklenti Osmand doğrudan cihazın erişilebilirlik özellikleri kullanılabilir hale getirir. Bu, örneğin kolaylaştırır TTS sesler konuşma hızını, yön-pad ekran navigasyon yapılandırmak yakınlaştırma kontrolü için bir topunu kullanarak, ya da konumunu duyuran oto için olduğu gibi, text-to-speech geribildirim kullanarak ayarlama. + Çevrimiçi haritalar kullanın (döşemeleri bellek kartına indir ve önbelleğe al). + Çevrimiçi veya önbelleğe alınmış karo harita kaynaklarını yapılandırın. + Bu eklenti ile, önceden tanımlanmış OpenStreetMap karolarından (Mapnik gibi) uydu görüntülerine, ve hava haritaları, iklim haritaları, jeolojik haritalar, hillshade katmanları, vb. gibi özel amaçlı katmanlara kadar birçok çevirimiçi (karo ya da raster) haritaya erişebilirsiniz. +\n +\nHerhangi bir harita ana (temel) olarak kullanılabilir ve OsmAnd ana harita ekranında gösterilir, ya da başka bir temel haritaya üst, ya da alt katman olabilir (OsmAnd\'ın standart çevrimdışı haritaları gibi). Herhangi bir alt katman haritayı daha görünür yapmak için, ‘Haritayı yapılandır’ menüsünden OsmAnd vektör haritalarının belirli elemanları intenildiği şekilde kolaylıkla gizlenebilir. +\n +\nKaro haritalar doğrudan çevrimiçi kaynaklardan edinilebilir, ya da çeşitli 3. parti harita hazırlama araçları tarafından üretilebilen bir SQLite veritabanı olarak çevrimdışı kullanım için (ve manuel olarak OsmAnd\'ın veri klasörüne kopyalanabilir) hazırlanabilir. + Bu eklenti, cihazın erişilebilirlik özelliklerini doğrudan OsmAnd\'da kullanılabilir kılar. Örneğin; TTS sesleri için konuşma hızını ayarlamak, yön tuş takımı ekranı navigasyonunu yapılandırmak, zoom kontrolü için hareket topunu kullanmak veya örneğin konumunuzu otomatik olarak duyurmak için metinden konuşmaya geri bildirim. Bu eklenti geliştirme ve hata ayıklama özellikleri için ayarları test etmek ya da isteyen yönlendirme, ekran render performansı veya ses simüle etmek istiyorum gösterir. Bu ayarlar geliştiriciler için tasarlanmıştır ve genel kullanıcı için gerekli değildir. Eklentiler Eklentiler gelişmiş ayarları ve ek işlevselliği etkinleştirir. Eklentiler - Bu eklenti Osmand aracılığıyla oluşturma veya değiştirme OSM POI nesneleri açma veya OSM hataları yorumlama ve kaydedilen GPX dosyaları katkıda gibi OSM katkıda bulunmak için kullanılabilir. OSM bir topluluk odaklı, küresel kamu malı haritalama projesidir. Detaylar için https://openstreetmap.org başvurun. Aktif katılım takdir ve app kişisel OSM kimlik belirtirseniz katkıları, Osmand doğrudan yapılabilir. + Bu eklenti aracılığıyla OsmAnd, OSM POI nesneleri oluşturmak veya değiştirmek, OSM Notlarını açmak veya yorumlamak ve kaydedilmiş GPX dosyalarıyla katkıda bulunmak gibi OSM\'ye katkı yapmak için kullanılabilir. OSM, topluluk odaklı, global bir kamu malı haritalama projesidir. Ayrıntılar için lütfen https://openstreetmap.org adresine bakın. Aktif katılım takdir edilmektedir, ve uygulamada kişisel OSM kimlik bilgilerinizi belirtmeniz halinde doğrudan OsmAnd\'dan katkı sağlanabilir. Vektörel haritalar daha hızlı görüntülenir. Bazı aygıtlarda düzgün çalışmayabilir. - Seçili ses komutları oynat + Bir ses seçin ve promptları oynatarak test edin OsmAnd gelişimi Yerel render etme Sesli uyarıları dene - Bu konum için mevcut çevrim dışı vektör haritası yok. Ayarlar biri (harita dosyalarını yönetme) indirmek veya çevrimiçi haritalar (bunun için eklentisi çevrimiçi haritalar etkinleştirmek) geçiş yapabilirsiniz. + Bu konum için çevrimdışı vektör haritası yok. \'Ayarlar\'dan (\' Harita dosyalarını yönet \') birini indirin ya da \'Çevrimiçi haritalar\'eklentisine geçin. GPX dosyalarını OSM ye gönder? Görünürlük Etiketler Tanım - OSM kullanıcı adı ve GPX dosyaları yüklemek için şifre belirtin. + GPX dosyalarını yüklemek için lütfen OSM kullanıcı adınızı ve şifrenizi belirtin. Yeni özellikler Destekle - Uygulamada uygulanan yeni özellikleri görmek için bağış yap + Uygulamada hayata geçirilen yeni özellikleri görmek için bağış yapın. Ekran cetveli Bilgi - Konuma geri dön + Konuma dön Erişilebilirlik modu - Erişilebilirlik özelliklerine dön - Global sistem ayarına göre + Engelli kullanıcılar için özellikleri açar. + Android sistem ayarına göre Yakınlaştırma düzeyi kuzey-kuzey-doğu kuzey-doğu @@ -478,34 +526,34 @@ Yandaki akıllı (8 sektör) Saat Yönünde (12 sektör) Yön stili - Hareket ederken göreceli yönleri ifade etmek için bir stil seçin + Hareket ederken göreceli yönleri ifade etmek için bir stil seçin. Duyuruyu otomatik başlat Duyuruyu otomatik durdur - Yatay topunu hamle ile yakınlaştırarak haritayı değiştirme + Yatay trackball hareketi ile harita yakınlaştırmayı değiştirin. Zoom kontrolü için topunu kullan - Erişilebilirlik ile ilgili tercihler + Erişilebilirlikle ilgili tercihler. Erişilebilirlik Seçilen alanı görüntülemek için işlem belleği yeterli değil Floresan bindirmeleri - Parkur ve güzergah görüntülemek için floresan renkler kullan + Parkur ve rotaları görüntülemek için floresan renkler kullanın. Çevrim dışı düzenleme - Her zaman çevrim dışı düzenlemeyi kullan - Uygulama içinde POI değişiklikleri indirilen harita dosyaları etkilemez, bunun yerine yerel bir dosyaya kaydedilir. - Yükleniyor … + Her zaman çevrimdışı düzenlemeyi kullanın. + Uygulama içinde POI değişiklikleri indirilen harita dosyalarını etkilemez, bunun yerine değişiklikler cihazınızda bir dosya olarak kaydedilir. + Yükleniyor… {0} POI / Notlar yüklendi tümünü yükle OSM modifikasyonu yükle modifikasyonu sil Asenkron OSM düzenleme: - Yerel OSM POIler / Notlar kurtardı - Yerel veritabanında belirtilmiş POIler/Hataları OSMde gösterme ve yönetme - Canlı izleme aralığı belirtin + OSM POI\'leri/Cihazda kayıtlı notlar + Cihazdaki veritabanında belirtilen OSM POI\'lerini/Notlarını göster ve yönet. + Çevrimiçi izleme aralığını belirtin. Canlı izleme aralığı - "Parametre sözdizimi ile web adresini belirtin: Enlem={0}, Boylam={1}, Damga zamanı={2}, HDOP={3}, Rakım={4}, Hız={5}, bearing={6} " + Parametre sözdizimi ile web adresini belirtin: enlem={0}, boylam={1}, zaman damgası={2}, hdop={3}, rakım={4}, Hız={5}, bearing={6}. Web adresinden izlemeyi canlı izlemek Track\'ın kaydını GPX widget\'ı kullanarak ya da \'Seyahat kaydetme\' ayarları aracılığıyla tut. Geçerli izi göster - Bu ücretsiz OsmAnd sürümü %1$s indirmeyle sınırlanmıştır ve çevrim dışı Vikipedi maddelerini desteklemez. + %1$s haritayı indirebilir ya da güncelleyebilirsin. Ücretsiz sürüm Kuzey Amerika Kuzey Amerika - Amerika Birleşik Devletleri @@ -515,26 +563,26 @@ Avustralya ve Okyanusya Dünya ve konu haritaları Dünya Wikipedia POIleri - Daha önce dışarıdan alınan favorili dosya zaten var. Bunu değiştirmek istiyor musunuz? + Daha önce dışa aktarılan Sık Kullanılanları içeren dosya zaten var. Değiştir\? Profile Özel Ayarlar Harita görünümü ve navigasyon ayarları kullanılan profile göre hatırlanır. Varsayılan profilinizi burada ayarlayın. Navigasyon - Yolbul için seçenekleri belirtin + Navigasyon seçeneklerini belirtin. Genel ayarlar Harita dosyalarını yönet Genel - Uygulama için ekran ve ortak ayarları yapılandırma + Uygulama için ekran ve ortak ayarları yapılandırın. Genel uygulama ayarları OSM kullanıcı adınız - Openstreetmap.org gönderimler için gereklidir + openstreetmap.org gönderimleri için gereklidir. Arka plan modu - Ekran kapalı iken Osmand arka planda çalışır + OsmAnd ekran kapalıyken arka planda çalışır. {0} dosya(lar) indirilsin mi? {1} MB depolama alanı kullanılmaktadır. (Şu anda kullanılabilir alanda {2} MB vardır.) Şeffaf tema Yerel kütüphane bu aygıtta desteklenmiyor. Yerel kütüphane başlatılıyor… Harita görünümünü otomatik olarak ortala - Geçerli konum ile harita görünümünü eşzamanlamaya kadar geçecek süre + Harita görünümünün geçerli konumla senkronize edilmesine kadar geçen süre. Otomatik-sadece merkezi nav Otomatik-navigasyon yaparken sadece merkezi harita görünümü. Haritayı kullanırken görünümü otomatik olarak ortala. @@ -566,30 +614,30 @@ POI veri dosyası \'%1$s\' gereksiz ve silinebilir. POI değişikliklerinin kaydedilebileceği yerel dosya bulunamadı ve oluşturulamadı. OsmAnd+\'a Yükselt - Sunucuda yüklü haritalar uygulamanın versiyonuyla uyumlu değil. Bunları kullanabilmek için uygulama sürümünüzü yükseltmelisiniz. + Yeni harita dosyalarını kullanabilmek için uygulamanın yeni sürümünü indirin. Konum aranıyor… Benim Konum (bulundu) Tanımlanmamış Güncel harita merkezi Menşei: - Buraya yakın ara + Yakınlarda ara Yeni GPX dosyası olarak kaydet Rota \'%1$s\' olarak kaydedildi. - "Dosya adı: " - OSM Comunity üzerine haritaları geliştirmek için kullanılacak GPX dosyaları yükleyin. - %2$d/%1$d nesne yüklendi. + Dosya adı: + GPX dosyalarını OSM topluluğuna yükleyin ve haritaları iyileştirin. + %1$d/%2$d öge yüklendi. OSM\'ye Gönder Daha fazla harita detayı - Favari nokta(lar) silindi. - %1$d favori ve %2$d favori grubunu silmek istediğinize emin misiniz? + Sık kullanılan noktalar silindi. + %1$d Sık Kullanılan ve %2$d Sık Kullanılan grubu sileceksiniz. Emin misiniz\? " \n \nAyarlar için ekrana uzun basın" Yerel Versiyon - %1$d/%2$d nesne pasifleştirildi. - %1$d/%2$d nesne silindi. - %1$d/%2$d nesne aktifleştirildi. - Harita dosyalarını yönetin + %1$d/%2$d öge devre dışı bırakıldı. + %1$d/%2$d öge silindi. + %1$d/%2$d öge aktifleştirildi. + Harita dosyalarını yönetin. Aktifleştir Pasifleştir POI Verisi @@ -602,9 +650,9 @@ POI Verisi TTS sesi Hata ayıklama bilgisi dönüştürülüyor - Dönüştürme performansını göster + Rendering performansını görüntüleyin. Yeni veri(ler) açılıyor… - Çevrimiçi navigasyon servisi seçildi ancak İnternet bağlantısı kullanılabilir değil. + Bir çevrimiçi navigasyon servisi seçili ancak İnternet’e bağlı değilsiniz. Tepe gölgesi katmanı FPS hata ayıklama bilgisi Sürüş bölgesini seç: ABD, Avrupa, İngiltere, Asya ve Diğerleri. @@ -615,12 +663,12 @@ Avrupa, Asya, Latin Amerika ve benzeri Birleşik Krallık (İngiltere), Hindistan ve benzerleri Bildir… - Sokak isimleri, trafik uyarıları (zorunlu duruşlar, hız tümsekleri), hız kamerası uyarıları, hız sınırları bildirimini ayarla + Sokak isimlerini, trafik uyarılarını (zorunlu duruşlar, hız tümsekleri), hız kamerası uyarılarını, hız sınırlarını anonslamak için yapılandırın. Cadde isimleri (TTS) Hız sınırı Hız kameraları Trafik uyarıları - Lütfen OSM kullanıcı adı ve şifrenizi Ayarlar bölümünde belirtin + Lütfen OSM kullanıcı adı ve şifrenizi \'Ayarlar\' bölümünde belirtin Yol tarifi Yol tarifi Harita: @@ -632,7 +680,7 @@ Önce şehir ya da sokak seç Komşu şehirlerdeki sokak için ara kapıdan kapıya sırala - OSM değişiklik dosyası başarıyla oluşturuldu + OSM değişiklik dosyası oluşturuldu %1$s OSM değişiklikleri yedeklenemedi Mevkiyi sil süre @@ -669,11 +717,11 @@ Uygulama gövdesi Erişilebilirlik ayarları Adres seç - Favoriyi seç + Sık Kullanılan seç OSM değişiklikleri Diğer komutlar Kontür çizgileri - Sürüm : + Versiyon: Hakkında Sürüm bilgisi, lisanslar, proje üyeleri Sona erecek (dakika): %1$s @@ -685,21 +733,21 @@ Adres Varolanı seçin… Tanımla/Düzenle… - + Ara hedefleri temizle Ara hedefler tutun Zaten ara hedefleri belirlemişsiniz. - Ara hedefler sıralarına hedef geçerli konumdan giden yolda en iyi duruma getirmek için başvurdu. + Hedefe giden rota üzerindeki ara hedeflerin optimize edilmiş sırası. GPX dosyası {0} konumuna kaydedildi - * Nokta belirlemek için basın.\n - * Önceki noktayı silmek için basılı tutun.\n - * Noktayı görüntülemek ve açıklama eklemek için basılı tutun.\n - * Daha fazla eylem için ölçüm aracına tıklayın. + * Bir noktayı işaretlemek için dokunun. +\n * Bir önceki noktayı silmek için haritaya uzun dokunun. +\n * Açıklama görüntülemek ve eklemek için bir noktaya uzun dokunun. +\n * Daha fazla eylem görmek için ölçüm widget\'ine dokunun. %1$d dosya kaldı İndirilecek %1$d dosya kaldı - Periyodik GPS cihazı uyanma aracılığıyla arka planda izleme ve navigasyon (kapalı ekranı) modunu etkinleştirmek için ayarları gösterir. + GPS cihazını periyodik olarak uyandırarak (ekran kapalıyken) arka plan izlemeyi ve gezinmeyi açmak için ayarları gösterir. Yol tarifleri Harita katmanları - GPS Durum uygulaması yüklenmedi, mağazada arayın? + GPS durum uygulaması yüklü değil. Mağazada ara\? En yakın POI İdari Engel @@ -722,15 +770,15 @@ Enlem Boylam Mevcut harita konumu yakınlarında ara - Yakınlaştırmalarda biraz daha vektör harita ayrıntısı göster (yollar gibi) - Seçilen dil için veri yüklü değil. Yüklemek için mağazaya gitmek ister misiniz? + Zaten daha düşük zoom seviyelerinde bazı vektör harita detaylarını (yollar vb.) gösterin. + Seçilen dili indirmek için mağazaya git\? Mevcut varış noktasını kullan Bildirim sesi - Ortam/müzik sesi - Uygulama %1$s harita katmanını indiremiyor, lütfen tekrar yüklemeyi deneyin. - Katman şeffaflığını değiştir + Medya/Navigasyon sesi + Uygulama %1$s harita katmanını indiremiyor, tekrar yüklemek yardımcı olabilir. + Üst katman şeffaflığını değiştirin. Katman şeffaflığı - İşlem için gerekli genel ağ (internet) bağlantısı mevcut değil + İnternet bağlantısı olmadan işlem yapılamıyor. Daha fazla yükle… Mil/fit mph @@ -740,31 +788,31 @@ Konum paylaş Arazi Ulaşım - G/Ç hatası + I/O hatası km km/h m Özel süzgeç Belirtilen klasörü bulamıyor. Veri depolama dizini - Önceki bir OsmAnd sürümü yüklü. Tüm çevrimdışı veri yeni uygulama tarafından desteklenecek. Fakat Favori noktalar eski uygulamada dışa aktarılıp, sonra yeni uygulamada içe aktarılmalıdır. - {0} yapımı başarıyla yüklendi ({1}). + Eski yüklü uygulamadaki tüm çevrimdışı veriler yenisi tarafından desteklenecektir, ancak Sık Kullanılan noktalar eski uygulamadan dışa aktarılmalı ve ardından yenisinde içe aktarılmalıdır. + {0} derlemesi başarıyla yüklendi ({1}). Yapı indiriliyor… OsmAnd yapı listesi alınırken başarısız olundu OsmAnd yapıları yükleniyor… Yüklemek için OsmAnd yapısı seçin - Sesli yönlendirme mevcut değil. Lütfen \'ayarlar\' --> \'Sesle yönlendirme\' ye gidin ve ses veri paketi seçin ya da indirin. + Sesli yönlendirme mevcut değil, lütfen \'Ayarlar\' → \'Navigasyon ayarları\' → \'Sesli yönlendirme\' seçeneğine gidin ve bir sesli uyarı paketi seçin veya indirin. Işık algılayıcısı - Gündüz/gece değişim kipi kuralını seçin + Gece ve gündüz modu arasında geçiş yapma mantığını seçin. {0} dosya indirilecek ({1} MB)? {0} öğe seçildi İndirilen - "Hızlı güzergah hesaplamayı etkinleştir ya da yakıt tasarrufu için devre dışı bırak. " + En hızlı rotayı hesaplamayı etkinleştirin veya yakıt tasarrufu rotası için devre dışı bırakın. Devamlı işleme - Seçilen alanın işlemesi yapılırken hata oluştu - Konum kullan … - İşleyici başarıyla yüklendi - Özel durum oluştu: işleyici yüklenmedi + Seçilen alan çizilemedi + Konumu kullan… + Oluşturucu yüklendi + Oluşturucu yüklenemedi İÇN websitesini göster İÇN telefonunu göster süzmek için yazın @@ -772,25 +820,25 @@ Ulaştırma sonuçları (hedef yok): Ulaşım sonuçları (hedefe {0}): Taşıma aramasını sıfırla - GPX dosyaları /tracks dizininde bulunamadı - GPX verisi okunamıyor + Tracks klasöründe GPX dosyası bulunamadı + GPX verileri okunamadı İÇN düzenle - Pusulaya - Hareket yönüne - Döndürülmesin (kuzey yukarıda) - Harita ekran hizalamasını seçin + Pusula yönü + Hareket yönü + Dönme yok (kuzey her zaman yukarı doğru) + Harita ekranı hizalamasını seçin. Güzergah ayrıntıları İçe Aktar - GPX yüklenirken hata oluştu - Bölgeler için SD kart üzerinde çevrim dışı veri bulunamadı. İnternetten bölgeleri indirin. - İÇN bulmak için sorgu girişi yapın + GPX yüklenemedi + Hafıza kartında herhangi bir indirilen harita bulunamadı. + POI bulmak için yazın Trafik bilgileri için Yandex\'e teşekkürler. - İÇN… - Arka planda konum düzeltmesi için azami bekleme süresini belirleyin + POI yerleşimi… + Her arka plan konumu düzeltmesi için izin verilen en yüksek bekleme süresini ayarlar. Düzeltme için azami bekleme GPS Konum sağlayıcı - Ekran kapalıyken konumu izlemek için OsmAnd\'ı arka planda çalıştırır + Ekran kapalıyken konumunuzu izler. Arka planda Osmand başlat Arka plan navigasyon hizmeti açık olması bir konum sağlayıcı gerektirir. Süzgeci gizle @@ -801,14 +849,16 @@ Ses verisinin desteklenmeyen sürümü Belirtilen ses verisi hatalı Seçilen ses verisi mevcut değil - SD kart ulaşılabilir değil.\nHaritaları göremez ve bir şeyler arayamazsınız. - SD kart sadece okunabilir.\nSadece önceden yüklenen haritaları görebilirsiniz ve genel ağdan (internetten) indiremezsiniz. + Hafıza kartı erişilebilir değil. +\nHaritaları göremez veya bir şeyler bulamazsınız. + Hafıza kartı salt okunur. +\nŞimdi sadece önceden yüklenmiş haritayı görmek mümkün, yeni alanları indirmek mümkün değil. Bölgeleri indir Yakınlarda ara Aygıt ile aynı Dikey Yatay - Dikey, yatay veya aygıt + Dikey, yatay veya aygıt. Yeni kural ekle Durak durak @@ -843,7 +893,7 @@ https://osmand.net adresinden bölge listesi alınamadı. Değiştir Güzergahı göster - Gezintiyi başlat + Yönlendirmeyi başlatın Lütfen ilk olarak varış noktası seçin Açılış saatleri Yetkilendirme başarısız @@ -857,7 +907,7 @@ Yeni güzergah hesaplandı, mesafe Yerel veri okunuyor… GPX dosyası kaydediliyor… - Dil belirleyin, veri indirin/tekrar yükleyin + Dili belirtin, verileri indirin/yeniden yükleyin. OSM düzenleme Uygulama ayarları Adres ara @@ -866,59 +916,59 @@ Şehir veya posta kodu seçin Ülke seç 3B Harita Görüntüsü - Harita üzerinde GPS koordinatlarını göster - Gezinti uygulaması + Haritada GPS koordinatlarını göster + Navigasyon uygulaması Listeden bölge seçin Yakın noktalar Alt OSM şifresi (isteğe bağlı) - {0} olayı başarıyla tamamlandı. + {0} eylemi tamamlandı. Temizle Süzgeç Seçilen süzgeç silinsin mi? {0} süzgeci silindi {0} süzgeci oluşturuldu Kamera odaklama tipi - Dahili kamera odaklama tipini seçin + Dahili kamera odak modunu seçin. Kendiliğinden odaklama Genişletilmiş alan derinliği (EDOF) Sonsuzlukta odaklansın Makro (yakın çekim) odak kipi Kamera devamlı odaklamaya çalışıyor Fotoğraf çekiminde ses çal - Fotoğrafları çekerken çalınacak sesi seçin - Küçük yakınlaştırmalarda tüm dünyayı kaplayan temel dünya haritası eksik. Tam deneyim için lütfen World_basemap_x.obf indirin. + Fotoğraf çekerken ses çalıp çalmayacağını seçin. + Düşük zoom seviyelerinde tüm dünyayı kapsayan bir genel bakış elde etmek için ana dünya haritasını indirin. %1$s\'a öğe yok - Seçtiğiniz dil yüklü olan Android TTS (yazıdan-sese) motoru tarafından desteklenmiyor. Mağazada başka TTS motoruna bakmak ister misiniz? Aksi halde önceden yüklenen TTS dili kullanılacak. + Seçilen dil, yüklü Android TTS (text-to-speech) motoru tarafından desteklenmemektedir. Mağazada başka bir TTS motoru arayın\? Aksi halde önceden ayarlanmış TTS dili kullanılacaktır. GPX yönünü tersine çevir Bu konum için çevrimdışı vektör haritası. \n\t\n\tKullanmak için \'Menü\' → \'Harita Katmanları\' → \'Harita Kaynağı…\' → \'Çevrimdışı vektör haritalar\'. Sesli yönlendirme çıktısı - Sesli yönlendirmenin oynatılacağı hoparlörü seç - Sesli çağrı sesi (araç BT setini engellemeyi de dener) - Temel harita saydamlığını değiştirin + Sesli yönlendirmenin oynatılacağı hoparlörü seçin. + Telefon görüşmesi sesi (araç BT stereolarını kesmek için) + Temel harita şeffaflığını değiştirin. Temel harita saydamlığı Hiçbiri Alt katman harita - Alt katman harita seç + Alt katman haritasını seçin. Üst katman harita… Üst katman harita - Üst katman harita seç - Vektör haritaların kullanımı için asgari yaklaştırma seviyesi - Asgari vektör yakınlaştırma seviyesi + Üst katman haritasını seçin. + Bu seviyenin ötesindeki her şey için raster haritaları kullanın. + Minimum vektör yakınlaştırma seviyesi Otoyolları tercih et Otoyolları tercih et Paralı yollardan sakın Paralı yollardan sakın Asfaltsız yollardan sakın - Asfaltsız yollardan kaçın + Asfaltsız yollardan kaçının. Feribotlardan sakın Feribotlardan sakın Otoyollardan sakın Otoyollardan sakın Ağırlık sınırı - Güzergahlara uygun olmak için araç ağırlığını belirt + Yollarda izin verilen araç ağırlık sınırını belirtin. Kopyalama Osmand veri dosyaları … - Çevrimdışı yol hesaplama Osmand + Çevrimdışı OsmAnd rota hesaplama Kamyon (%s) dosyası yeni hedefine kopyalanıyor… OsmAnd veri dosyaları yeni hedef (%s) \'e kopyalanıyor… @@ -927,10 +977,10 @@ TTS için konuşma hızını belirle. Hoparlör yerleşimi Hızlı rota hesaplama ( $1%s) başarısız oldu , hesaplama yavaş çare . - Araba navigasyonu için 2 fazlı yönlendirmesi devre dışı bırakın + Araba navigasyonu için iki fazlı yönlendirmeyi devre dışı bırakın. Karmaşık yönlendirmesi devre dışı bırakın Mark Deniz - + Uygulamada görünecek profilleri seçin. Uygulama Profilleri Harita oluşturma Yürüyüş @@ -953,10 +1003,10 @@ Dünya Haritası Zvmhay indirildi : %1$s Döşeme verisi : %1$s - Kaydedilen Çini kaynağı %1$s - maksimum Yakınlaştırma + Tilesource %1$s kaydedildi + Maksimum zoom Haritalar belirtilen dizinde oluşturulamadı - Dosyaları kopyalama başarısız oldu + Dosyaları taşıma başarısız oldu Dış depolama Çok kullanıcılı depolama Dahili uygulama belleği @@ -980,7 +1030,7 @@ Hoş Geldiniz Şu anki rota Silmek için işaretle - Geçmişi temizlemek istiyor musunuz? + Geçmişi temizle\? Kullanılabilir güncelleme yok Canlı güncelleştirmeler Varsayılan (13) @@ -1003,7 +1053,7 @@ Yarı saydam açık mavi Mor Yarı saydam mor - Değişikliklerin tam olarak uygulanabilmesi için uygulamanın elle yeniden başlatılması gereklidir. + Tüm değişiklikleri uygulamak için uygulamayı manuel olarak yeniden başlatın. Açık Koyu Piyemontece @@ -1012,15 +1062,15 @@ Lütfen bize bu uygulamada ne değişklikler olmasını istediğinizi söyleyin. Yükleme başarısız oldu Değişikliği sil - Başarıyla yüklendi {0}/{1} + {0}/{1} yüklendi Tekrar deneyin - Daha önce eski ve uyumsuz Wikipedia verisi indirmişsiniz. Bunları arşivlemek ister misiniz? - Ekstra Wikipedia verisi indirmek ister misiniz? (%1$s MB)? - Konum servisi devre dışı. Ektinleştirmek ister misiniz? + Eski uyumsuz Wikipedia verileriniz var. Arşivle\? + Ekstra Wikipedia verilerini indir (%1$s MB)\? + Konum servisi etkin değil. Aç\? Ayrıntıları göster Devre dışı Ev kapı numaraları - Çoğu ülkelerde (Almanya, Fransa, İtalya ve diğerleri) hız kamerası uyarılarının kullanımı yasaktır. OsmAnd yasaları çiğnemeniz durumunda sorumluluk kabul etmez. Eğer bu özellik sizin için uygunsa evet\'e tıklayın. + Çoğu ülkede (Almanya, Fransa, İtalya ve diğerleri) hız kamerası uyarılarının kullanımı yasal değildir. OsmAnd yasaları çiğnemeniz durumunda sorumluluk kabul etmez. Eğer bu özelliği kullanmak sizin için uygunsa \'Evet\'e tıklayın. Git Eylem oluştur Eylem düzenle @@ -1033,7 +1083,7 @@ Sık sorulan sorular, son değişiklikler ve diğerleri. Navigasyon ayarları Genel ayarlar - Kullanma + Kullanmayın Etkinleştir Devre dışı bırak Aktif @@ -1052,7 +1102,7 @@ Adres Konumum Yerlerim - Favorilerim + Sık Kullanılanlar Ses Vidyo Fotoğraf @@ -1073,7 +1123,7 @@ Standart Yaya geçidi Yaya geçitleri - Çevrim dışı haritalar indirmek istiyor musunuz? + Çevrimdışı haritaları indirin\? %1$s harita indirdiniz Yeni harita indir Yönet @@ -1099,7 +1149,7 @@ Her zaman sor OsmAnd\'a aktar Tüm metni oku (çevrim içi) - OSMC göre olan boyama + OSMC yürüyüş sembolüne göre renk %1$d notu silmek üzeresiniz. Emin misiniz? %1%d düzenlemeyi OSM\'ye yüklemek üzeresiniz. Emin misiniz? Deniz haritası görünümü @@ -1124,15 +1174,15 @@ Yol kalitesi göster Uzaklığa göre sırala İsme göre sırala - "Ortalama hız: %1$s " + Ortalama hız: %1$s Maksimum hız: %1$s Ortalama yükseklik: %1$s Pembe Kahverengi - Not yerleri ile GPX dosyası + Konumlu GPX dosyası. Lokasyonlar Eklentiler - Mekik treninden kaçın + Shuttle trenleri kullanmaktan kaçının Tehlike Kalın anahat Bengalce @@ -1153,36 +1203,37 @@ Osetçe Esperanto dili İspanyolca (Arjantin) - Norveççe (Bokmål) + Norveççe Bokmål Volapük Tayca Telugu dili - Norveç dili (Nynorsk) + Norveççe Nynorsk Malezyalı Haitice Galiçyaca Estonca Sabuan dili Tek başına günlüğe eklemeyi önle - Uygulama kapatılırsa (son uygulamalardan) GPX iz kaydına ara verilecektir. (OsmAnd Uyku modu simgesi Bildirim alanından kaybolur) + Uygulama kapatılırsa (son uygulamalardan) GPX iz kaydına ara verilecektir. (OsmAnd arka plan göstergesi Android bildirim çubuğundan kaybolur.) Mekik treninden kaçın Vikipedi OSM düzeltmesini sil - Rota kapsamına göre Boyama + Ağ bağlantısına göre renk Oturumu kapat - OsmAnd\'ın aynı zamanda veri dosyalarınıda yeni varış noktasına kopyalamasını ister misiniz? + OsmAnd veri dosyalarını yeni hedefe taşı\? Doğru trafik işaretleri ve düzenlemeleri yansıtmak için sürüş bölgenizi seçin: - OsmAnd küresel çevrim dışı harita tarama ve küresel çevrim dışı yolbul sunar! + OsmAnd, global çevrimdışı harita tarama ve çevrimdışı navigasyon sağlamaktadır. OSM değişiklikleri yerel değişiklik kümesine eklendi Rota planlama ekranındayken beklenecek süreyi belirtin. - Sonra adım-adım navigasyona başla… + Sonra adım-adım yönlendirmeyi başlat… süresi geçmiş Zaman sınırlı otopark Sonra ziyaret edin Önce ziyaret et Konumunuzu simüle et Düz liste - Enl %1$s\nBoyl %2$s + Enlem %1$s +\nBoylam %2$s Vazgeç seçili @@ -1195,7 +1246,9 @@ İz bölümü İz noktası Seyahat kaydetme - "Bu eklenti harita ekranında zımbırtıya elle donunca GPX iz oluşturma ve saklama özelliğini etkinleştirir, ya da GPX izini navigasyon boyunca otomatik olarak saklayabilir.\n\nKaydedilen izler arkadaşlarınızla veya OSM katkıcılarıyla paylaşılabilir. Atletler çalışmalarını izlemek için iz kaydedebilir. Basit iz analizi OsmAnd içinden yapılabilir, misal tur zamanı, ortalama hız vs., ve izler tabii ki daha sonra üçüncü parti araçlarla da analiz edilebilir. " + "Bu eklenti, harita ekranındaki GPX günlüğü widget\'ına manuel olarak dokunarak gezinme rotalarınızı kaydetme işlevini, ya da tüm navigasyon rotalarınızı bir GPX dosyasına otomatik olarak kaydetme özelliğini etkinleştirir. +\n +\nKaydedilen rotalar arkadaşlarınızla veya OSM\'ye katkıda bulunanlarla paylaşılabilir. Atletler antremanlarını izlemek kayıtlı rotaları kullanabilir. Tur zamanı, ortalama hız vs. gibi bazı basit rota analizi doğrudan OsmAnd içinde yapılabilir, ve tabii ki daha sonra özel üçüncü parti araçlarla da analiz edilebilir." Harita gezinti görünümü Nevar / Nepal Bhasa Yeni ekle @@ -1207,7 +1260,7 @@ Dakika / kilometre Mil/saat Lütfen doğru POI türünü belirtin veya bu aşamayı atlayın. - Menü düğmesi kontrol panelini başlatır, menüyü değil. + Menü düğmesi, menü yerine gösterge panelini başlatır Haritadan Erişim \'Kapalı\' doğrudan harita ekranını başlatır. Başlangıçta göster @@ -1225,10 +1278,10 @@ Yorum ekle Notu yeniden aç Notu kapat - Not başarıyla oluşturuldu - İstisnai durum oluştu: not oluşturulamadı - Not başarıyla kapatıldı - İstisnai durum oluştu: not kapatılmamıştı + Not oluşturuldu + Not oluşturulamadı + Not kapatıldı + Not kapatılamadı Yap GPX waypoint\'i silinsin mi? GPX waypoint\'i düzenle @@ -1242,22 +1295,22 @@ Yenilikler neler Önerilen nesneler Güncelle - Karşıya Yükle + Karşıya yükle Oluşturulmuş OSM POI\'si - Dünya temel haritası (küçük görüntü yakınlaştırmalarda tüm dünyayı kapsar) eksik veya eskidir. Dünya çapında genel görünüm için lütfen indirmeyi düşünün. - QR Kodu + Dünya temel haritası (düşük zoom seviyesinde tüm dünyayı kaplayan) eksik veya eskidir. Global genel görünüm için lütfen indirmeyi düşünün. + QR kodu İndirilen harita - %1$s haritası indirildi. Artık kullanmaya başlayabilirsiniz. - Haritayı görüntüle - İlk uygulama başlatma belirten bayrağı ayarlar değişmeden tüm diğer ayarlar tutar + %1$s haritası kullanıma hazır. + Haritayı göster + İlk uygulama başlangıcını gösteren bayrağını ayarlar, diğer tüm ayarlar değişmeden kalır. Uygulamayı İlk Ayarlarına Getir Konumu paylaş Gönder - Belirtilen kategori adı zaten var. Lütfen başka bir ad kullanınız. + Lütfen daha önce mevcut olmayan bir kategori adı kullanın. Kategori Adı Yeni kategori ekle Bölgeler - Öncelikle esnek pano veya statik menü üzerinden app kontrol etmek için yeni bir seçim var. Seçiminiz her zaman pano ayarlarında değiştirilebilir. + Uygulamayı öncelikle esnek kontrol paneli veya statik bir menü aracılığıyla kontrol etmek için bir seçenek sunulur. Seçiminiz gösterge paneli ayarlarından her zaman değiştirilebilir. Kullanım pano Kullanım menüsü Dashboard ve menü kontrolü @@ -1265,44 +1318,44 @@ Teknik makaleler Sürümler Görüşleriniz - Bize Ulaşın + İletişim Harita İşaretleri - Gerçekten POI türünü belirtmeden POI\' yi kaydetmek istiyor musunuz? + Türü olmadan POI\'yi gerçekten kaydetmek istiyor musunuz\? OSM değişikliği değiştirme Yeni Sürüm OsmAnd ile ilk adımları Özellikler - Osmand geliştirmek için bize yardım edin + OsmAnd\'ın geliştirilmesine yardımcı olun Diğer Eklentiler İlk kullanım - Haritalar nasıl indirilsin, temel ayarları belirle - Navigasyon Kurulum + Harita indirme, temel ayarları yapma. + Navigasyonu ayarla. Bir seyahat planlama SSS Sık Sorulan Sorular Harita görüntüleme - Harita arama + Haritada arama Haritaları ve diğer veri dosyalarını kaydetmek istediğiniz yeri seçin. Ülke adı girin - Eğer zaten standart (tam) harita var olsa bile, yollar sadece harita indirmek istediğinizden emin misiniz? + Standart (tam) haritanız olduğu için sadece-yol haritası gerekli değildir. Yine de indirin\? %1$.1f of %2$.1f MB %.1f MB Tüm güncelleyin (%1$s MB) - Satın Al - Seamarks eklentisi aktif ediniz - SRTM eklentisi aktif ediniz + Satın al + Lütfen \'Deniz haritası görünümü\' eklentisini etkinleştirin + Lütfen \'Eşyükselti çizgileri\' eklentisini etkinleştirin Daha Sonra Tam Sürüm Yüklemeler Kullanılan Ücretsiz indirme - Kullanılan ücretsiz indirmeleri görüntüler + Kalan ücretsiz indirme miktarını görüntüler. Yollar İndiriliyor -%1$d dosya Ücretsiz sürümü banner göster - Sürüm ödemiş olsa bile yine ücretsiz sürümü banner görebilirsiniz + Ücretli sürümde bile ücretsiz sürümün afişini göster. Yaptığınız değişiklikleri karşıya kez POI silinecektir - Göster GPX + GPX verilerini göster Hatlarının Sayısı Emin misiniz? Herhangi kaydedilmemiş değişiklikler kaybolur. Devam? @@ -1332,52 +1385,52 @@ İş Günleri Son Gidilen Yerler Sık Kullanılanlar - %1$s: Başarıyla kaydedilmiş + Şimdi kaydedildi: %1$s Yeniden Açmak POI Değişen Tüm diğer etiketler korunur İşlemek Hiperodak odak Kamera Resim Boyutu - İç kamera Resim Boyutu seçin + Dahili kamera resim boyutunu seçin. Geçersiz format:%s - Bu eklentiyi yüklemek için bir internet bağlantısına ihtiyacınız vardır. + Bu eklentiyi yüklemek için İnternete bağlı olmanız gerekir. Al Akıllı rota yeniden hesaplama Uzun seyahatler için rotanın yalnızca ilk bölümünü yeniden hesapla. OsmAnd\'ı Sevdinizmi? - Hakkımızdaki düşünceleriniz uygulamayı geliştirmek için önemlidir. + Fikrinizi önemsiyoruz ve görüşleriniz bizim için önemlidir. Bu Uygulamayı Oyla "Osmand\'a Google Play\'de puan verin" Pano Yapılandırma Kart gizlidir - UNDO + Geri al Atla OsmAnd Çevrim Dışı Haritalar\n& Yolbul - Yerli ve İngilizce isimleri arasında seçin + Yerel ve İngilizce isimler arasında seçim yapın. Ekran görüntüleme yönü - POI\'leri harita üzerinde göster (kullanımının son seçilen filtre) - Online veya önbelleğe alınmış harita fayans kaynağını seç + Haritada en son seçilen POI üst katmanını göster. + Çevrimiçi veya önbelleğe alınmış harita döşemelerinin kaynağını seçin. Çini harita kaynağı - Eksik harita fayans indirmek için interneti kullanın + Eksik harita döşemelerini indirin Arama sokak aşamalı Arama binası aşamalı Sokağa kesişen seç DDD.DD DDD MM.MM DDD MM SS.SS - En sevdiğiniz adını girin - En sevdiğim nokta \'\' {0} \'başarıyla eklendi. + Sık Kullanılan adı girin + Sık kullanılan nokta \'\'{0}\'\' eklendi. Sık kullanılanlara ekle - Düzenleme favori - Favori nokta \'%s\' Sil ? - En sevdiğim nokta {0} başarıyla silindi. + Sık Kullanılanı düzenle + Sık Kullanılan \'%s\' noktasını sil\? + Sık Kullanılan {0} noktası silindi. Düğüm bulunamadı ya da başlıca tek bir düğüm değil, olabilir - Sil {0} (Yorumunuzu Girin)? + {0} sil (yorum)\? Sil - Eylem {0} yaparken beklenmeyen bir hata oluştu. - I / O hatası eylemi yaparken oluştu {0}. + {0} eylemi gerçekleştirilemedi. + {0} eylemi gerçekleştirilirken I/O hatası. Düğüm hakkında bilgi yüklü değildi İnternetten yerel bilgilerinizi güncelleyin\? Kesişim: {0} x {1} {2} içinde @@ -1386,51 +1439,53 @@ Max. Online zoom Çevrim içi harita döşemelerinin bundan sonraki yakınlaştırma düzeylerine göz atmayın. En sevdiğim nokta düzenlendi - Hiçbir favori noktalar var - Changeset Açılış … - Changeset Kapanış … - Düğüm işlemek … - Yerli / İngilizce adları dönüştürülüyor … + Sık Kullanılanlara eklenen nokta bulunmuyor + Değişiklik listesi açılıyor… + Değişiklik listesi kapatılıyor… + Düğüm işleniyor … + Yerel/İngilizce isimler dönüştürülüyor… Son Osmand çalıştırmak çöktü. Log dosya {0} olduğunu. Sorunu bildirmek ve günlük dosyasını ekleyiniz. - OSM gönderimler için gerekli Openstreetmap.org (OSM) ayarlarını belirtin + OSM gönderimleri için gereken OpenStreetMap.org (OSM) ayarlarını belirtin. Sayfaya kiremit - Hours formatını Açılış düzenleme için desteklenmiyor + Açılış saatleri formatı değiştirilemez Kurtulmak için durdurmak seçin Önceki mesafe Sonraki mesafe geçmek için durur Yakınlaştırma, İÇN\'leri güncellemenizi sağlar Güncelleme POI - Favoriler başarıyla içe aktarıldı - Veri GPX dosyası olarak kaydetmek veya yol işaretleri için sık kullanılanları almak? - Sık Kullanılanlar içeren GPX dosyası {0} bulunamadı + Sık Kullanılanlar içe aktarıldı + Verileri GPX dosyası olarak kaydedin ya da ara noktaları \'Sık Kullanılanlar\'a aktarın\? + {0} konumunda Sık Kullanılanlar içeren GPX dosyası bulunamadı Sık Osmand üzerinden paylaşılan (Çevrimiçi) OSM Notları - Haritayı hareket ettirmek için parmağınızı kaydırın kullanın + Haritayı hareket ettirmek için bir hareket topu aygıtı kullanın. Kullanım topunu - Arka plan hizmeti tarafından kullanılan Set uyandırma aralık - Arka plan hizmeti tarafından kullanılan konum sağlayıcı seçin - + Arka plan servisi tarafından kullanılan uyanma aralığını ayarlayın. + Arka plan servisi tarafından kullanılan konum yöntemini seçin. + Baş Ekran yönlendirme Hiçbir adres belirlenmedi Sesli uyarılar - GPX parça … + GPX dosyaları… Durakta Arama taşımacılığı Harita yönlendirme Endeksin versiyonu \'\' {0} \'desteklenmiyor - Osmand çevrimdışı gezinme deneysel bir özelliktir ve daha yaklaşık 20 km\'lik mesafelerde çalışmıyor.\n\nNavigasyon hizmeti geçici olarak çevrimiçi CloudMade geçer. - Eğer Osmand yüklemek istiyor musunuz - {0} {1} {2} MB? + OsmAnd çevrimdışı navigasyon deneysel bir özelliktir ve yaklaşık 20 km\'den daha uzun mesafelerde çalışmaz. +\n +\nNavigasyon geçici olarak çevrimiçi CloudMade servisine geçti. + OsmAnd Yükle - {1} {2} üzerinden {0} MB \? Yakınlaştırma {0} indirmek {1} fayans ({2} MB) Preload maksimum zoom seçin - Bir defada yerine görüntünün sürekli render görüntüler + Bir kerede görüntü yerine sürekli görüntü oluşturmayı göster. vektör render - Görünüm render seç - Yüksek yoğunluklu ekranlarda harita fayans streç (ve bulanıklık) etmeyin + Render görünümünü seçin. + Yüksek yoğunluklu ekranlarda harita karolarını uzatmayın (ve bulanıklaştırmayın). Dizin Oluşturma adresi … Dizin Oluşturma haritası … Dizin Oluşturma POI … Dizin Oluşturma taşımacılığı … - \'{0}\' desteklenmiyor onaylanmamaktadır harita veri formatı \' + Artık kullanılmayan harita veri formatı \'\'{0}\'\', desteklenmiyor Çevrimiçi Name Finder Önbelleğe fayans okunuyor … Index \'\' {0} \'belleğe sığmadı @@ -1438,30 +1493,30 @@ yd ft mi - Konumu web tarayıcısı bağlantı %1$s ya da android niyet bağlantı %2$s izleyin görmek için - GPX Mevki \'\' {0} \'başarıyla eklendi + Konumu görmek için %1$s web linkini ya da %2$s Android niyet linkini takip edin + GPX Yol-işareti \'\'{0}\'\' eklendi Kaydedilen GPX parçaya yol noktasını ekle GPX yol noktası ekle Geocache Boş Tüm yol-izi boyunca geç - Underlay haritası … - Seç (kiremit) yüklemek veya güncellemek haritalar - <u> Online OSM </ u> görüntüleri ile harita sınıflandırmaOnline OSM map classification with images - Coğrafi niyet ayrıştırılamadı \'%s\' - Ölçü birimi + Alt katman harita… + Yüklenecek veya güncellenecek (karo) haritaları seçin. + Resimlerle Çevrimiçi OSM harita sınıflandırması. + Coğrafi niyet ayrıştırılamadı \'%s\'. + Uzunluk birimleri Yalnızca elle ayarlama (oka basın) - Yolbul yönergelerini düzenli aralıklarla yeniden bildir + Navigasyon talimatlarını düzenli aralıklarla yeniden duyurun. Navigasyon yönergelerini tekrarla özellikle online olarak Diğerleri - Önceden yüklenmiş (\'çevrim dışı\') veri SD kart üzerinde değil. Haritaları internet olmadan çevrim dışı kullanabilmek için lütfen önceden indirmeyi düşünün. + Haritaları çevrimdışı kullanmak için (\'çevrimdışı\') verilerini indirin. Çıkış Siz %1$s %2$s kalem (ler) üzeresiniz. Devam? Avrupa - Hollanda Rotayı GPX dosyası olarak paylaşın Rotayı Osmand üzerinden paylaşın - Daha fazla ayrıntı, basın görmek ve devre dışı bırakmak veya silmek için basılı tutun Varolan herhangi bir öğeyi tıklatın. Aygıtın (%1$s ücretsiz) Cari veriler: + Daha fazla ayrıntı görmek için mevcut ögelere dokunun, devre dışı bırakmak ya da silmek için uzun dokunun. Cihazdaki güncel veriler (%1$s boş): Erken Normal Geç @@ -1469,26 +1524,26 @@ Varış bildirisi Varış bildirimini ne yakınlıkta istiyorsun? Alp yürüyüş ölçeği (SAC) - + SAC ölçeğine göre yolları oluşturun. Sembol bindirme Yürüyüş - + OSMC izlerine göre yolları oluşturun. GPX - Sesli uyarılar süresince her müziği tümüyle duraklatır (yalnızca sesini azaltmakla kalmaz) + Sesli uyarılar, yalnızca bastırmak yerine müzik çalmayı duraklatır. Müziği duraklat Wikipedia - Görüntülenen yol-izini navigasyon için kullanmak istiyor musunuz? - Son varış noktası olarak ekle + Navigasyon için gösterilen rotayı kullan\? + Sonraki hedef olarak ekle GPX Seçiniz … Varış Noktası seç Güzergah tercihleri - Güzergah bilgileri + Güzergah bilgisi Merdivenlerden sakın - Merdivenlerden kaçın - Sınır geçişinden sakın - Başka bir ülkeye sınır geçisinden kaçın. + Merdivenlerden kaçının + Sınır geçişlerinden kaçının + Ulusal sınırları geçmekten kaçının Yükseklik sınırı - Güzergahlara uygun olmak için araç yüksekliğini belirt - En az yakınlaştırma + Yollarda izin verilecek araç yüksekliğini belirtin. + Minimum zoom Varış yeri OSM değişikliği olarak yedekle Bulgaristan @@ -1512,14 +1567,14 @@ Letonya Litvanya Marathi - Norveççe + Norveççe Bokmål Farsça Polonya Portekizce Romen Rusça Sardunyalı - Sırpça + Sırpça (kiril) Basitleştirilmiş Çince Slovakça Sloven @@ -1533,7 +1588,7 @@ Kuzey Amerika - Kanada Avrupa - İtalya Avrupa - İngiltere - İnternet olmadan OsmAnd rota bölümünü hesaplayın + OsmAnd rota segmentinin çevrimdışı hesaplanması Rotanın ilk ve son bölümleri için OsmAnd rotası hesapla Ödemeler Bitcoin Dünya Dünya genel bakış haritası @@ -1557,7 +1612,7 @@ Dünya rakım düzeltme Dünya deniz işaretleri Varış noktaları seçin - + POI yardımcı etiketleri %1$s yükleniyor … Şimdiki zaman Mevki @@ -1565,11 +1620,11 @@ \n \nGörmek için harita üzerinde basılı tutun" Otomatik dönüş rehberlik dönüş başlayın - "Subtracks:%1$s " - "Yol işaretleri:%1$s " - "Mesafe:%1$s (%2$s puan) " - "Başlangıç saati:%1$tF,%1$tT " - "Bitiş saati:%1$tF,%1$tT " + Alt-rotalar: %1$s + Yol işaretleri: %1$s + Mesafe: %1$s (%2$s puan) + Başlangıç zamanı: %1$tF, %1$tT + Bitiş zamanı: %1$tF, %1$tT Rakım aralığı:%1$s İniş / çıkış:%1$s Zaman aralığı:%1$s @@ -1580,35 +1635,37 @@ %1$s\nRota%2$s işaret %1$s\nPoints %1$s\nParça%2$s - GPX boş parça + Boş GPX dosyası Ekran rengi Günler Bağlamak At yolları - Dosyalar bulunamadı, internet bağlantınızı kontrol ediniz. - Hiçbir GPX dosyaları seçilmedi. Amacıyla seçmek için ve mevcut yolda tutun. + İndirme bulunamadı, lütfen İnternet bağlantınızı kontrol edin. + GPX dosyası seçilmedi. Uzun dokunarak birini seçin. Göstermek için seçin Bölünmüş aralık Navigasyon sırasında görüntü yakınlaştırma düğmelerini göster. Yakınlaştırma düğmeleri göster - Sık grup olarak kaydet - Android sürümü 4.4 (KitKat) beri indirebilir ve önceki depolama klasörüne (%s) haritalar güncelleme olamaz. Eğer izin verilen depolama konumuna değiştirmek ve orada tüm Osmand dosyaları kopyalamak istiyor musunuz?\n  Not 1: Eski dosyaları bakir kalır (ancak elle silinebilir).\n  Not 2: yeni depolama konumu o Osmand ve Osmand + arasında dosya paylaşmak mümkün olmayacaktır. + Sık Kullanılanlar grubu olarak kaydet + Android versiyon 4.4\'ten (KitKat) itibaren haritaları eski depolama klasörüne (%s) indirip güncelleyemezsiniz. Tüm OsmAnd dosyalarını yeni depolama konumuna kopyala\? +\n Not 1: Eski dosyalarınız dokunulmadan kalacaktır (fakat manuel olarak silinebilir). +\n Not 2: Yeni depolama konumunda OsmAnd ve OsmAnd + arasında dosya paylaşımı mümkün olmayacaktır. Yer: Bölge çapında haritalar Dünya Haritaları - + Hillshade katmanı devre dışı Kontur hatları devre dışı nmi Kilometre/saat Dakika / mil Deniz mili/saat (knot) - deniz mili/saat + kn dk/m dk/km m/s Seyahat kayıt Navigasyon - Arka planda çalışan + Arka planda çalıştır GPS uyanma aralığı Sık Kullanılan bilgisi Konumunuzu simüle etmeyi durdurun. @@ -1617,10 +1674,26 @@ GPX renk GPX genişliği Wikipedia - "Bu görünüm etkinleştirilmesi \'Touring görünümü\' için Osmand haritasında tarzını değiştirir, bu seyahat ve profesyonel sürücüler için özel yüksek detay görünümüdür.\n\nBu görüş, herhangi bir harita zoom sağlar, harita verilerinin mevcut seyahat ayrıntıları maksimum miktarı (özellikle yollar, parça, yolları ve yönlendirme işaretleri).\n\nAynı zamanda açıkça net bir şekilde yararlıdır, örneğin bir renk kodlama ile yolların her türlü tasvir Büyük araçlar sürüş.\n\nVe bu bisiklet yolları veya Alp dağ yolları gösteren gibi özel turne seçenekleri sağlar.\n\nÖzel bir harita indir görünümü standart haritalar oluşturulur, gerekli değildir.\n\nBu görünüm, ya tekrar buraya de aktive ya da istediğiniz gibi \'Yapılandırma haritası\' başlığı altında \'Harita stilini\' değiştirilerek tarafından geri alınabilir. " - "Bu eklenti aynı zamanda kürek, yelken, su sporları ve diğer türleri için deniz haritalar üretmek için Osmand haritası ve navigasyon uygulaması zenginleştirir.\n\nÖzel bir harita add-on Osmand için yurtiçinde hem de yakın kıyı navigasyon için navigasyon işaretleri ve grafik sembolleri, tüm denizcilik sağlayacaktır. Her navigasyon işareti açıklaması onları ve anlamlarını (vb kategori, şekil, renk, dizi, referans) tanımlamak için gerekli ayrıntıları sağlar.\n\nOsmand konvansiyonel harita stilleri birine geri dönmek için, basitçe tekrar ya da bu eklenti de-etkinleştirmek veya istediğiniz gibi \'Yapılandırma haritası\' başlığı altında \'Harita stilini\' değiştirin. " - "Osmand Bu eklenti, küresel yokuş aşağı kayak pistleri, kros kayak pistleri, Alp kayak yolları, teleferik ve telesiyej sizin parmaklarınızın ayrıntıları koyar. Rotalar ve pistler renk kodlu zorluk tarafından gösterilen ve kar renkli kış manzara özümlediği özel \'Kış\' harita tarzında tasvir edilmektedir.\n\nBu görünüm etkinleştirilmesi kış koşullarında tüm peyzaj özellikler gösteren, \'Kış ve kayak\' harita stilini değiştirir. Bu görünüm, ya tekrar buraya de aktive ya da istediğiniz gibi \'Yapılandırma haritası\' başlığı altında \'Harita stilini\' değiştirilerek tarafından geri alınabilir. " - Bu eklenti bir gezi planı ve nokta arasındaki mesafeyi ölçmek için, mevcut GPX dosyalarını harita üzerinde dokunarak yolları oluşturmak veya kullanmak veya değiştirmek için izin veren bir harita ekranı widget\'ı sağlar. Sonuçlar daha sonra rehberlik için kullanılabilecek bir GPX dosyası olarak kaydedilebilir. + Bu görünümü etkinleştirmek \'Gezi görünümü\' için Osmand\'ın harita tarzını değiştirir, bu gezginler ve profesyonel sürücüler için özel yüksek detay görünümüdür. +\n +\nBu görünüm, herhangi bir harita zoomunda, harita verilerinde mevcut maksimum miktarda seyahat ayrıntılarını gösterir (özellikle yollar, izler, patikalar ve yönlendirme işaretleri). +\n +\nAyrıca her türlü yolu açıkça, renk kodlarıyla net bir şekilde gösterir; örn. büyük araçlar kullanırken faydalıdır. +\n +\nVe bisiklet yolları veya Alp dağ yollarını gösterme gibi özel gezi seçenekleri sağlar. +\n +\nÖzel bir harita indirme işlemi gerekli değildir, görünüm standart haritalarımızdan oluşturulmuştur. +\n +\nBu görünüm, burada tekrar devre dışı bırakılarak ya da \'Harita yapılandır\' altındaki \'Harita stilini\' istediğiniz gibi değiştirerek geri döndürülebilir. + Bu eklenti, bot, yelken ve diğer su sporları türleri için deniz haritaları üretmesi için OsmAnd harita ve navigasyon uygulamasını zenginleştirir. +\n +\nOsmAnd için özel bir harita eklentisi, tüm deniz navigasyon işaretlerini ve harita sembollerini, hem kıyıdan uzak hem de yakın navigasyon için sağlayacaktır. Her gezinme işaretinin açıklaması, onları tanımlamak için gereken ayrıntıları ve anlamlarını (kategori, şekil, renk, sıra, referans vb.) sağlar. +\n +\nOsmAnd\'ın geleneksel harita stillerinden birine geri dönmek için, bu eklentiyi tekrar devre dışı bırakın ya da \'Haritayı yapılandırın\' altında \'Harita stilini\' istediğiniz gibi değiştirin. + OsmAnd için bu eklenti, global yokuş aşağı kayak pistlerinin, kros kayağı pistlerinin, Alp kayak pistlerinin, teleferiklerin ve telesiyejlerin ayrıntılarını parmaklarınızın ucuna getirir. Yollar ve pistler, zorluk derecesine göre renk kodlu olarak gösterilir ve kar renginde bir kış manzarasına benzeyen özel bir \'Kış\' harita tarzında gösterilir. +\n +\nBu görünümü etkinleştirmek, kış koşullarında tüm peyzaj özelliklerini gösteren harita stilini \'Kış ve kayak\' olarak değiştirir. Bu görünüm, burada tekrar devre dışı bırakılarak veya \'Harita yapılandır\' altındaki \'Harita stilini\' istediğiniz gibi değiştirerek geri döndürülebilir. + Bu eklenti, bir gezi planlamak ve noktalar arasındaki mesafeyi ölçmek için haritaya dokunarak veya mevcut GPX dosyalarını kullanarak veya değiştirerek yolların oluşturulmasına izin veren bir harita ekranı widget\'ı sunar. Sonuçlar daha sonra rehberlik amacıyla kullanılabilecek bir GPX dosyası olarak kaydedilebilir. Yeniden adlandırma başarısız oldu. Yer: \nEnl %1$s @@ -1631,31 +1704,31 @@ Kayak haritalarını görüntülemek için, özel çevrim dışı harita indirimek gerekiyor Deniz haritalarını görüntülemek için, özel çevrim dışı harita indirmek gerekiyor Etiketi Kaldır - Yenilemesini indir + Gecelik derlemeleri indir. kurar Sokak Aydınlatma Vekil sunucu - Vekil sunucu internet iletişimi kurun + Bir proxy sunucusu belirtin. Gizlilik Yol-izi boyunca navigasyon başlat? - Kaçınılacak yolları seçerek bir başka güzergah başlatabilirsin + Kaçınılması gereken yolları seçerek alternatif bir rota tetikleyin Yaya geçitleri Yol tarzı Alman yol atlası Yüksek kontrastlı yolları Demiryolu geçidi - Demiryolu geçitleri göster + Demiryolu geçitleri Amerikan yol atlası Hiçbir v1.9 yönlendirme kuralları - V1.9 tanıtılan yönlendirme kuralları kullanmayın + V1.9\'da tanıtılan yönlendirme kuralları kullanmayın. Ulaşım durakları Bölge Kuzeye doğru katedilen mesafe doğuya doğru yönelme - İndirme mümkün değil, internet bağlantınızı kontrol ediniz. + İndirilemedi, lütfen İnternet bağlantınızı kontrol edin. Kullanım OpenGL render - Donanım hızlandırmalı OpenGL render (bazı cihazlarda çalışmayabilir) kullanın. - Bulunamadı baypas + Donanım hızlandırmalı OpenGL renderleme kullanın (daha fazla pil kullanabilir, ya da çok eski cihazlarda çalışmayabilir). + Bypass bulunamadı Arama Otobüs, troleybüs, mekik yolları Tramvay ve tren yolları @@ -1674,44 +1747,44 @@ Taşıma Diğer harita özellikleri Kalan unsurlar - Yakınında - Bir anonim kullanıcı şunları yapamaz: -\n- Grupları oluşturmak; -\n- Grupları ve aygıtları sunucu ile senkronize etmek; -\n- Web sitesindeki kişisel dashboard\'da grupları ve aygıtları yönetmek. + İçinde + Bir anonim kullanıcı şunları yapamaz: +\n- Grup oluşturmak; +\n- Grupları ve aygıtları sunucu ile senkronize etmek; +\n- Web sitesindeki kişisel kontrol panelinde grupları ve aygıtları yönetmek. Anonim Kullanıcı %1$s olarak giriş Üzerine çıktığınızda sesli uyarı alacağınız hız sınırı payı seçin. - Favori noktası adı bir dosyaya ifadeleri ile dize tasarrufu düzgün kolaylaştırmak için %1$s için modifiye edilmiştir. + Sık Kullanılan adı, emoticon içeren metnin dosyaya doğru olarak kaydedilmesini kolaylaştırmak için %1$s olarak değiştirildi. Yazdırma yolu Favori noktası adı yinelenen - Belirtilen favori isim zaten kullanımda , tekrarından kaçınmak için %1$s değiştirildi. + Belirtilen Sık Kullanılan adı zaten kullanımda, tekrarından kaçınmak için %1$s değiştirildi. Sınır kontrolü Gişe Trafik-hızı-yavaşlatıcı-düzenek GPS arka plan modunu durdur? Dur - (Haritada GPX günlüğü widget üzerinden etkin) kayıt genel pist için oturum aralığını seçin + (Haritadaki GPX kayıt widget\'ı aracılığıyla etkinleştirilen) genel rota kaydı için kayıt aralığını seçin. Genel kayıt tutma aralığı GPS Uyandırma aralık GPS arka plan modunu etkinleştirin GPX dosyası parça Log İsteğe bağlı olarak günlük takip - GPX dosyası günlüğü Genel pozisyon veya harita ekranında GPX günlük Widget kullanarak kapalı olabilir - Şimdi SD geçerli parçayı kaydet - Geçerli GPX parçayı kaydet - Navigasyon sırasında GPX dosyası parça Log - Parçalar navigasyon sırasında parça klasörüne kaydedilecektir + GPX dosyasına genel pozisyon kaydı, harita ekranındaki GPX kayıt widget\'ı kullanılarak açılabilir veya kapatılabilir. + Geçerli rotayı şimdi GPX dosyası olarak kaydedin. + Mevcut rotayı kaydet + Navigasyon sırasında rotayı otomatik kaydet + Navigasyon sırasında GPX rotası otomatik olarak rotalar klasörüne kaydedilir. Günlük aralığı Navigasyon sırasında aralığı Günlüğü - Navigasyon sırasında iz kaydı için oturum aralığını seçin + Navigasyon sırasında rota kaydı için kayıt aralığını seçin. Navigasyon için sesli yönlendirme seç. - HTTP vekil sunucuyu etkinleştir - Tüm ağ istekleri için HTTP vekil sunucusu yapılandır + HTTP proxy\'sini etkinleştir + Tüm ağ istekleri için bir HTTP proxy\'si yapılandırın. Vekil sunucu ana bilgisayarı - Vekil sunucunuzun ana bilgisayar adını yapılandırın (ör 127.0.0.1) + Proxy\'nizin ana bilgisayar adını yapılandırın (ör. 127.0.0.1). Vekil sunucu bağlantı noktası - Vekil sunucunuzun bağlantı noktasını yapılandırın (ör 8118) + Proxy\'nizin port numarasını yapılandırın (ör. 8118). h Turlar Tüm @@ -1720,7 +1793,7 @@ Haritaya göz at Binalar türüne göre renk kodu Devam et - Harita üzerindeki etiketler için tercih edilen dil (eğer mevcut değilse İngilizce veya yerel adlara geçilecektir) + Haritadaki etiketler için tercih edilen dil (mevcut değilse, İngilizce ya da yerel adlar kullanılacaktır). Tercih edilen harita dili Svahili dili İbranice @@ -1733,19 +1806,19 @@ Dur GPX günlüğü Yeni bir segment başlat Araç olmayan otoyollar - Ahşap ve scrubs gizle + Ahşap ve scrubs Binalar üzerinde yakınlaştırma 15 Erişim kısıtlamaları Geçiş hakkındaki kısıtlamaları ve geçiş ücretlerini göster Yol yüzeyi göster Döngüsü yolları göster Bütün Güncellemler - Sadece WiFi üzerinden İndir + Sadece Wi-Fi üzerinden indir Canlı güncelleştirme Mesafe: Zaman: Şimdi güncelle - App SD kartı kullanma iznine sahip değil + OsmAnd hafıza kartını kullanma iznine sahip değil Sesli yönlendirme seç Diliniz için sesli yönlendirme seçin veya indirin. Navigasyon esnasında kaçınmak istediğiniz yolları seçiniz. @@ -1758,8 +1831,8 @@ Son güncelleme: %s Güncelleme zamanı Seçilmedi - - + Kaydedici Bölmesi + Kaydedici Bölmesini Kullan Kullanılan alan depolama alanı boyutunu aştığında klipleri yeniden yaz. klip uzunluğu Kaydedilen klipler için üst süre limiti. @@ -1775,11 +1848,11 @@ Ayı ve ülke seçin Öğe kaldırıldı öğeler silindi - TÜMÜNÜ GERİ AL - + Tümünü geri al + Tür Başlangıç noktası Kaldır - İndirilen güncelleştirmeleri kaldırabilir ve özgün harita sürümüne geri dönebilirsiniz + İndirilen güncelleştirmeleri kaldırın ve orjinal harita sürümüne geri dönün Zaman aralığı ekle Yol kapalı Seç @@ -1796,29 +1869,29 @@ Devamını oku Çokgenleri göster Park yeri bul - MTB rotaları göster + MTB yollarını göster İlk harita işaretleyicisi İkinci harita işaretleyicisi Araç çubuğu Widget\'lar - İşaretlerini eşlemek için tüm noktaları eklemek istiyor musunuz? + Tüm noktaları harita işaretleyicisi olarak ekle\? Harita belirteçleri ekle Harita işaretleyicilerini seçin Ters sıralama Harita işaretleyici özelliğini etkinleştir. - Tüm etkin işaretleri silmek istiyor musunuz? - İşaretleyici geçmişini temizlemek istiyor musunuz? + Tüm aktif işaretleri kaldır\? + İşaretleyici geçmişini temizle\? Etkin işaretleyiciler Harita işaretleyicileri Harita işaretleyici - Bu çokgenler işleme kapalı açmak için tavsiye edilir. + Poligon görüntülemeyi kapatmanız önerilir. Bağışlar Alıcıların sayısı %1$s , rütbe %2$s , toplam düzenlemeleri %3$s düzenler OSM editörleri sıralaması OsmAnd Live aboneliği - Abone Ol - Katkılar hakkında size bilgi verilmesine gerek duyuldu. + Abone ol + Yapılan katkılar hakkında size bilgi vermek için gerekli. Herkese Açık Ad Adımı raporlarda gösterme Destek bölgesi @@ -1826,41 +1899,42 @@ Aylık ödeme Aktif Etkin olmayan - Geçerli e-posta adresi giriniz - Lütfen herkese açık ad girin - Canlı güncellemeler için abone için teşekkür ederiz! - Bağışınızın bir bölümü, bu bölgede değişiklik yapan OSM kullanıcılarına gönderilecek + Lütfen geçerli bir e-posta adresi girin + Lütfen herkese açık isim girin + OsmAnd\'ı desteklediğiniz için teşekkür ederiz! +\nTüm yeni özellikleri etkinleştirmek için OsmAnd\'ı yeniden başlatmanız gerekmektedir. + Bağışınızın bir kısmı, o bölgede değişiklikler yapan OSM kullanıcılarına gönderilecektir. Abonelik ayarları - Lütfen ilk olarak OSM canlı abonelik satın alın - Bu abonelik, dünya çapındaki tüm haritalar için saatlik güncellemeleri etkinleştirir. Gelirin bir bölümü OSM topluluğuna gitmektedir ve her OSM katkısı için ödenmektedir. Eğer OsmAnd\'ı ve OSM\'yi seviyor ve onları desteklemek istiyorsanız, bu bunu yapmak için en iyi yoldur. - Harita işaretleyicisini seçin + Lütfen önce OsmAnd Live aboneliği satın alın + Bu abonelik, dünya çapındaki tüm haritalar için saatlik güncellemeleri etkinleştirir. Gelirin bir bölümü OSM topluluğuna gitmektedir ve her OSM katkısı için ödenmektedir. Eğer OsmAnd\'ı ve OSM\'yi seviyor ve onları desteklemek ve onlar tarafından desteklenmek istiyorsanız, bu bunu yapmak için en iyi yoldur. + Harita işaretçisi seç Diğer işaretleyiciler Anonim olarak yükle Şeffaflık seekbar göster Yeterli alan yok! İhtiyaç duyulan depolama alanı {3} MB geçici olarak ve {1} MB kalıcı olarak gereklidir. Şu anda kullanılabilir alan olarak yalnızca (2 MB) mevcuttur. - {0} dosya(ları) indirilsin? Kullanılan depolama alanı geçici olarak {3} MB ve kalıcı olarak {1} MB. (Kullanılabilir alan {2} MB. \'dir.) - OpenStreetMap.org kullanıyorsanız OSM notunuzu anonim olarak profilinize yükleyebilirsiniz. + {0} dosya indirilsin mi\? Kullanılan depolama alanı geçici olarak {3} MB, kalıcı olarak {1} MB. ({2} MB alan mevcut.) + OSM Notunuzu anonim olarak ya da OpenStreetMap.org profilinizi kullanarak yükleyin. OSM Not yükle - Yukarı Taşı - Aşağı taşı + Taşı ↑ + Taşı ↓ Gezintiyi bitir Yoldan sakın - Seçili veri depolama klasörü salt okunur. Depolama klasörü geçici olarak dahili hafızaya geçirildi. Lütfen geçerli depolama dizini seçin. + Seçilen veri saklama klasörü salt okunur olduğu için dahili hafızaya geçildi. Lütfen yazılabilir bir depolama dizini seçin. Paylaşılan bellek Üst menü Rota yeniden hesapla Rapor - Varış noktası ayarlanmadı + Hedef ayarlanmadı Rota terkedildiğinde yeniden hesaplanmasın - Rotanızı takip etmeyi bıraktıktan sonra rota yeniden-hesaplama önlensin. + Rotadan çıkıldıktan sonra rota yeniden hesaplanmaz. Aksi yönde iken rota yeniden-hesaplanmasın - Aksi yönde ilerlerken otomatik rota yeniden-hesaplama önlensin. + Sadece ters yönde hareket ederken rota yeniden hesaplanmaz. Varsayılan renk Kategori seç Ad gir Kategori gir Tanım girin. - Harita konuma linklidir + Harita konuma bağlı Boş liste Ağaç görünümü Yüklü değil @@ -1871,9 +1945,9 @@ İnce Orta Kalın - Şimdi uygulamaya harici kayıt yerine yazma izni verildi. Elle uygulamanın baştan başlatılması gereklidir. + Uygulamanın şimdi harici depolamaya yazma izni var, ancak bunu yapmak için yeniden başlatılması gerekir. Tam rapor - OpenStreetMap oturum açma ve parola + OpenStreetMap kullanıcı adı ve parolası Dosya adı uygunsuz karakter içeriyor 7/24 açık Bellek kartı @@ -1883,24 +1957,24 @@ Tren Şimdiki yol Pil düzeyi - İşaretleyicinin konumunu değiştir + İşaretleyici konumunu değiştir Bizi takip edin Nispi yön - İnternet bağlantısı olmadan yönerge al ve yeni yerler keşfet + İnternet bağlantısı olmadan yol tarifleri alın ve yeni yerler keşfedin Başlat Konum aranıyor… OsmAnd\'ın konumunuzu bulmasına ve o bölge için harita indirmeyi önermesine izin verin. Başka bölge seç - OsmAnd\'ın veri deposu (haritalar, izler, vb.): %1$s. + OsmAnd\'ın veri deposu (haritalar, GPX dosyaları vb. için): %1$s. Değiştir Al Mil/metre Yakıt-tasarruflu yol Yakıt tasarruflu yolu kullan (çoğunlukla daha kısadır). Yeni klasör ekle - Nokta(lar) başarıyla silindi. + Nokta(lar) silindi. Takip et - Bu rotadaki dikkate değer noktalar + Waypointler, ilgi noktaları, adlandırılmış özellikler Azami hız Ortalama hız Azami @@ -1922,18 +1996,18 @@ OSM Notlarını Gizle Eylem düğmesine dokunulduğunda, OSM Notları haritada gösterilir veya gizlenir. Mesafeye göre sıralandı - Ekrandaki konumunu değiştirmek için düğmeye uzun dokunun ve sürükleyin. + Düğmeye uzunca basıp sürüklemek, ekrandaki konumunu değiştirir. Aramayı yeniden başlat Arama yarıçapını artır Hiçbir şey bulunamadı Arama sorgusunu değiştir veya arama yarıçapını arttır. Sık Kullanılanları ara - Harita üzerinde kabartmalı gölgelendirme görmek için, bu bölgeye ait gölgelendirme bindirme haritasını indirmeniz gerekir. - Rahatlamanın dağınıklığını haritada görmek için, Contour Lines eklentisini satın almanız ve kurmanız gerekiyor + Harita üzerinde kabartmalı gölgelendirme görmek için, bu bölgeye ait gölgelendirme bindirme haritasını indirin. + Harita üzerinde kabartmalı gölgelendirme görmek için, \'Contour Lines\' eklentisini satın almanız ve yüklemeniz gerekmektedir Zum seviyesinden gizle - Haritadaki kontur çizgileri için bu bölgenin kontur çizgisini indirmeniz gerekiyor. + Bu bölgede kullanmak için \'Contour Line\' haritasını indirin. Eklenti - Kontur hatlarını harita üzerinde görmek için Contour Lines eklentisini satın almanız ve kurmanız gerekiyor + Kontur hatlarını harita üzerinde görmek için \'Contour Lines\' eklentisini satın almanız ve yüklemeniz gerekmektedir Renk düzeni Zum düzeyinden görüntüleme Özel-arazi erişimine izin ver @@ -1943,7 +2017,7 @@ Renk değiştir Adı düzenle Konumumu animasyonla canlandır - Navigasyon sırasında Konumum için harita kaydırma animasyonunu etkinleştir. + Navigasyon sırasında \'Konumum\' için hareketli harita kaydırmasını etkinleştir. Genel bakış Sokağı seçin Adresi yazın @@ -1953,7 +2027,7 @@ Tekrar yükle Güncel verileri görmek için döşemeleri yeniden yükleyin. Karo önbellek - Yanlış kullanıcı adı! + Yanlış kullanıcı adı Buraya Yalnızca eklenmiş görüntüleri görüntüleyin Tarih @@ -1965,26 +2039,26 @@ Posta-kodu seç Varış noktası ekle Varış noktasını yenisiyle değiştir - - Denizel derinlik konturları - Güney yarı küre denizel derinlik noktaları - Kuzey yarı küre denizel derinlik noktaları + \'Deniz derinlik eğrilerini\' satın aldığınız için teşekkür ederiz + Deniz derinlik eğrileri + Güney yarımküre deniz derinlik noktaları + Kuzey yarımküre deniz derinlik noktaları Denizel derinlik konturları Deniz haritaları - Harita için yazı tipleri + Harita yazı tipleri Denizel derinlik konturları Kategorileri düzenle Alt kategoriler Seçilen kategoriler - Lütfen yeni süzgeç için bir ad girin, bu Kategoriler sekmenize eklenecek. - Abonelik ücreti her ay kesilecektir. Aboneliğinizi istediğiniz zaman Google Play\'den iptal edebilirsiniz. + Lütfen yeni süzgeç için bir ad girin, bu \'Kategoriler\' sekmenize eklenecek. + Abonelik aylık ücretlendirilir. İstediğiniz zaman Google Play\'den iptal edin. OpenStreetMap topluluğuna bağış - Bağışınızın bir bölümü, OpenStreetMap\'e değişiklik yapan OSM kullanıcılarına gönderilir. Abonelik ücretiniz aynı kalır. + Bağışınızın bir kısmı, OpenStreetMap\'e değişiklik gönderen OSM kullanıcılarına gönderilir. Abonelik ücretiniz aynı kalır. Abonelik; tüm küresel haritalar için sınırsız indirmeyi ve saatlik, günlük, haftalık güncellemeleri etkinleştirir. - Sınırsız harita indirme edin, ve ayda birden çok harita güncellemesi al: haftalık, günlük veya saatlik. + Sınırsız harita indirme ve güncellemelerini ayda bir defadan fazla alın: haftalık, günlük ya da saatlik. Sınırsız harita indirmeleri, güncellemeleri ve Wikipedia eklentisi. Haritaları indirmeyi atla - Kurulu hiçbir çevrim dışı haritanız yok. Menü - %1$s aracılığıyla daha sonra listeden bir harita seçmeyi veya indirmeyi isteyebilirsiniz. + Kurulu bir çevrimdışı haritanız yok. Listeden bir harita seçebilir ya da daha sonra \'Menu - %1$s\' aracılığıyla haritaları indirebilirsiniz. Haritalar aranıyor… Konum bulunamadı İnternet bağlantısı yok @@ -1997,22 +2071,22 @@ Ses açık/kapalı Eylem ekle Eylem ekle - Belirlenen hızlı eylem adı zaten kullanımda, ikizliği engellemek için %1$s olarak adlandırıldı. + Belirlenen hızlı eylem adı zaten kullanımda, ikiliği önlemek için %1$s olarak değiştirildi. Öge oluştur - Haritada göstermek için bir veya daha çok POI kategorisi ekleyebilirsiniz. + Haritada görüntülemek için bir veya daha fazla POI kategorisi ekleyin. Yol Haritayı göster Rota hesaplandı Gidiş-Dönüş seyahat Bu fonksiyonu kullanmak için en az bir tane işaretleyici eklemeniz gereklidir. - Olağandışı durum: not değiştirilmedi + Not değiştirilemedi Notu değiştir OSM notunu değiştir Başlangıç noktasının bir kopyasını varış noktası olarak ekle. Gidiş-dönüş seyahat yap - Koordinat biçimi + Koordinat formatı Sistemde tanımlı klavyeyi kullan - Koordinat giriş biçimini seç. Bunu her zaman Seçenekler\'den değiştirebilirsiniz. + Koordinat giriş formatını seç. Bunu her zaman \'Seçenekler\'den değiştirebilirsiniz. Hızlı koordinat girişi Buzlu yollardan, nehir geçişlerinden kaçın Buzlu yollardan ve sığ sulu geçit geçişlerinden kaçınılsın. @@ -2027,7 +2101,7 @@ Eklendi İşaretleyici %s aktifleştirildi. İçerik menüsünü açmadan, harita üzerinde bir belirtecin üzerine bas ve aktif belirteçlerin üzerine sürükle. - Tek basış aktif + \'Tek basış\' aktif Notlar al! Widget veya içerik menüsünü kullanarak, harita üzerinde her nokta için ses, video veya fotoğraf notları al. Tarihe göre notlar @@ -2037,9 +2111,9 @@ Harita üzerinde görünüş Favoriler kategorisi Grup ekle - Grupları, favorilerden veya işaretleri takip etden alabilirsiniz. + Grupları Sık Kullanılanlar ya da GPX referans noktalarından içe aktarın. Harita işaretleyicileri oluştur! - Yerler üzerinde uzun veya kısa basıp, sonra bayrak butonuna bas. + Uzun ya da kısa \'Yerler\'e, ardından işaretçi bayrağı butonuna dokunun. Grupları al İki Bir @@ -2049,10 +2123,10 @@ Sol Yapıştır %1$d hane - Sonraki alana git + Sonraki alan İşaretçiyi yeniden adlandır Tam ekran modu - Sık kullanılanlar olarak içeri aktar + Sık Kullanılanlar olarak içe aktar Dosyayı içe aktar Yanlış girdi Yeni isim gir @@ -2068,7 +2142,7 @@ Tarih eklendi Sıralama: Arama sorgusunu değiştir. - İşaretleyicilere eklemek için bir sık kullanılanlar kategorisi seçiniz. + İşaretleyicilere eklemek için bir Sık Kullanılanlar kategorisi seçin. GPX dosyası olarak içe aktar Rotayı planla Liste @@ -2088,8 +2162,8 @@ Kaydettikten sonra haritada göster Uzaklığı ölç Rakam tuşları panelini göster - Mükemmel rotayı planlamak için konumunuzu ilk nokta olarak ekleyin. - Uygulamanın yeniden başlatılmasının ardından Grup kaldırılacaktır. + Mükemmel rotayı planlamak için konumunuzu başlangıç noktası olarak ekleyin. + Uygulamayı bir sonraki başlatışınızda grup gitmiş olacak. Harita işaretleyicilerinden kaldır Tüm harita işaretleyicileri Geçmiş\'e taşındı Harita işaretleyici Geçmiş\'e taşındı @@ -2104,9 +2178,7 @@ İzinler OsmAnd dosyayı içe aktaramıyor. Lütfen OsmAnd\'ın dosyanın konumundan okuma izni olduğunu kontrol ediniz. Mapillary ile fotoğraf kapsama alanını geliştir - Kendi fotoğraflarınızı ya da bir dizi fotoğrafınızı çekebilir ve bu harita lokasyonuna ekleyebilirsiniz. -\n -\nBunu yapabilmek için Google Play Store\'dan Mapillary uygulamasını kurmalısınız. + Bu harita konumuna bir ya da daha fazla fotoğraf eklemek için Mapillary yükleyin. Çevrim-içi fotoğraflar Fotoğraf ekle Bu lokasyon için fotoğrafa sahip değiliz. @@ -2120,9 +2192,9 @@ Harita üzerinde analiz et Görünür Otomatik - App\'in anonim uygulama istatistikleri gönderilmesin - OsmAnd uygulamanın hangi parçalarının açıldığına dair bilgi toplar. Konum bilginiz asla gönderilmez ya da uygulamaya girdiğiniz hiçbir şey veya görüntülediğiniz bölgelerin detayları, arama ya da indirmeleriniz gönderilmez. - Başlangıçta iletileri gösterme + Anonim uygulama kullanım istatistiklerini gönderme + OsmAnd uygulamanın hangi kısımlarını açtığınızla ilgili bilgi toplar. Konum bilginiz, ya da uygulamaya girdiğiniz herhangi bir şey veya görüntülediğiniz, aradığınız ya da indirdiğiniz bölgelerin detayları asla gönderilmez. + Başlangıç mesajlarını gösterme daha kısa rotalar %1$d nokta(lar) sileceksiniz. Emin misiniz? Yakındaki Wikipedia makaleleri @@ -2140,13 +2212,13 @@ Süzgeci sil Yeni süzgeç İzin ver - Konuma erişime izin ver + Konum erişimine izin ver Konumumu bul Güncelleme göstertme - Şimdi bütün haritaları güncelleştirmek istiyor musun? - Sık kullanılanlardan %1$s \'ı yenisiyle değiştirmek istediğine emin misin? + Tüm haritaları şimdi güncelle\? + Sık kullanılanlardan %1$s \'ı yenisiyle değiştirmek istediğinize emin misiniz\? Aramaya geri dön - Seçilmiş nesneleri Geçmişten silmek istiyor musunuz? + Seçilen ögeler \'Geçmiş’ten kaldırılsın mı\? %1$s \'ı haritada göster OsmAnd üzerinden paylaşıldı Posta-kodu @@ -2161,16 +2233,16 @@ Harita üzerinde göstermeye devam et Aktif işaretleyicilere olan uzaklığın nasıl gösterileceğini seçin. %1$d ondalık basamaklar girildikten sonra sonraki alana otomatik olarak geç. - Harita üzerine dokunarak basmak kontrol düğmeleri ve widget\'lara geçiş yapmayı sağlar. + Harita üzerine dokunarak basmak kontrol butonları ve widget\'lara geçiş yapmayı sağlar. Waypoint\'ler harita işaretleyicilerine eklendi - Burada belirtilecek dosyaya işaretleyicilerinizi dışa aktarabilirsiniz: - Track olarak kaydet + İşaretleyicilerinizi şu GPX dosyasına aktarın: + GPX dosyası olarak kaydet Haritada yön gösterici okları göster OsmAnd seçilmiş profil için rotalı noktalara bağlanacak. Lütfen en az bir nokta ekleyiniz. Haritayı görüntüle ve nokta ekle Kaydedilmiş track\'ları aylık klasörlerde depola - Resimleri yükleyicisine göre veya tarihe göre süzebilirsiniz. Süzgeçler yalnızca yakınlaştırılmış görüntü yaklaştırmada uygulanır. + Resimleri göndericiye, tarihe ya da türüne göre filtreleyin. Sadece yakınlaştırılmış zoomda etkin. Düzeltilmiş uzaklık Mapillary görüntüsü Mapillary\'yi aç @@ -2189,43 +2261,59 @@ Özel süzgeç oluştur Sürüm güncelleştirmeler veya OsmAnd ile ilgili indirimler kontrol edilmesin. öncesinde %1$s durak(lar) - İşaretleyicinin konumunu değiştirmek için haritayı hareket ettirin + İşaretleyici konumunu değiştirmek için haritayı hareket ettirin Hedef nokta yönünü sesle belirt. Hedef nokta yönünü titreşimle belirt. Bildirimler arasındaki minimum zaman aralığı. - "GPS navigasyon • Offline -çevrimdışı-(yurtdışındayken internet roaming ücreti yansıtılmaz) ya da online -çevrimiçi-(daha hızlıdır) modlarından birini seçebilirsiniz. • Rotadan her saptığınızda rota tekrar oluşturulur • Yol gidiş şeridi, cadde adları ve tahmini varış zamanı yol boyunca yardımcı olacaktır. • Seyahatinizi daha güvenli kılmak için, gündüz/gece modları otomatik olarak değişir. • Hız limitlerini göstermeyi seçebilirsiniz ve eğer limiti aşarsanız uyarılar alabilirsiniz. • Harita görüntü yakınlaştırma özelliği hızınıza göre uyarlanır. • Gidilecek yerleri (varış noktası) adrese göre, türe göre (örneğin: park yeri, restoran, otel, benzin istasyonu, müze) ya da coğrafi koordinatlar ile arayabilirsiniz. • Kendinizinkini kaydedebilir ya da bir GPX track\'ı yükleyerek onu takip edebilirsiniz" - Bisiklet sürüşü • Haritada bisiklet yolları bulabilirsiniz • Bisiklet sürüşü modunda GPS navigasyonu rotanızı bisiklet yollarını kullanarak oluşturur. • Hızınızı ve rakım\'ınızı görebilirsiniz • GPS kaydetme özelliği size seyahatlerinizi kaydetme ve paylaşma imkanı verir. • İlave eklenti aracılığıyla contour line\'ları ve hill shading\'leri görüntüleyebilirsiniz - Uğranacak-ara-noktalara sahip yol-izleri aranıyor - uğrama-ara-noktaları işaretleyicilere eklemek için bir yol izi seçin (yalnızca uğrama-ara-noktaları olan yol-izleri listelenir.) - Sık Kullanılanlar noktası ya da yol-izi dosyası olarak içe aktarılabilir. - Kılavuz çizgilerini göster + GPS navigasyon +\n • Çevrimdışı (yurt dışındayken dolaşım ücreti alınmaz) veya çevrimiçi (daha hızlı) mod arasında seçim yapın. +\n • Adım adım sesli rehberlik sizi yol boyunca yönlendirir (kaydedilmiş ve sentezlenmiş sesler) +\n • Rota, saptığınız anda yeniden kurulur +\n • Şerit kılavuzu, cadde adları ve tahmini varış zamanı yol boyunca yardımcı olacaktır +\n • Seyahatinizi daha güvenli hale getirmek için gece/gündüz modu otomatik olarak değişir +\n • Hız sınırlarını gösterin ve aşarsanız hatırlatmaları alın +\n • Harita yakınlaştırma hızınıza göre ayarlanır +\n • Varış yerlerini adres, tür (ör. Park, restoran, otel, benzin istasyonu, müze) veya coğrafi koordinatlara göre arayın +\n • Seyahat planınızdaki ara noktaları destekler +\n • Kendinizinkini kaydedin ya da bir GPX rotası yükleyin ve takip edin +\n + Bisiklet sürme +\n • Haritadaki bisiklet yollarını bulun +\n • Bisiklet modunda GPS navigasyonu, bisiklet yollarını kullanarak rotanızı oluşturur +\n • Hızınızı ve yüksekliğinizi görün +\n • GPX kayıt seçeneği seyahatinizi kaydetmenizi ve paylaşmanızı sağlar +\n • Ek bir eklenti aracılığıyla eşyükselti çizgilerini ve tepe gölgelemeyi etkinleştirebilirsiniz + Uğranacak-ara-noktalara sahip yollar aranıyor + Uğrama-ara-noktalarını işaretleyicilere eklemek için bir yol seçin. + Sık Kullanılanlar ya da GPX dosyası olarak içe aktarılabilir. + Yön çizgilerini göster Geçilmiş-olanı göster Geçilmiş-olanı gizle Harita ekranında harita işaretleyicilerine olan uzaklık ve yönün nasıl belirtileceğini seçin: Harita oryantasyon eşiği - Harita oryantasyonunun hangi hızda \"Hareket yönüne\" doğrudan \"Pusula yönüne\" doğruya döndürüleceğini aşağıda seçiniz. + Harita oryantasyonunun \'Hareket yönü\'nden \'Pusula yönü\'ne değişim hızını aşağıdan seçiniz. Rota noktaları olarak kaydet Öncesinde nokta ekle Sonrasında nokta ekle Yarıçap cetveli Mapillary aracılığıyla, bu konuma ait kendi sokak seviyesi görüntülerinizle katkıda bulunun. Şehir ya da kasaba yazınız - Aksyion düğmesine basmak hızınıza bağlı olarak otomatik harita görüntü-yakınlaştırma özelliğini açar/kapatır. + Bu eylem butonuna dokunmak, otomatik zoom haritasını hızınıza göre açar/kapatır. Seyahatteki ilk ara-noktayı ekleyin - Aksiyon düğmesine basmak; ekranın merkezi noktasına varış noktası ekleyecek. Önceden ayarladığınız \'varış noktası\' ise \'seyahatte-ara-nokta\' olarak uğranacak yer haline gelecek. - Aksiyon düğmesine basmak \'varış noktası\'nı ekranın merkezi noktası ile değiştirecek. - Aksiyon düğmesine basmak ekranın merkezi noktasında seyahatte-ilk-ara-nokta\'yı ekleyecek. + Bu eylem butonuna dokunmak, ekranın ortasını rota hedefi haline getirir, daha önce seçilen herhangi bir hedef, son ara hedef haline gelir. + Bu eylem butonuna dokunmak, ekranın ortasını daha önce seçilen hedefi (varsa) değiştirerek yeni rota hedefi haline getirir. + Bu eylem butonuna dokunmak, ekranın merkezini ilk ara hedef haline getirir. Sağdan-direksiyonlu araç sürüşü Tepelikli Az tepelikli Düzlük Dengeli Ana yol harici yan yolları tercih et - Tercih edilen arazi: düzlük ya da tepelikli. + Tercih edilen arazi: düz ya da engebeli. Yokuş Hareket zamanı Zaman aralığı - Yol-izi klasörü seç + GPX dosya klasörü seç Yol-izleri Rota yüksekliği yükselikte azalma @@ -2234,44 +2322,44 @@ Ortalama yükseklik Yükseklikte dalgalanma seçin Yükseklik verisi kullan - SRTM, ASTER ve EU-DEM tarafından sağlanan arazi yükseklik verisini kullan. + Arazi kotunda faktör (SRTM, ASTER ve EU-DEM verileri aracılığıyla). Şehir ya da bölge ara %1$d çıkışa gir ve ilerle - Henüz yol-izleriniz yok - Ayrıca klasöre yol-izleri ekleyeblirisiniz - Yol-izi ekle + Henüz GPX dosyanız yok + Ayrıca klasöre GPX dosyaları ekleyebilirsiniz + Daha fazla ekle… Görünüş Kaydetme hızlı başlatmayı etkinleştir Kayıt-tutma minimum hızı - Süzgeç: Noktanın kaydedilmesi için minimum hız. - Süzgeç: Kayıt etmek için noktanın son konumundan minimum uzaklığını ayarla. - Süzgeç: Bir noktanın kaydının tutulması için minimum kesinliği ayarlayın. + Filtre: Bu hızın altında nokta kaydı yok. + Filtre: Yenisini kaydetmek için bir noktadan minimum mesafeyi ayarlayın. + Filtre: Bu doğruluğa ulaşılmadıkça log kaydı olmaz. Yol yüzeyi sağlamlığı Şehir, adres, POI adı yazın %1$s uzağında ara İlçe Mahalle - İstikamet sesli geribildirim - İstikamet titreşimli bildirim - Yalnızca hedef noktaya istikamet değişirse uyar. + Sesli yön tarifleri + Dokunsal yön tarifleri + Sadece hedef noktaya yön değiştiğinde bildir. Otomatik-sesli-bildirim periyodu Uğranacak-ara-noktalar bulunamadı İspanyolca (Amerikan) Hareket Zamanı Plan seçin - Seyahat makalelerini çevrimdışı okumak için, aşağıdakilerden birini satın alın: + Çevrimdışı seyahat rehberi işlevselliğini almak için aşağıdakilerden birini satın alın: Uygun nesneyi seçin: Yapma Yap Sadece Kablosuz\'la - Resimleri İndir - "Makalelerdeki resimler çevrim dışı kullanım için indirilebilir. -\n Bu ayarı her zaman \'Gezinti\' → \'Seçenekler\' den değiştirebilirsiniz." + Resimleri indir + "Makalelerdeki resimler çevrimdışı kullanım için indirilebilir. +\nBu ayar her zaman \'Gezinti\' → \'Seçenekler\' de bulunabilir." Sadece Kablosuz\'la - Seyahat kitabı seçin + Bir seyahat kitabı seçin Seyahat kitabı Sayfa yalnızca çevrim içi kullanılabilir. Tarayıcıda açılsın mı? - Resimler önbelleği + Resim önbelleği Arama geçmisini sil Resimleri indir Seyahat rehberleri @@ -2286,8 +2374,8 @@ Toplam Tüm başlangıç noktalarını temizle Grup silindi - Uzaklık: En uzak önce - Uzaklık: En yakın önce + Uzaklık: önce en uzak + Uzaklık: önce en yakın Sınırsız erişim alın DD,DDDDDD° Enlem ve boylam girin @@ -2328,7 +2416,7 @@ Geçersiz taşıma tipleri… Yürü Toplu taşıma rotaları beta aşamasındadır. - Ara varış noktası ekle + Ara nokta ekle Başlangıç ve bitiş noktası ekle Başlangıç noktası ekle Başlangıç noktasını seç @@ -2374,8 +2462,8 @@ Gps izlerini göster/gizle Gps izlerini gizle Gps izlerini göster - Ev Adresi Ekle - İş adresi ekle + Ev ekle + Iş ekle İş Kapasite @@ -2387,7 +2475,7 @@ Rota hesaplanıyor… Toplu taşıma Rotayı göster - Navigasyon simülasyonu + Navigasyonu simüle et Sesli yönlendirmeler Ara varış noktaları Açıklamalar @@ -2410,7 +2498,7 @@ Açıklamayı gizle Açıklamayı göster Haritaları taşı - Yaya navigasyonu dene + Yaya navigasyonunu deneyin. Ayarları değiştirmeyi dene. Restore et Nokta yada yol bulunamadı. @@ -2431,19 +2519,19 @@ Favorilere ekle Favorileri göster Parke taşından kaçın - Lütfen bize 30 saniyenizi ayırın, geri bildirimlerinizi paylaşın ve çalışmalarımızı Google Play\'de değerlendirin. + Lütfen geri bildirimlerinizi paylaşarak ve çalışmalarımızı Google Play\'de oylayarak bize 30 saniyenizi ayırın. Gizlilik Politikası OsmAnd\'ı daha iyi duruma getirmemize yardımcı olun! Ne tür verileri paylaşmak istediğinizi seçin: - İndirilen Haritalar + İndirilen haritalar Ziyaret edilen ekranlar - OsmAnd ile paylaşmak istediğiniz verilerin listesi. - OsmAnd\'ın en sevilen özelliklerini anlamak için bu verileri topluyoruz. - Gizlilik ve Güvenlik - Bizimle paylaşmak için verilerinizi seçin + OsmAnd\'ın hangi verileri paylaşmasına izin verdiğinizi tanımlayın. + Hangi OsmAnd özelliklerinin en popüler olduğunu anlamamıza yardım edin. + Gizlilik ve güvenlik + Bizimle hangi verileri paylaştığınızı seçin Hayır, teşekkürler İzin ver - Profil Adı + Profil adı Taksi Servis otobüsü Metro @@ -2453,34 +2541,34 @@ Kayak Simge seçin Kip: %s - Türetilmiş kullanıcı kipi: %s + Kullanıcı modu, türetilmiş: %s Kayak Tür: %s - Temel Profil + Temel profil Gezinim türünü seçin - Profil Adı Girin + Profil adı girin Profil adı boş bırakılamaz! Yinelenen ad - OsmAnd temel profillerini silemezsiniz - Değişiklikleri Kaydet - Devam etmeden önce değişiklikleri Profile kaydetmelisin - Profili Sil + OsmAnd\'ın temel profillerini silemezsiniz + Değişiklikleri kaydet + Devam etmeden önce değişiklikleri profile kaydetmeniz gerekmektedir + Profili sil %s profilini silmek istediğinizden emin misiniz\? - Temel profili seçin + Temel bir profil seçin Gezinme türünü seçin - Araba, Kamyon, Motorsiklet - Dağ Bisikleti, Mobilet, At - Yürüme, Yürüyüş, Koşu - Tekne, Kürek, Yelken - Uçak, Planör + Araba, kamyon, motorsiklet + Dağ bisikleti, moped, at + Yürüme, doğa yürüyüşü, koşu + Tekne, kürek, yelken + Uçak, planör Coğrafi Kodlama - Düz Çizgi + Düz çizgi Uygulamada görünecek profilleri seçin. Uygulama profilleri OsmAnd indirme hizmeti Eflatun Simge - Toplanmış Veri + Toplanan veriler Harita yönünü değiştirmek için tekrar dokunun En düşük hız En yüksek hız @@ -2515,7 +2603,7 @@ Uyanma zamanı Birimler ve formatlar Görünüm - simgeler, widget\'lar + Harita Görünümü Harita görünümü Yüklü eklentilerin listesi Navigasyonu yapılandır @@ -2530,4 +2618,115 @@ Uygulama profili \"%s\" olarak değiştirildi Logcat tamponu Eklenti ayarları - + OsmAnd+ (OSM Automated Navigation Directions), ücretsiz, dünya çapında ve yüksek kaliteli OpenStreetMap (OSM) verilerine erişim sağlayan bir harita ve navigasyon uygulamasıdır. +\n Sesli ve görüntülü navigasyonun, POI\'leri (points of interest) görüntülemenin, GPX yol-izleri oluşturma ve yönetmenin, eşyükselti çizgileri görselleştirmenin ve irtifa bilgilerini kullanmanın, araç, bisiklet, yaya modları arasında tercih yapmanın, OSM düzenleme ve daha fazlasının keyfini çıkarın. +\n +\n OsmAnd+ uygulamanın ücretli versiyonudur. Satın alarak, projeyi desteklemekte, yeni özelliklerin geliştirilmesini finanse etmekte ve en son güncellemeleri almaktasınız. +\n +\n Ana özelliklerden bazıları: + Puan ver + OsmAnd\'ın anonim uygulama kullanım verilerini toplamasına ve işlemesine izin verin. Konumunuz ya da haritada görüntülediğiniz diğer konumlar hakkında veri toplamıyoruz veya saklamıyoruz. +\n +\nSeçiminizi istediğiniz zaman Ayarlar > Gizlilik ve Güvenlik bölümünden değiştirebilirsiniz. + Hangi bölge ve ülkelerin hangi haritalarının en popüler olduğunu anlamamıza yardımcı olur. + \"İzin Ver\" tuşuna dokunarak %1$\'larımızla aynı fikirde olursunuz + Navigasyon türü + routing.xml dosyasının değiştirilmiş versiyonunu ..osmand/routing dizinine ekleyebilirsiniz + Pusula cetvelini göster + Pusula cetvelini gizle + Lütfen yeni uygulama profili için bir navigasyon türü seçin + Bu isimde zaten bir profil var + OsmAnd\'ın son başlatılması başarısız oldu. Lütfen hata mesajını paylaşarak OsmAnd\'ı iyileştirmemize yardımcı olun. + UFO + • Uygulama profilleri: Özel bir simge ve renk ile kendi ihtiyaçlarınız için özel bir profil oluşturun +\n +\n • Şimdi herhangi bir profilin varsayılan ve minimum/maksimum hızlarını özelleştirin +\n +\n • Mevcut koordinatlar için bir widget eklendi +\n +\n • Pusulayı ve haritadaki yarıçap cetvelini göstermek için seçenekler eklendi +\n +\n • Arkaplan izleme kaydı düzeltildi +\n +\n • Arka plan harita indirmeleri iyileştirildi +\n +\n • \'Ekranı Aç\' seçeneği geri döndü +\n +\n • Wikipedia dil seçimi düzeltildi +\n +\n • Navigasyon sırasında pusula butonu davranışı düzeltildi +\n +\n • Diğer hata düzeltmeleri +\n +\n + Tek tekerlekli + Hassasiyet yatay olarak: %1$s, dikey olarak: %2$s + Yatay olarak hassasiyet: %s + Offroad + Profil kurun + Profil kendi ayarlarını korur + Profil için varsayılan harita seçeneklerini seçin + Profil için varsayılan ekran seçeneklerini seçin + Profil için varsayılan navigasyon ayarlarını seçin + Maksimum değişiklik sayısını belirtin + Değişiklik sayısı + Dönüşte uyan + Ekranın açılacağı zamanı ayarlayın. + Yakınlık sensörü kullan + Gezinirken ekranı açmak için elinizi ekranın üstünde sallayın. + Bu ayarı kullanmak için lütfen en az bir uygulama profilini açın. + Kış yolu + Buz yolu + Kış ve buz yolları + Sert (asfalt) + Sert (asfaltsız) + Çoğunlukla sert + Çoğunlukla yumuşak + Yumuşak + Yüzey sertliği + %s kaydedildi + Yol-izini aç + %s yol-izi kaydedildi + Boşlukları birleştir + Kampçı + Kampçı minibüsü + Haritada Düşük Emisyon bölgelerini göster. Yönlendirmeyi etkilemez. + Düşük Emisyon Bölgelerini göster + Geçici sınırlamaları göz önünde bulundurun + Varsayılan + Vagon + Kamyonet + Hafta + Ay + Ay + Ay + Yıl + Yıl + Yıl + Üç ay + Ücretsiz + %3$s indirimli olarak %1$d %2$s alın. + %1$d %2$s ücretsiz denemenizi başlatın. + İlk %2$s için %1$s + İlk %2$s için %1$s + sonra %1$s + Aboneliği iptal et + %1$s • %2$s tasarruf edin + Tüm uygulamayı etkile + OsmAnd ayarları + Diğer profilden kopyala + Ekranı aç + Navigasyon sırasında harita + Navigasyon sırasında harita + Diğer + Ağırlık, yükseklik, hız + Araç parametreleri + Sesli duyurular sadece navigasyon sırasında çalınır. + Navigasyon talimatı ve duyurular + Sesli duyurular + Ekran uyarıları + Rota parametrelerini yapılandır + Rota parametreleri + Varsayılan olarak + Bu alanı görüntülemek için detaylı %s haritasını indirin. + \ No newline at end of file From 96ca6ae9f9955b343fad9b986228980d1324c006 Mon Sep 17 00:00:00 2001 From: Eduardo Addad de Oliveira Date: Sun, 6 Oct 2019 01:26:15 +0000 Subject: [PATCH 19/34] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2986 of 2986 strings) --- OsmAnd/res/values-pt-rBR/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml index f26ea34f29..9e238db0db 100644 --- a/OsmAnd/res/values-pt-rBR/strings.xml +++ b/OsmAnd/res/values-pt-rBR/strings.xml @@ -3248,7 +3248,7 @@ Pôr do Sol: %2$s Tempo de despertar Unidades e formatos Aparência - Ícones, widgets + Aparência do mapa Aparência do mapa Lista de plugins instalados Configurar navegação @@ -3277,4 +3277,5 @@ Pôr do Sol: %2$s Pré-definido Configurações do plugin Faça o download do mapa %s detalhado, para visualizar esta área. + Faça o download do mapa %s detalhado, para visualizar esta área. \ No newline at end of file From 1edbf764696df32e59c4401d62b78219d45a1f45 Mon Sep 17 00:00:00 2001 From: jan madsen Date: Sat, 5 Oct 2019 17:04:18 +0000 Subject: [PATCH 20/34] Translated using Weblate (Danish) Currently translated at 98.8% (2950 of 2986 strings) --- OsmAnd/res/values-da/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-da/strings.xml b/OsmAnd/res/values-da/strings.xml index ca64dac2bb..45b359ead4 100644 --- a/OsmAnd/res/values-da/strings.xml +++ b/OsmAnd/res/values-da/strings.xml @@ -3263,7 +3263,7 @@ Repræsenterer område: %1$s x %2$s Vågnetid Enheder & formater Udseende - ikoner, moduler + Kortets udseende Kortets udseende Liste over installerede udvidelser Konfigurer navigation @@ -3297,4 +3297,5 @@ Repræsenterer område: %1$s x %2$s Udvidelsesindstillinger Som standard Hent detaljeret %s kort, for at se området. + Hent detaljeret %s kort, for at se området. \ No newline at end of file From ed9f63a2da59cbbcbdd2a7a22e5cce8ec8074990 Mon Sep 17 00:00:00 2001 From: josep constanti Date: Sun, 6 Oct 2019 06:26:20 +0000 Subject: [PATCH 21/34] Translated using Weblate (Catalan) Currently translated at 98.6% (2944 of 2986 strings) --- OsmAnd/res/values-ca/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-ca/strings.xml b/OsmAnd/res/values-ca/strings.xml index 496935a857..57643ca90f 100644 --- a/OsmAnd/res/values-ca/strings.xml +++ b/OsmAnd/res/values-ca/strings.xml @@ -3266,4 +3266,5 @@ Abasta l\'àrea: %1$s x %2$s Configuració del connector Predeterminat Baixeu el mapa detallat %s per veure aquesta àrea. + Paràmetres de la ruta \ No newline at end of file From ca6416463dfe4fe9af16d764e4ff127e7ce2b55c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sveinn=20=C3=AD=20Felli?= Date: Mon, 7 Oct 2019 06:47:23 +0000 Subject: [PATCH 22/34] Translated using Weblate (Icelandic) Currently translated at 100.0% (2986 of 2986 strings) --- OsmAnd/res/values-is/strings.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/OsmAnd/res/values-is/strings.xml b/OsmAnd/res/values-is/strings.xml index 085c37bca9..97153c20fc 100644 --- a/OsmAnd/res/values-is/strings.xml +++ b/OsmAnd/res/values-is/strings.xml @@ -2919,8 +2919,8 @@ Stendur fyrir svæði: %1$s x %2$s Yfirborð Áferð Bratti - Bæta við heima - Bæta við vinnu + Bæta við \"Heim\" + Bæta við \"Vinna\" Vinna Fyrri leið Bættu fyrst við áfangastað @@ -3272,7 +3272,7 @@ Stendur fyrir svæði: %1$s x %2$s Vökutími Einingar og snið þeirra Útlit - táknmyndir, viðmótshlutar (widgets) + Útlit landakorts Útlit korts Listi yfir uppsettar viðbætur Stilla leiðsögn @@ -3304,4 +3304,5 @@ Stendur fyrir svæði: %1$s x %2$s Stillingar á forritsviðbót Sjálfgefið Sæktu nákvæma %s kortið til að skoða þetta svæði. + Sæktu nákvæma %s kortið til að skoða þetta svæði. \ No newline at end of file From 5f73b4d2b1d732e2f3c614965f4e431fc4c4bfb1 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Sun, 6 Oct 2019 07:26:18 +0000 Subject: [PATCH 23/34] Translated using Weblate (Hebrew) Currently translated at 99.7% (2978 of 2986 strings) --- OsmAnd/res/values-he/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-he/strings.xml b/OsmAnd/res/values-he/strings.xml index 59e47d9da0..7550906eeb 100644 --- a/OsmAnd/res/values-he/strings.xml +++ b/OsmAnd/res/values-he/strings.xml @@ -3227,7 +3227,7 @@ זמן התעוררות יחידות ותבניות מראה - סמלים, וידג׳טים + מראה המפה מראה המפה רשימת התוספים המותקנים הגדרת ניווט @@ -3276,4 +3276,5 @@ כבררת מחדל הגדרות תוסף הורדת המפה המפורטת %s, כדי לצפות באזור זה. + הורדת מפת %s מפורטת כדי לצפות באזור הזה. \ No newline at end of file From 4261a39c33861daa717e8d19c47d0b32d3f53c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Sok=C3=B3=C5=82?= Date: Sat, 5 Oct 2019 18:05:00 +0000 Subject: [PATCH 24/34] Translated using Weblate (Polish) Currently translated at 99.9% (2985 of 2986 strings) --- OsmAnd/res/values-pl/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml index d6ac5cc77a..0e361d884f 100644 --- a/OsmAnd/res/values-pl/strings.xml +++ b/OsmAnd/res/values-pl/strings.xml @@ -3296,4 +3296,6 @@ Reprezentuje obszar: %1$s x %2$s Uzyskaj %1$d %2$s taniej o %3$s. Język i wyjście Ustawienia wtyczki + Domyślnie + Pobierz szczegółową mapę %S, aby zobaczyć ten obszar. \ No newline at end of file From 467ba21f15830da5b9874e189901ac90a14a799a Mon Sep 17 00:00:00 2001 From: Ldm Public Date: Sat, 5 Oct 2019 18:27:31 +0000 Subject: [PATCH 25/34] Translated using Weblate (French) Currently translated at 100.0% (2986 of 2986 strings) --- OsmAnd/res/values-fr/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 0053559f8a..9cec67fb97 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -3246,7 +3246,7 @@ représentant la zone : %1$s x %2$s Afficher la carte sur l\'écran de verrouillage pendant la navigation. Ces paramètres influencent le calcul de l\'itinéraire et s\'appliqueront au profil : %1$s. Heure de réveil - icônes, gadgets + Apparence de la carte Apparence de la carte Thème de l\'application, unités, région Restaurer les valeurs par défaut @@ -3259,4 +3259,5 @@ représentant la zone : %1$s x %2$s Payez %1$d %2$s et gagnez %3$s. Par défaut Téléchargez la carte détaillée de %s pour voir cette zone. + Télécharger la carte détaillée %s pour voir cette zone. \ No newline at end of file From 2c87a5af4cde90100619965583eec1f1549fb5f9 Mon Sep 17 00:00:00 2001 From: iman Date: Sat, 5 Oct 2019 18:47:44 +0000 Subject: [PATCH 26/34] Translated using Weblate (Persian) Currently translated at 100.0% (2986 of 2986 strings) --- OsmAnd/res/values-fa/strings.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-fa/strings.xml b/OsmAnd/res/values-fa/strings.xml index 25443e9efc..06c051f9c6 100644 --- a/OsmAnd/res/values-fa/strings.xml +++ b/OsmAnd/res/values-fa/strings.xml @@ -1011,7 +1011,7 @@ برای استفاده از نقشه‌های آفلاین، داده‌های «آفلاین» را دانلود کنید. " \n -\nبرای دسترسی به گزینه‌ها طولانی لمس کنید" +\nبرای گزینه‌ها طولانی لمس کنید" %1$d مورد از %2$d مورد غیرفعال شد. %1$d مورد از %2$d مورد حذف شد. %1$d مورد از %2$d مورد فعال شد. @@ -3304,7 +3304,7 @@ ‏OsmAnd از قالب UTM Standard استفاده می‌کند که مشابه (اما نه یکسان) با قالب UTM Nato است. به‌کارگیری برای پروفایل کنونی: %1$s به‌کارگیری برای همهٔ پروفایل‌ها - نمادها، ابزارک‌ها + ظاهر نقشه پوستهٔ برنامه، یکاها، منطقه پیکربندی پروفایل پیام‌های گفتاری فقط در هنگام ناوبری پخش می‌شود. @@ -3332,4 +3332,5 @@ بافر لاگ‌کت به‌طور پیشفرض برای دیدن این منطقه، نقشهٔ باجزئیات %s را دانلود کنید. + برای دیدن این منطقه، نقشهٔ باجزئیات %s را دانلود کنید. \ No newline at end of file From 905d1f4ccf234db7f39aa2d9e24a76ac7479c45b Mon Sep 17 00:00:00 2001 From: ace shadow Date: Sat, 5 Oct 2019 23:37:30 +0000 Subject: [PATCH 27/34] Translated using Weblate (Slovak) Currently translated at 100.0% (2986 of 2986 strings) --- OsmAnd/res/values-sk/strings.xml | 63 ++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml index 8ae6191927..60ac83e754 100644 --- a/OsmAnd/res/values-sk/strings.xml +++ b/OsmAnd/res/values-sk/strings.xml @@ -3216,4 +3216,67 @@ Zodpovedá oblasti: %1$s x %2$s potom %@ Zrušiť predplatné %1$s • Ušetrite %2$s + Deň + Dni + Dní + Týždeň + Týždne + Týždňov + Mesiac + Mesiace + Mesiacov + Rok + Roky + Rokov + Tri mesiace + Všetky nasledovné nastavenia ovplyvnia len zvolený profil. + OsmAnd používa formát UTM Standard, ktorý je podobný ale nie identický s formátom UTM Nato. + Príklad + UTM Standard + Open Location Code + Zvolený formát bude použitý na všetkých miestach aplikácie. + Toto nastavenie bude predvolené v profiloch: %s + Zmeniť predvolené nastavenia + Zahodiť zmeny + Použiť na aktuálny profil %1$s + Použiť na všetky profily + Správa po spustení + Analýzy + Zobraziť mapu počas navigácie nad zamknutou obrazovkou. + Tieto nastavenia ovplyvnia tvorbu trasy. Použijú sa len na zvolený profil: %1$s. + Čas zobudenia + Jednotky & formáty + Zobrazenie + Zobrazenie mapy + Vzhľad mapy + Zoznam nainštalovaných modulov + Nastaviť navigáciu + Vzhľad aplikácie, jednotky, oblasť + Nastaviť profil + Varovania budú zobrazené počas navigácie v ľavom dolnom rohu obrazovky. + Prepnúť profil + Jazyk a výstup + Obnoviť do základného nastavenia + Vytvoriť, importovať, upraviť profily + Spravovať profily aplikácie… + Ovplyvní celú aplikáciu + Nastavenia OsmAnd + Kopírovať z iného profilu + Zapnúť obrazovku + Mapa počas navigácie + Mapa počas navigácie + Iné + Hmotnosť, výška, rýchlosť + Parametre vozidla + Hlasové oznámenia sú prehrávané len počas navigácie. + Navigačné pokyny a oznámenia + Hlasové oznámenia + Varovania na obrazovke + Nastaviť parametre trasy + Parametre trasy + Profil aplikáce sa zmenil na \"%s\" + Zásobník logcat + Nastavenia modulu + Predvolene + Pre zobrazenie tejto oblasti si stiahnite podrobnú mapu %s. \ No newline at end of file From 05e30e080bbc3167ec7bc4b1c450cd486cf0b283 Mon Sep 17 00:00:00 2001 From: Oguz Ersen Date: Sat, 5 Oct 2019 17:59:17 +0000 Subject: [PATCH 28/34] Translated using Weblate (Turkish) Currently translated at 31.9% (1184 of 3708 strings) --- OsmAnd/res/values-tr/phrases.xml | 81 ++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/OsmAnd/res/values-tr/phrases.xml b/OsmAnd/res/values-tr/phrases.xml index fcbab5b3f2..27820b53ff 100644 --- a/OsmAnd/res/values-tr/phrases.xml +++ b/OsmAnd/res/values-tr/phrases.xml @@ -1111,4 +1111,85 @@ Buzul tipi Kontrol noktası tipi Toplu satın alma + Nükleer atık + Terkedilmiş endüstriyel bölge + Spor pisti + Çoklu spor + Sırp ortodoks + Kaynak + Kumarhane + Fast food + İçme suyu + Sepet yapıcı + Arıcı + Çilingir + Anahtarcı + Gözlükçü + Çatı ustası + Çamaşırhane + Duş + Sauna + Koy + Fiyort + Resif + Vadi + Adacık + Demirleme yeri + Çapa rıhtımı + Yanal şamandıra + Yüzer iskele + Sis sinyali + Liman havzası + Liman + Sinyal istasyonu, trafik + Sinyal istasyonu, uyarı + Havai kaldırma direği + Elektrik direği + Soğutma kulesi + Basamak-taşlı köprü + Ticari arazi + Perakende kullanım amaçlı arazi + Pediatri + İnternet erişimi: evet + İnternet erişimi: hayır + İnternet erişimi - ücretli + İnternet erişimi - ücretsiz + Uçak yakıtı istasyonu + Tarihi uçak + Bal dükkanı + 91UL yakıt + 100LL yakıt + AdBlue yakıt + Yakıt: odun + Yakıt: odun kömürü + Yakıt: kömür + Kaçış şeridi + Mason Köşkü + Yelken kulübü + İzci kulübü + Otogaz + Jet A-1 yakıtı + Buz hokeyi + Dini ürünler + Baharat dükkanı + Sanat ve el sanatları tedarik mağazası + Tekneler için benzin istasyonu + Acil durum altyapısı + Kilit havzası + ATM + Tür + Kitaplar + Anlam + Zorluk kategorisi + Tırmanma kayalığı + Evet + Tarihi tank + Kar aracı erişimi + Otobüs erişimi + Karavan erişimi + Motokaravan erişimi + Treyler erişimi + Motosiklet erişimi + Moped erişimi + Engelli erişimi \ No newline at end of file From da1b88ac13cfc859f0e50fe1dc1e33ba5f89da55 Mon Sep 17 00:00:00 2001 From: IgorEliezer Date: Sun, 6 Oct 2019 07:50:42 +0000 Subject: [PATCH 29/34] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (3708 of 3708 strings) --- OsmAnd/res/values-pt-rBR/phrases.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-pt-rBR/phrases.xml b/OsmAnd/res/values-pt-rBR/phrases.xml index b3fbe305fd..df82e4c25e 100644 --- a/OsmAnd/res/values-pt-rBR/phrases.xml +++ b/OsmAnd/res/values-pt-rBR/phrases.xml @@ -3722,7 +3722,7 @@ Construtora Destilaria Marceneiro - Murro + Assentador de piso Padaria Marceneiro \ No newline at end of file From b9e5648c5ee593ea08d747178f5cc4cb4410503a Mon Sep 17 00:00:00 2001 From: Nazar Date: Mon, 7 Oct 2019 15:30:26 +0300 Subject: [PATCH 30/34] DataStorage initial commit --- .../bottom_sheet_change_data_storage.xml | 37 ++ .../layout/bottom_sheet_dialog_button_big.xml | 28 + ...ttom_sheet_item_btn_with_icon_and_text.xml | 45 ++ .../res/layout/bottom_sheet_select_folder.xml | 64 ++ OsmAnd/res/layout/data_storage_list_item.xml | 122 ++++ OsmAnd/res/values/strings.xml | 10 + OsmAnd/res/xml/data_storage.xml | 10 + OsmAnd/res/xml/global_settings.xml | 1 + OsmAnd/src/net/osmand/AndroidUtils.java | 23 + OsmAnd/src/net/osmand/plus/UiUtilities.java | 19 +- .../plus/settings/BaseSettingsFragment.java | 3 +- .../plus/settings/DataStorageFragment.java | 566 ++++++++++++++++++ .../plus/settings/DataStorageItemsHolder.java | 200 +++++++ .../plus/settings/DataStorageMenuItem.java | 169 ++++++ .../plus/settings/GlobalSettingsFragment.java | 12 + .../ChangeDataStorageBottomSheet.java | 180 ++++++ .../bottomsheets/SelectFolderBottomSheet.java | 198 ++++++ 17 files changed, 1683 insertions(+), 4 deletions(-) create mode 100644 OsmAnd/res/layout/bottom_sheet_change_data_storage.xml create mode 100644 OsmAnd/res/layout/bottom_sheet_dialog_button_big.xml create mode 100644 OsmAnd/res/layout/bottom_sheet_item_btn_with_icon_and_text.xml create mode 100644 OsmAnd/res/layout/bottom_sheet_select_folder.xml create mode 100644 OsmAnd/res/layout/data_storage_list_item.xml create mode 100644 OsmAnd/res/xml/data_storage.xml create mode 100644 OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java create mode 100644 OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java create mode 100644 OsmAnd/src/net/osmand/plus/settings/DataStorageMenuItem.java create mode 100644 OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java create mode 100644 OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java diff --git a/OsmAnd/res/layout/bottom_sheet_change_data_storage.xml b/OsmAnd/res/layout/bottom_sheet_change_data_storage.xml new file mode 100644 index 0000000000..8702a1cb65 --- /dev/null +++ b/OsmAnd/res/layout/bottom_sheet_change_data_storage.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/bottom_sheet_dialog_button_big.xml b/OsmAnd/res/layout/bottom_sheet_dialog_button_big.xml new file mode 100644 index 0000000000..7a8d1ee9a9 --- /dev/null +++ b/OsmAnd/res/layout/bottom_sheet_dialog_button_big.xml @@ -0,0 +1,28 @@ + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/bottom_sheet_item_btn_with_icon_and_text.xml b/OsmAnd/res/layout/bottom_sheet_item_btn_with_icon_and_text.xml new file mode 100644 index 0000000000..6adcae70ac --- /dev/null +++ b/OsmAnd/res/layout/bottom_sheet_item_btn_with_icon_and_text.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/bottom_sheet_select_folder.xml b/OsmAnd/res/layout/bottom_sheet_select_folder.xml new file mode 100644 index 0000000000..4693c7d881 --- /dev/null +++ b/OsmAnd/res/layout/bottom_sheet_select_folder.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/data_storage_list_item.xml b/OsmAnd/res/layout/data_storage_list_item.xml new file mode 100644 index 0000000000..4e8a231449 --- /dev/null +++ b/OsmAnd/res/layout/data_storage_list_item.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 5a481e052d..7889f194c2 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,6 +11,16 @@ Thx - Hardy --> + Move OsmAnd data files to the new destination?\n%1$s > %2$s + %1$s • Used %2$s GB + Free %1$s • %2$s / %3$s GB + Enter path to the folder + Select folder + Paste path to the folder with OsmAnd data + Change OsmAnd data folder? + Move to the new destination + Internal storage, hiden from user and other apps, so no one except OsmAnd can’t get access to your data + Change data storage folder Download detailed %s map, to view this area. By default Plugin settings diff --git a/OsmAnd/res/xml/data_storage.xml b/OsmAnd/res/xml/data_storage.xml new file mode 100644 index 0000000000..527ab8e1a9 --- /dev/null +++ b/OsmAnd/res/xml/data_storage.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/xml/global_settings.xml b/OsmAnd/res/xml/global_settings.xml index 5194192ab7..2e95524c79 100644 --- a/OsmAnd/res/xml/global_settings.xml +++ b/OsmAnd/res/xml/global_settings.xml @@ -21,6 +21,7 @@ android:layout="@layout/preference_with_descr" android:persistent="false" android:title="@string/application_dir" + app:fragment="net.osmand.plus.settings.DataStorageFragment" tools:icon="@drawable/ic_action_folder" /> = Build.VERSION_CODES.LOLLIPOP; View buttonContainer = buttonView.findViewById(R.id.button_container); + int textAndIconColorResId = INVALID_ID; switch (buttonType) { case PRIMARY: if (v21) { AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.ripple_solid_light, R.drawable.ripple_solid_dark); } AndroidUtils.setBackground(ctx, buttonView, nightMode, R.drawable.dlg_btn_primary_light, R.drawable.dlg_btn_primary_dark); - buttonTextView.setTextColor(ContextCompat.getColorStateList(ctx, nightMode ? R.color.dlg_btn_primary_text_dark : R.color.dlg_btn_primary_text_light)); + textAndIconColorResId = nightMode ? R.color.dlg_btn_primary_text_dark : R.color.dlg_btn_primary_text_light; break; case SECONDARY: if (v21) { AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.ripple_solid_light, R.drawable.ripple_solid_dark); } AndroidUtils.setBackground(ctx, buttonView, nightMode, R.drawable.dlg_btn_secondary_light, R.drawable.dlg_btn_secondary_dark); - buttonTextView.setTextColor(ContextCompat.getColorStateList(ctx, nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light)); + textAndIconColorResId = nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light; break; case STROKED: if (v21) { AndroidUtils.setBackground(ctx, buttonContainer, nightMode, R.drawable.ripple_light, R.drawable.ripple_dark); } AndroidUtils.setBackground(ctx, buttonView, nightMode, R.drawable.dlg_btn_stroked_light, R.drawable.dlg_btn_stroked_dark); - buttonTextView.setTextColor(ContextCompat.getColorStateList(ctx, nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light)); + textAndIconColorResId = nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light; break; } + ColorStateList colorStateList = ContextCompat.getColorStateList(ctx, textAndIconColorResId); buttonTextView.setText(buttonText); + buttonTextView.setTextColor(colorStateList); buttonTextView.setEnabled(buttonView.isEnabled()); + if (iconResId != INVALID_ID) { + Drawable icon = tintDrawable(ContextCompat.getDrawable(ctx, iconResId), ContextCompat.getColor(ctx, textAndIconColorResId)); + buttonTextView.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null); + buttonTextView.setCompoundDrawablePadding(AndroidUtils.dpToPx(ctx, ctx.getResources().getDimension(R.dimen.content_padding_half))); + } } public static Context getThemedContext(Context context, boolean nightMode) { diff --git a/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java index 2163069af1..6f3cf45df2 100644 --- a/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java @@ -93,7 +93,8 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat impl VOICE_ANNOUNCES(VoiceAnnouncesFragment.class.getName(), true, R.xml.voice_announces, R.layout.profile_preference_toolbar_with_switch), VEHICLE_PARAMETERS(VehicleParametersFragment.class.getName(), true, R.xml.vehicle_parameters, R.layout.profile_preference_toolbar), MAP_DURING_NAVIGATION(MapDuringNavigationFragment.class.getName(), true, R.xml.map_during_navigation, R.layout.profile_preference_toolbar), - TURN_SCREEN_ON(TurnScreenOnFragment.class.getName(), true, R.xml.turn_screen_on, R.layout.profile_preference_toolbar_with_switch); + TURN_SCREEN_ON(TurnScreenOnFragment.class.getName(), true, R.xml.turn_screen_on, R.layout.profile_preference_toolbar_with_switch), + DATA_STORAGE(DataStorageFragment.class.getName(), false, R.xml.data_storage, R.layout.global_preference_toolbar); public final String fragmentName; public final boolean profileDependent; diff --git a/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java b/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java new file mode 100644 index 0000000000..f4013e536c --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java @@ -0,0 +1,566 @@ +package net.osmand.plus.settings; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.support.v7.app.AlertDialog; +import android.support.v7.preference.CheckBoxPreference; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; +import android.support.v7.preference.PreferenceViewHolder; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import net.osmand.AndroidUtils; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.OsmandSettings; +import net.osmand.plus.ProgressImplementation; +import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; +import net.osmand.plus.activities.OsmandActionBarActivity; +import net.osmand.plus.download.DownloadActivity; +import net.osmand.plus.settings.bottomsheets.ChangeDataStorageBottomSheet; +import net.osmand.plus.settings.bottomsheets.SelectFolderBottomSheet; +import net.osmand.util.Algorithms; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.ref.WeakReference; +import java.text.DecimalFormat; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Locale; + +import static net.osmand.plus.settings.DataStorageItemsHolder.INTERNAL_STORAGE; +import static net.osmand.plus.settings.DataStorageItemsHolder.MANUALLY_SPECIFIED; +import static net.osmand.plus.settings.bottomsheets.ChangeDataStorageBottomSheet.CHOSEN_DIRECTORY; +import static net.osmand.plus.settings.bottomsheets.ChangeDataStorageBottomSheet.MOVE_DATA; +import static net.osmand.plus.settings.bottomsheets.SelectFolderBottomSheet.PATH_CHANGED; +import static net.osmand.plus.settings.bottomsheets.SelectFolderBottomSheet.NEW_PATH; + +public class DataStorageFragment extends BaseSettingsFragment { + + private final static String CHANGE_DIRECTORY_BUTTON = "change_directory"; + + private ArrayList menuItems; + private ArrayList dataStorageRadioButtonsGroup; + private Preference changeButton; + private DataStorageMenuItem currentDataStorage; + private String tmpManuallySpecifiedPath; + private DataStorageItemsHolder itemsHolder; + + private OsmandApplication app; + private OsmandActionBarActivity activity; + private OsmandSettings settings; + + @Override + protected void setupPreferences() { + app = getMyApplication(); + activity = getMyActivity(); + PreferenceScreen screen = getPreferenceScreen(); + + if (screen == null || app == null || activity == null) { + return; + } + settings = app.getSettings(); + + itemsHolder = DataStorageItemsHolder.refreshInfo(app); + menuItems = itemsHolder.getStorageItems(); + dataStorageRadioButtonsGroup = new ArrayList<>(); + + for (DataStorageMenuItem item : menuItems) { + CheckBoxPreference preference = new CheckBoxPreference(activity); + preference.setKey(item.getKey()); + preference.setTitle(item.getTitle()); + preference.setLayoutResource(R.layout.data_storage_list_item); + screen.addPreference(preference); + dataStorageRadioButtonsGroup.add(preference); + } + + currentDataStorage = itemsHolder.getCurrentStorage(); + + changeButton = new Preference(app); + changeButton.setKey(CHANGE_DIRECTORY_BUTTON); + changeButton.setLayoutResource(R.layout.bottom_sheet_item_btn_with_icon_and_text); + screen.addPreference(changeButton); + + updateView(currentDataStorage.getKey()); + } + + @Override + public boolean onPreferenceClick(Preference preference) { + if (CHANGE_DIRECTORY_BUTTON.equals(preference.getKey())) { + showFolderSelectionDialog(); + return false; + } + return super.onPreferenceClick(preference); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + super.onPreferenceChange(preference, newValue); + + if (newValue instanceof Bundle) { + //results from BottomSheets + Bundle resultData = (Bundle) newValue; + if (resultData.containsKey(ChangeDataStorageBottomSheet.TAG)) { + boolean moveMaps = resultData.getBoolean(MOVE_DATA); + DataStorageMenuItem newDataStorage = resultData.getParcelable(CHOSEN_DIRECTORY); + if (newDataStorage != null) { + if (tmpManuallySpecifiedPath != null) { + String directory = tmpManuallySpecifiedPath; + tmpManuallySpecifiedPath = null; + newDataStorage.setDirectory(directory); + } + if (moveMaps) { + moveData(currentDataStorage, newDataStorage); + } else { + confirm(app, activity, newDataStorage, false); + } + } + } else if (resultData.containsKey(SelectFolderBottomSheet.TAG)) { + boolean pathChanged = resultData.getBoolean(PATH_CHANGED); + if (pathChanged) { + tmpManuallySpecifiedPath = resultData.getString(NEW_PATH); + if (tmpManuallySpecifiedPath != null) { + DataStorageMenuItem manuallySpecified = null; + try { + manuallySpecified = (DataStorageMenuItem) itemsHolder.getManuallySpecified().clone(); + manuallySpecified.setDirectory(tmpManuallySpecifiedPath); + } catch (CloneNotSupportedException e) { + return false; + } + ChangeDataStorageBottomSheet.showInstance(getFragmentManager(), MANUALLY_SPECIFIED, + currentDataStorage, manuallySpecified, this, false); + } + } + } + } else { + //show necessary dialog + String key = preference.getKey(); + if (key != null) { + DataStorageMenuItem newDataStorage = itemsHolder.getStorage(key); + if (newDataStorage != null) { + if (!currentDataStorage.getKey().equals(newDataStorage.getKey())) { + if (newDataStorage.getType() == OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT + && !DownloadActivity.hasPermissionToWriteExternalStorage(activity)) { + ActivityCompat.requestPermissions(activity, + new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, + DownloadActivity.PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); + } else if (key.equals(MANUALLY_SPECIFIED)) { + showFolderSelectionDialog(); + } else { + ChangeDataStorageBottomSheet.showInstance(getFragmentManager(), key, + currentDataStorage, newDataStorage, DataStorageFragment.this, false); + } + } + } + } + } + return false; + } + + @Override + protected void onBindPreferenceViewHolder(Preference preference, PreferenceViewHolder holder) { + super.onBindPreferenceViewHolder(preference, holder); + String key = preference.getKey(); + if (key == null) { + return; + } + View itemView = holder.itemView; + if (preference instanceof CheckBoxPreference) { + DataStorageMenuItem item = itemsHolder.getStorage(key); + if (item != null) { + TextView tvTitle = itemView.findViewById(android.R.id.title); + TextView tvSummary = itemView.findViewById(R.id.summary); + TextView tvAdditionalDescription = itemView.findViewById(R.id.additionalDescription); + ImageView ivIcon = itemView.findViewById(R.id.icon); + View divider = itemView.findViewById(R.id.divider); + View secondPart = itemView.findViewById(R.id.secondPart); + + tvTitle.setText(item.getTitle()); + String currentKey = item.getKey(); + boolean isCurrent = currentDataStorage.getKey().equals(currentKey); + + int defaultIconColor = isNightMode() ? R.color.icon_color_default_dark : R.color.icon_color_default_light; + int chosenIconColor = isNightMode() ? R.color.icon_color_osmand_dark : R.color.icon_color_osmand_light; + Drawable icon = app.getUIUtilities().getIcon(item.getIconResId(), + isCurrent ? chosenIconColor : defaultIconColor); + ivIcon.setImageDrawable(icon); + + if (currentKey.equals(MANUALLY_SPECIFIED)) { + tvSummary.setText(item.getDirectory()); + secondPart.setVisibility(View.GONE); + tvAdditionalDescription.setVisibility(View.GONE); + divider.setVisibility(View.GONE); + } else { + tvAdditionalDescription.setVisibility(View.VISIBLE); + divider.setVisibility(View.VISIBLE); + secondPart.setVisibility(View.VISIBLE); + String space = getSpaceDescription(item.getDirectory()); + tvSummary.setText(space); + if (currentKey.equals(INTERNAL_STORAGE)) { + tvAdditionalDescription.setText(item.getDescription()); + } else { + tvAdditionalDescription.setText(item.getDirectory()); + } + } + } + } else if (key.equals(CHANGE_DIRECTORY_BUTTON)) { + ImageView icon = itemView.findViewById(R.id.button_icon); + TextView title = itemView.findViewById(R.id.button_text); + int colorResId = isNightMode() ? R.color.active_color_primary_dark : R.color.active_color_primary_light; + int color = ContextCompat.getColor(app, colorResId); + Drawable drawable = UiUtilities.getColoredSelectableDrawable(app, color, 0.3f); + AndroidUtils.setBackground(itemView, drawable); + icon.setVisibility(View.INVISIBLE); + title.setText(R.string.shared_string_change); + } + } + + private void updateView(String key) { + //selection set up + for (CheckBoxPreference preference : dataStorageRadioButtonsGroup) { + String preferenceKey = preference.getKey(); + boolean checked = preferenceKey != null && preferenceKey.equals(key); + preference.setChecked(checked); + } + boolean visible = key.equals(MANUALLY_SPECIFIED); + changeButton.setVisible(visible); + } + + private void showFolderSelectionDialog() { + DataStorageMenuItem manuallySpecified = itemsHolder.getManuallySpecified(); + if (manuallySpecified != null) { + SelectFolderBottomSheet.showInstance(getFragmentManager(), manuallySpecified.getKey(), + manuallySpecified.getDirectory(), DataStorageFragment.this, + getString(R.string.storage_directory_manual), getString(R.string.paste_Osmand_data_folder_path), + getString(R.string.shared_string_select_folder), false); + } + } + + private void moveData(final DataStorageMenuItem currentStorage, final DataStorageMenuItem newStorage) { + File fromDirectory = new File(currentStorage.getDirectory()); + File toDirectory = new File(newStorage.getDirectory()); + @SuppressLint("StaticFieldLeak") + MoveFilesToDifferentDirectory task = new MoveFilesToDifferentDirectory(activity, fromDirectory, toDirectory) { + + private MessageFormat formatMb = new MessageFormat("{0, number,##.#} MB", Locale.US); + + @NonNull + private String getFormattedSize(long sizeBytes) { + int size = (int) ((sizeBytes + 512) >> 10); + if (size >= 0) { + if (size > 100) { + return formatMb.format(new Object[]{(float) size / (1 << 10)}); + } else { + return size + " kB"; + } + } + return ""; + } + + private void showResultsDialog() { + StringBuilder sb = new StringBuilder(); + Context ctx = activity.get(); + if (ctx == null) { + return; + } + int moved = getMovedCount(); + int copied = getCopiedCount(); + int failed = getFailedCount(); + sb.append(ctx.getString(R.string.files_moved, moved, getFormattedSize(getMovedSize()))).append("\n"); + if (copied > 0) { + sb.append(ctx.getString(R.string.files_copied, copied, getFormattedSize(getCopiedSize()))).append("\n"); + } + if (failed > 0) { + sb.append(ctx.getString(R.string.files_failed, failed, getFormattedSize(getFailedSize()))).append("\n"); + } + if (copied > 0 || failed > 0) { + int count = copied + failed; + sb.append(ctx.getString(R.string.files_present, count, getFormattedSize(getCopiedSize() + getFailedSize()), newStorage.getDirectory())); + } + AlertDialog.Builder bld = new AlertDialog.Builder(ctx); + bld.setMessage(sb.toString()); + bld.setPositiveButton(R.string.shared_string_restart, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + confirm(app, activity.get(), newStorage, true); + } + }); + bld.show(); + } + + @Override + protected void onPostExecute(Boolean result) { + super.onPostExecute(result); + OsmandActionBarActivity a = this.activity.get(); + if (a == null) { + return; + } + OsmandApplication app = a.getMyApplication(); + if (result) { + app.getResourceManager().resetStoreDirectory(); + // immediately proceed with change (to not loose where maps are currently located) + if (getCopiedCount() > 0 || getFailedCount() > 0) { + showResultsDialog(); + } else { + confirm(app, a, newStorage, false); + } + } else { + showResultsDialog(); + Toast.makeText(a, R.string.copying_osmand_file_failed, + Toast.LENGTH_SHORT).show(); + } + + } + }; + task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + + private void confirm(OsmandApplication app, OsmandActionBarActivity activity, DataStorageMenuItem newStorageDirectory, boolean silentRestart) { + String newDirectory = newStorageDirectory.getDirectory(); + int type = newStorageDirectory.getType(); + File newDirectoryFile = new File(newDirectory); + boolean wr = OsmandSettings.isWritable(newDirectoryFile); + if (wr) { + app.setExternalStorageDirectory(type, newDirectory); + reloadData(); + if (silentRestart) { + android.os.Process.killProcess(android.os.Process.myPid()); + } else { + app.restartApp(activity); + } + } else { + Toast.makeText(activity, R.string.specified_directiory_not_writeable, + Toast.LENGTH_LONG).show(); + } + updateAllSettings(); + } + + private String getSpaceDescription(String path) { + File dir = new File(path); + File dirParent = dir.getParentFile(); + while (!dir.exists() && dirParent != null) { + dir = dir.getParentFile(); + dirParent = dir.getParentFile(); + } + if (dir.exists()) { + DecimalFormat formatter = new DecimalFormat("#.##"); + return String.format(getString(R.string.data_storage_space_description), + formatter.format(AndroidUtils.getFreeSpaceGb(dir)), + formatter.format(AndroidUtils.getUsedSpaceGb(dir)), + formatter.format(AndroidUtils.getTotalSpaceGb(dir))); + } + return ""; + } + + protected void reloadData() { + new ReloadData(activity, getMyApplication()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null); + } + + public static class MoveFilesToDifferentDirectory extends AsyncTask { + + protected WeakReference activity; + private WeakReference context; + private File from; + private File to; + protected ProgressImplementation progress; + private Runnable runOnSuccess; + private int movedCount; + private long movedSize; + private int copiedCount; + private long copiedSize; + private int failedCount; + private long failedSize; + + public MoveFilesToDifferentDirectory(OsmandActionBarActivity activity, File from, File to) { + this.activity = new WeakReference<>(activity); + this.context = new WeakReference<>((Context) activity); + this.from = from; + this.to = to; + } + + public void setRunOnSuccess(Runnable runOnSuccess) { + this.runOnSuccess = runOnSuccess; + } + + public int getMovedCount() { + return movedCount; + } + + public int getCopiedCount() { + return copiedCount; + } + + public int getFailedCount() { + return failedCount; + } + + public long getMovedSize() { + return movedSize; + } + + public long getCopiedSize() { + return copiedSize; + } + + public long getFailedSize() { + return failedSize; + } + + @Override + protected void onPreExecute() { + Context ctx = context.get(); + if (context == null) { + return; + } + movedCount = 0; + copiedCount = 0; + failedCount = 0; + progress = ProgressImplementation.createProgressDialog( + ctx, ctx.getString(R.string.copying_osmand_files), + ctx.getString(R.string.copying_osmand_files_descr, to.getPath()), + ProgressDialog.STYLE_HORIZONTAL); + } + + @Override + protected void onPostExecute(Boolean result) { + Context ctx = context.get(); + if (ctx == null) { + return; + } + if (result != null) { + if (result.booleanValue() && runOnSuccess != null) { + runOnSuccess.run(); + } else if (!result.booleanValue()) { + Toast.makeText(ctx, R.string.shared_string_io_error, Toast.LENGTH_LONG).show(); + } + } + try { + if (progress.getDialog().isShowing()) { + progress.getDialog().dismiss(); + } + } catch (Exception e) { + //ignored + } + } + + private void movingFiles(File f, File t, int depth) throws IOException { + Context ctx = context.get(); + if (ctx == null) { + return; + } + if (depth <= 2) { + progress.startTask(ctx.getString(R.string.copying_osmand_one_file_descr, t.getName()), -1); + } + if (f.isDirectory()) { + t.mkdirs(); + File[] lf = f.listFiles(); + if (lf != null) { + for (int i = 0; i < lf.length; i++) { + if (lf[i] != null) { + movingFiles(lf[i], new File(t, lf[i].getName()), depth + 1); + } + } + } + f.delete(); + } else if (f.isFile()) { + if (t.exists()) { + Algorithms.removeAllFiles(t); + } + boolean rnm = false; + long fileSize = f.length(); + try { + rnm = f.renameTo(t); + movedCount++; + movedSize += fileSize; + } catch (RuntimeException e) { + } + if (!rnm) { + FileInputStream fin = new FileInputStream(f); + FileOutputStream fout = new FileOutputStream(t); + try { + progress.startTask(ctx.getString(R.string.copying_osmand_one_file_descr, t.getName()), (int) (f.length() / 1024)); + Algorithms.streamCopy(fin, fout, progress, 1024); + copiedCount++; + copiedSize += fileSize; + } catch (IOException e) { + failedCount++; + failedSize += fileSize; + } finally { + fin.close(); + fout.close(); + } + f.delete(); + } + } + if (depth <= 2) { + progress.finishTask(); + } + } + + @Override + protected Boolean doInBackground(Void... params) { + to.mkdirs(); + try { + movingFiles(from, to, 0); + } catch (IOException e) { + return false; + } + return true; + } + + } + + public static class ReloadData extends AsyncTask { + private WeakReference ctx; + protected ProgressImplementation progress; + private OsmandApplication app; + + public ReloadData(Context ctx, OsmandApplication app) { + this.ctx = new WeakReference<>(ctx); + this.app = app; + } + + @Override + protected void onPreExecute() { + Context c = ctx.get(); + if (c == null) { + return; + } + progress = ProgressImplementation.createProgressDialog(c, c.getString(R.string.loading_data), + c.getString(R.string.loading_data), ProgressDialog.STYLE_HORIZONTAL); + } + + @Override + protected void onPostExecute(Boolean result) { + try { + if (progress.getDialog().isShowing()) { + progress.getDialog().dismiss(); + } + } catch (Exception e) { + //ignored + } + } + + @Override + protected Boolean doInBackground(Void... params) { + app.getResourceManager().reloadIndexes(progress, new ArrayList()); + return true; + } + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java b/OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java new file mode 100644 index 0000000000..089bf5c448 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java @@ -0,0 +1,200 @@ +package net.osmand.plus.settings; + +import android.os.Build; + +import net.osmand.ValueHolder; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.OsmandSettings; +import net.osmand.plus.R; + +import java.io.File; +import java.util.ArrayList; + +public class DataStorageItemsHolder { + public final static String INTERNAL_STORAGE = "internal_storage"; + public final static String EXTERNAL_STORAGE = "external_storage"; + public final static String SHARED_STORAGE = "shared_storage"; + public final static String MULTIUSER_STORAGE = "multiuser_storage"; + public final static String MANUALLY_SPECIFIED = "manually_specified"; + + private ArrayList menuItems; + private DataStorageMenuItem currentDataStorage; + private DataStorageMenuItem manuallySpecified; + + private int currentStorageType; + private String currentStoragePath; + + private OsmandApplication app; + private OsmandSettings settings; + + private DataStorageItemsHolder(OsmandApplication app) { + this.app = app; + this.settings = app.getSettings(); + prepareData(); + } + + public static DataStorageItemsHolder refreshInfo(OsmandApplication app) { + return new DataStorageItemsHolder(app); + } + + private void prepareData() { + + if (app == null) { + return; + } + + if (settings.getExternalStorageDirectoryTypeV19() >= 0) { + currentStorageType = settings.getExternalStorageDirectoryTypeV19(); + } else { + ValueHolder vh = new ValueHolder(); + if (vh.value != null && vh.value >= 0) { + currentStorageType = vh.value; + } else { + currentStorageType = 0; + } + } + currentStoragePath = settings.getExternalStorageDirectory().getAbsolutePath(); + + menuItems = new ArrayList<>(); + + String path; + File dir; + int iconId; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + + //internal storage + path = settings.getInternalAppPath().getAbsolutePath(); + dir = new File(path); + iconId = R.drawable.ic_action_phone; + + DataStorageMenuItem internalStorageItem = DataStorageMenuItem.builder() + .buildKey(INTERNAL_STORAGE) + .buildTitle(getString(R.string.storage_directory_internal_app)) + .buildDirectory(path) + .buildDescription(getString(R.string.internal_app_storage_description)) + .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_INTERNAL_FILE) + .buildIconResId(iconId) + .build(); + addItem(internalStorageItem); + + //shared_storage + dir = settings.getDefaultInternalStorage(); + path = dir.getAbsolutePath(); + iconId = R.drawable.ic_action_phone; + + DataStorageMenuItem sharedStorageItem = DataStorageMenuItem.builder() + .buildKey(SHARED_STORAGE) + .buildTitle(getString(R.string.storage_directory_shared)) + .buildDirectory(path) + .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT) + .buildIconResId(iconId) + .build(); + addItem(sharedStorageItem); + + //external storage + File[] externals = app.getExternalFilesDirs(null); + if (externals != null) { + int i = 0; + for (File external : externals) { + if (external != null) { + ++i; + dir = external; + path = dir.getAbsolutePath(); + iconId = getIconForStorageType(dir); + DataStorageMenuItem externalStorageItem = DataStorageMenuItem.builder() + .buildKey(EXTERNAL_STORAGE + i) + .buildTitle(getString(R.string.storage_directory_external) + " " + i) + .buildDirectory(path) + .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_EXTERNAL_FILE) + .buildIconResId(iconId) + .build(); + addItem(externalStorageItem); + } + } + } + + //multi user storage + File[] obbDirs = app.getObbDirs(); + if (obbDirs != null) { + int i = 0; + for (File obb : obbDirs) { + if (obb != null) { + ++i; + dir = obb; + path = dir.getAbsolutePath(); + iconId = getIconForStorageType(dir); + DataStorageMenuItem multiuserStorageItem = DataStorageMenuItem.builder() + .buildKey(MULTIUSER_STORAGE + i) + .buildTitle(getString(R.string.storage_directory_multiuser) + " " + i) + .buildDirectory(path) + .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_OBB) + .buildIconResId(iconId) + .build(); + addItem(multiuserStorageItem); + } + } + } + } + + //manually specified storage + manuallySpecified = DataStorageMenuItem.builder() + .buildKey(MANUALLY_SPECIFIED) + .buildTitle(getString(R.string.storage_directory_manual)) + .buildDirectory(currentStoragePath) + .buildType(OsmandSettings.EXTERNAL_STORAGE_TYPE_SPECIFIED) + .buildIconResId(R.drawable.ic_action_folder) + .build(); + menuItems.add(manuallySpecified); + + if (currentDataStorage == null) { + currentDataStorage = manuallySpecified; + } + } + + private String getString(int resId) { + return app.getString(resId); + } + + public ArrayList getStorageItems() { + return menuItems; + } + + private int getIconForStorageType(File dir) { + return R.drawable.ic_action_folder; + } + + public DataStorageMenuItem getCurrentStorage() { + return currentDataStorage; + } + + private void addItem(DataStorageMenuItem item) { + if (currentStorageType == item.getType() && currentStoragePath.equals(item.getDirectory())) { + currentDataStorage = item; + } + menuItems.add(item); + } + + public DataStorageMenuItem getManuallySpecified() { + return manuallySpecified; + } + + public DataStorageMenuItem getStorage(String key) { + if (menuItems != null && key != null) { + for (DataStorageMenuItem menuItem : menuItems) { + if (key.equals(menuItem.getKey())) { + return menuItem; + } + } + } + return null; + } + + public int getCurrentType() { + return currentStorageType; + } + + public String getCurrentPath() { + return currentStoragePath; + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/settings/DataStorageMenuItem.java b/OsmAnd/src/net/osmand/plus/settings/DataStorageMenuItem.java new file mode 100644 index 0000000000..548150089d --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/settings/DataStorageMenuItem.java @@ -0,0 +1,169 @@ +package net.osmand.plus.settings; + +import android.os.Parcel; +import android.os.Parcelable; +import android.support.annotation.IdRes; + +public class DataStorageMenuItem implements Parcelable, Cloneable { + + private String key; + private int type; + private String title; + private String description; + private String directory; + @IdRes + private int iconResId; + + private DataStorageMenuItem(String key, int type, String title, String description, + String directory, int iconResId) { + this.key = key; + this.type = type; + this.title = title; + this.description = description; + this.directory = directory; + this.iconResId = iconResId; + } + + private DataStorageMenuItem(Parcel in) { + key = in.readString(); + type = in.readInt(); + title = in.readString(); + description = in.readString(); + directory = in.readString(); + } + + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + public String getDirectory() { + return directory; + } + + public int getIconResId() { + return iconResId; + } + + public String getKey() { + return key; + } + + public int getType() { + return type; + } + + public void setKey(String key) { + this.key = key; + } + + public void setType(int type) { + this.type = type; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setDirectory(String directory) { + this.directory = directory; + } + + public void setIconResId(int iconResId) { + this.iconResId = iconResId; + } + + public static DataStorageMenuItemBuilder builder() { + return new DataStorageMenuItemBuilder(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(key); + dest.writeInt(type); + dest.writeString(title); + dest.writeString(description); + dest.writeString(directory); + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + + @Override + public DataStorageMenuItem createFromParcel(Parcel source) { + return new DataStorageMenuItem(source); + } + + @Override + public DataStorageMenuItem[] newArray(int size) { + return new DataStorageMenuItem[size]; + } + }; + + public static class DataStorageMenuItemBuilder { + private String key; + private int type; + private String title; + private String description; + private String directory; + @IdRes + private int iconResId; + + public DataStorageMenuItemBuilder buildKey(String key) { + this.key = key; + return this; + } + + public DataStorageMenuItemBuilder buildType(int type) { + this.type = type; + return this; + } + + public DataStorageMenuItemBuilder buildTitle(String title) { + this.title = title; + return this; + } + + public DataStorageMenuItemBuilder buildDescription(String description) { + this.description = description; + return this; + } + + public DataStorageMenuItemBuilder buildDirectory(String directory) { + this.directory = directory; + return this; + } + + public DataStorageMenuItemBuilder buildIconResId(int iconResId) { + this.iconResId = iconResId; + return this; + } + + public DataStorageMenuItem build() { + return new DataStorageMenuItem(key, type, title, description, directory, iconResId); + } + } + + @Override + public Object clone() throws CloneNotSupportedException { + return DataStorageMenuItem.builder() + .buildKey(this.key) + .buildTitle(this.title) + .buildDescription(this.description) + .buildDirectory(this.directory) + .buildType(this.type) + .buildIconResId(this.iconResId) + .build(); + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java index d3709fbc3c..d39263ff02 100644 --- a/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java @@ -7,6 +7,7 @@ import android.support.v7.preference.Preference; import android.support.v7.preference.SwitchPreferenceCompat; import android.util.Pair; +import net.osmand.AndroidUtils; import net.osmand.plus.ApplicationMode; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -16,6 +17,9 @@ import net.osmand.plus.dialogs.SendAnalyticsBottomSheetDialogFragment; import net.osmand.plus.settings.preferences.ListPreferenceEx; import net.osmand.plus.settings.preferences.SwitchPreferenceEx; +import java.io.File; +import java.text.DecimalFormat; + public class GlobalSettingsFragment extends BaseSettingsFragment implements SendAnalyticsBottomSheetDialogFragment.OnSendAnalyticsPrefsUpdate, OnPreferenceChanged { @@ -137,6 +141,14 @@ public class GlobalSettingsFragment extends BaseSettingsFragment implements Send Preference externalStorageDir = (Preference) findPreference(OsmandSettings.EXTERNAL_STORAGE_DIR); externalStorageDir.setIcon(getContentIcon(R.drawable.ic_action_folder)); + DataStorageItemsHolder holder = DataStorageItemsHolder.refreshInfo(app); + DataStorageMenuItem currentStorage = holder.getCurrentStorage(); + File dir = new File(currentStorage.getDirectory()); + DecimalFormat formatter = new DecimalFormat("#.##"); + String summary = String.format(getString(R.string.data_storage_preference_summary), + currentStorage.getTitle(), + formatter.format(AndroidUtils.getUsedSpaceGb(dir))); + externalStorageDir.setSummary(summary); } private void setupSendAnonymousDataPref() { diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java new file mode 100644 index 0000000000..27016b7eac --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java @@ -0,0 +1,180 @@ +package net.osmand.plus.settings.bottomsheets; + +import android.content.Context; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.content.ContextCompat; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.style.ForegroundColorSpan; +import android.view.View; + +import net.osmand.PlatformUtil; +import net.osmand.plus.OsmandSettings; +import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; +import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; +import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; +import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; +import net.osmand.plus.settings.BaseSettingsFragment; +import net.osmand.plus.settings.DataStorageMenuItem; + +import org.apache.commons.logging.Log; + +import java.io.File; + +import static net.osmand.plus.settings.DataStorageItemsHolder.MANUALLY_SPECIFIED; + +public class ChangeDataStorageBottomSheet extends BasePreferenceBottomSheet { + + public static final String TAG = "ChangeDataStorageBottomSheet"; + + private static final Log LOG = PlatformUtil.getLog(ChangeDataStorageBottomSheet.class); + + private final static String CURRENT_DIRECTORY = "current_directory"; + private final static String NEW_DIRECTORY = "new_directory"; + + public final static String MOVE_DATA = "move_data"; + public final static String CHOSEN_DIRECTORY = "chosen_storage"; + + private DataStorageMenuItem currentDirectory; + private DataStorageMenuItem newDirectory; + + @Override + public void createMenuItems(Bundle savedInstanceState) { + + Context ctx = getContext(); + + if (savedInstanceState != null) { + currentDirectory = savedInstanceState.getParcelable(CURRENT_DIRECTORY); + newDirectory = savedInstanceState.getParcelable(NEW_DIRECTORY); + } + + if (ctx == null || currentDirectory == null || newDirectory == null) { + return; + } + + items.add(new TitleItem(getString(R.string.change_osmand_data_folder_question))); + + int textColorPrimary = nightMode ? R.color.text_color_primary_dark : R.color.text_color_primary_light; + int activeColor = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light; + CharSequence desc = null; + + File currentStorageFile = new File(currentDirectory.getDirectory()); + if ((!OsmandSettings.isWritable(currentStorageFile))) { + desc = String.format(getString(R.string.android_19_location_disabled), currentStorageFile.getAbsoluteFile()); + } else { + String from = currentDirectory.getKey().equals(MANUALLY_SPECIFIED) ? currentDirectory.getDirectory() : currentDirectory.getTitle(); + String to = newDirectory.getKey().equals(MANUALLY_SPECIFIED) ? newDirectory.getDirectory() : newDirectory.getTitle(); + String fullDescription = String.format(getString(R.string.change_data_storage_full_description), from, to); + SpannableStringBuilder coloredDescription = new SpannableStringBuilder( + fullDescription); + int startIndexFrom = fullDescription.indexOf(from); + int endIndexFrom = startIndexFrom + from.length(); + int startIndexTo = fullDescription.indexOf(to); + int endIndexTo = startIndexTo + to.length(); + coloredDescription.setSpan(new ForegroundColorSpan( + ContextCompat.getColor(ctx, activeColor)), + startIndexFrom, endIndexFrom, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + coloredDescription.setSpan(new ForegroundColorSpan( + ContextCompat.getColor(ctx, activeColor)), + startIndexTo, endIndexTo, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + desc = coloredDescription; + } + BottomSheetItemWithDescription description = (BottomSheetItemWithDescription) new BottomSheetItemWithDescription.Builder() + .setDescription(desc) + .setDescriptionColorId(textColorPrimary) + .setLayoutId(R.layout.bottom_sheet_item_description_long) + .create(); + items.add(description); + + //buttons + View mainView = View.inflate(ctx, R.layout.bottom_sheet_change_data_storage, null); + + View btnDontMoveView = mainView.findViewById(R.id.btnDontMove); + btnDontMoveView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + positiveButtonsClick(false); + } + }); + UiUtilities.setupDialogButton(nightMode, btnDontMoveView, UiUtilities.DialogButtonType.SECONDARY, getString(R.string.dont_move_maps), currentDirectory.getIconResId()); + + View btnMoveView = mainView.findViewById(R.id.btnMove); + btnMoveView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + positiveButtonsClick(true); + } + }); + UiUtilities.setupDialogButton(nightMode, btnMoveView, UiUtilities.DialogButtonType.PRIMARY, getString(R.string.move_maps_to_new_destination), R.drawable.ic_action_folder_move); + + View btnCloseView = mainView.findViewById(R.id.btnClose); + btnCloseView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + } + }); + UiUtilities.setupDialogButton(nightMode, btnCloseView, UiUtilities.DialogButtonType.SECONDARY, getString(R.string.shared_string_cancel), R.drawable.ic_action_undo_dark); + + BaseBottomSheetItem baseItem = new BaseBottomSheetItem.Builder() + .setCustomView(mainView) + .create(); + items.add(baseItem); + } + + public void setCurrentDirectory(DataStorageMenuItem currentDirectory) { + this.currentDirectory = currentDirectory; + } + + public void setNewDirectory(DataStorageMenuItem newDirectory) { + this.newDirectory = newDirectory; + } + + private void positiveButtonsClick(boolean moveData) { + Bundle bundle = new Bundle(); + bundle.putBoolean(TAG, true); + bundle.putParcelable(CHOSEN_DIRECTORY, newDirectory); + bundle.putBoolean(MOVE_DATA, moveData); + Fragment fragment = getTargetFragment(); + if (fragment instanceof BaseSettingsFragment) { + ((BaseSettingsFragment) fragment).onPreferenceChange(getPreference(), bundle); + } + dismiss(); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putParcelable(CURRENT_DIRECTORY, currentDirectory); + outState.putParcelable(NEW_DIRECTORY, newDirectory); + } + + @Override + protected boolean hideButtonsContainer() { + return true; + } + + public static boolean showInstance(FragmentManager fm, String prefId, DataStorageMenuItem currentDirectory, + DataStorageMenuItem newDirectory, Fragment target, boolean usedOnMap) { + try { + if (fm.findFragmentByTag(TAG) == null) { + Bundle args = new Bundle(); + args.putString(PREFERENCE_ID, prefId); + + ChangeDataStorageBottomSheet fragment = new ChangeDataStorageBottomSheet(); + fragment.setCurrentDirectory(currentDirectory); + fragment.setNewDirectory(newDirectory); + fragment.setTargetFragment(target, 0); + fragment.setUsedOnMap(usedOnMap); + fragment.show(fm, TAG); + return true; + } + } catch (RuntimeException e) { + LOG.error(e.getMessage()); + } + return false; + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java new file mode 100644 index 0000000000..c9efa0d21c --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java @@ -0,0 +1,198 @@ +package net.osmand.plus.settings.bottomsheets; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import net.osmand.PlatformUtil; +import net.osmand.plus.R; +import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; +import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; +import net.osmand.plus.settings.BaseSettingsFragment; + +import org.apache.commons.logging.Log; + +import static android.view.View.GONE; + +public class SelectFolderBottomSheet extends BasePreferenceBottomSheet { + + public static final String TAG = "SelectFolderBottomSheet"; + private static final Log LOG = PlatformUtil.getLog(SelectFolderBottomSheet.class); + private static final int CHOOSE_FOLDER_REQUEST_CODE = 0; + + private static final String EDIT_TEXT_PREFERENCE_KEY = "edit_text_preference_key"; + private static final String DIALOG_TITLE = "dialog_title"; + private static final String DESCRIPTION = "description"; + private static final String BTN_TITLE = "btn_title"; + private static final String ET_WAS_FOCUSED = "edit_text_was_focused"; + public static final String NEW_PATH = "path"; + public static final String PATH_CHANGED = "changed"; + + private EditText editText; + + private String currentPath; + private String dialogTitle; + private String btnTitle; + private String description; + private boolean etWasFocused; + + @Override + public void createMenuItems(Bundle savedInstanceState) { + final Context ctx = getContext(); + + String text = null; + if (savedInstanceState != null) { + String folderPath = savedInstanceState.getString(NEW_PATH); + if (folderPath != null) { + currentPath = folderPath; + } + text = savedInstanceState.getString(EDIT_TEXT_PREFERENCE_KEY); + dialogTitle = savedInstanceState.getString(DIALOG_TITLE); + description = savedInstanceState.getString(DESCRIPTION); + btnTitle = savedInstanceState.getString(BTN_TITLE); + etWasFocused = savedInstanceState.getBoolean(ET_WAS_FOCUSED); + } + + if (ctx == null || currentPath == null) { + return; + } + + if (dialogTitle != null) { + items.add(new TitleItem(dialogTitle)); + } + + View mainView = View.inflate(ctx, R.layout.bottom_sheet_select_folder, null); + + TextView tvDescription = mainView.findViewById(R.id.description); + TextView tvBtnTitle = mainView.findViewById(R.id.title); + editText = mainView.findViewById(R.id.text); + + View divider = mainView.findViewById(R.id.divider); + View btnOpenChoseDialog = mainView.findViewById(R.id.button); + +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { +// if (btnTitle != null) { +// tvBtnTitle.setText(btnTitle); +// int colorResId = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light; +// int color = ContextCompat.getColor(ctx, colorResId); +// Drawable drawable = UiUtilities.getColoredSelectableDrawable(ctx, color, 0.3f); +// AndroidUtils.setBackground(btnOpenChoseDialog, drawable); +// btnOpenChoseDialog.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// openDocumentTree(); +// } +// }); +// } +// } else { + divider.setVisibility(GONE); + btnOpenChoseDialog.setVisibility(GONE); +// } + + if (text != null) { + editText.setText(text); + } + + if (description != null) { + tvDescription.setText(description); + } + + editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (hasFocus && !etWasFocused) { + etWasFocused = true; + editText.setText(currentPath); + } + } + }); + + BaseBottomSheetItem baseItem = new BaseBottomSheetItem.Builder() + .setCustomView(mainView) + .create(); + items.add(baseItem); + + } + + public static boolean showInstance(FragmentManager fm, String prefId, String currentPath, Fragment target, + String dialogTitle, String description, String btnTitle, boolean usedOnMap) { + try { + if (fm.findFragmentByTag(TAG) == null) { + Bundle args = new Bundle(); + args.putString(PREFERENCE_ID, prefId); + + SelectFolderBottomSheet fragment = new SelectFolderBottomSheet(); + fragment.setCurrentPath(currentPath); + fragment.setTargetFragment(target, 0); + fragment.setDialogTitle(dialogTitle); + fragment.setDescription(description); + fragment.setBtnTitle(btnTitle); + fragment.setUsedOnMap(usedOnMap); + fragment.show(fm, TAG); + } + return true; + } catch (RuntimeException e) { + return false; + } + } + + @Override + protected int getDismissButtonTextId() { + return R.string.shared_string_close; + } + + @Override + protected int getRightBottomButtonTextId() { + return R.string.shared_string_apply; + } + + @Override + protected void onRightBottomButtonClick() { + Fragment fragment = getTargetFragment(); + if (fragment instanceof BaseSettingsFragment) { + String newPath = editText.getText().toString(); + if (!newPath.equals("")) { + boolean pathChanged = !newPath.equals(currentPath); + Bundle bundle = new Bundle(); + bundle.putBoolean(TAG, true); + bundle.putString(NEW_PATH, newPath); + bundle.putBoolean(PATH_CHANGED, pathChanged); + ((BaseSettingsFragment) fragment).onPreferenceChange(getPreference(), bundle); + } + } + dismiss(); + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putString(EDIT_TEXT_PREFERENCE_KEY, editText.getText().toString()); + outState.putString(NEW_PATH, currentPath); + outState.putString(DIALOG_TITLE, dialogTitle); + outState.putString(DESCRIPTION, description); + outState.putString(BTN_TITLE, btnTitle); + outState.putBoolean(ET_WAS_FOCUSED, etWasFocused); + } + + public void setCurrentPath(String currentPath) { + this.currentPath = currentPath; + } + + public void setDialogTitle(String dialogTitle) { + this.dialogTitle = dialogTitle; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setBtnTitle(String btnTitle) { + this.btnTitle = btnTitle; + } + +} \ No newline at end of file From a7bce38b52197b409e006e7d96c3cf7b2c1e31f8 Mon Sep 17 00:00:00 2001 From: Nazar Date: Mon, 7 Oct 2019 16:10:45 +0300 Subject: [PATCH 31/34] Fix 'data_storage_preference_summary' string --- OsmAnd/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 7889f194c2..e5245a671c 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -12,7 +12,7 @@ --> Move OsmAnd data files to the new destination?\n%1$s > %2$s - %1$s • Used %2$s GB + %1$s • Used %2$s GB Free %1$s • %2$s / %3$s GB Enter path to the folder Select folder From 0a7e416fb75de411787f18698d9c56a57c783063 Mon Sep 17 00:00:00 2001 From: Nazar Date: Mon, 7 Oct 2019 16:17:31 +0300 Subject: [PATCH 32/34] Fix 'data_storage_preference_summary' string --- OsmAnd/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index e5245a671c..7889f194c2 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -12,7 +12,7 @@ --> Move OsmAnd data files to the new destination?\n%1$s > %2$s - %1$s • Used %2$s GB + %1$s • Used %2$s GB Free %1$s • %2$s / %3$s GB Enter path to the folder Select folder From 86d5bea322f792861dcfd8d865cbb47f230b6415 Mon Sep 17 00:00:00 2001 From: Nazar Date: Mon, 7 Oct 2019 16:23:27 +0300 Subject: [PATCH 33/34] Fix setupDialogButton --- OsmAnd/src/net/osmand/plus/UiUtilities.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/UiUtilities.java b/OsmAnd/src/net/osmand/plus/UiUtilities.java index 9802be2854..e62507ce44 100644 --- a/OsmAnd/src/net/osmand/plus/UiUtilities.java +++ b/OsmAnd/src/net/osmand/plus/UiUtilities.java @@ -357,14 +357,16 @@ public class UiUtilities { textAndIconColorResId = nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light; break; } - ColorStateList colorStateList = ContextCompat.getColorStateList(ctx, textAndIconColorResId); - buttonTextView.setText(buttonText); - buttonTextView.setTextColor(colorStateList); - buttonTextView.setEnabled(buttonView.isEnabled()); - if (iconResId != INVALID_ID) { - Drawable icon = tintDrawable(ContextCompat.getDrawable(ctx, iconResId), ContextCompat.getColor(ctx, textAndIconColorResId)); - buttonTextView.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null); - buttonTextView.setCompoundDrawablePadding(AndroidUtils.dpToPx(ctx, ctx.getResources().getDimension(R.dimen.content_padding_half))); + if (textAndIconColorResId != INVALID_ID) { + ColorStateList colorStateList = ContextCompat.getColorStateList(ctx, textAndIconColorResId); + buttonTextView.setText(buttonText); + buttonTextView.setTextColor(colorStateList); + buttonTextView.setEnabled(buttonView.isEnabled()); + if (iconResId != INVALID_ID) { + Drawable icon = tintDrawable(ContextCompat.getDrawable(ctx, iconResId), ContextCompat.getColor(ctx, textAndIconColorResId)); + buttonTextView.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null); + buttonTextView.setCompoundDrawablePadding(AndroidUtils.dpToPx(ctx, ctx.getResources().getDimension(R.dimen.content_padding_half))); + } } } From 4c897624a61c31b1dc65ddcb4182017346eb4a94 Mon Sep 17 00:00:00 2001 From: xmd5a Date: Mon, 7 Oct 2019 19:51:40 +0300 Subject: [PATCH 34/34] Add strings --- OsmAnd/res/values/strings.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 7889f194c2..c51bd9f8c4 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -21,6 +21,24 @@ Move to the new destination Internal storage, hiden from user and other apps, so no one except OsmAnd can’t get access to your data Change data storage folder + Snow park + Sleigh + Sled + Hike + Connection + Skitour + Downhill + Nordic + Piste type + Novice + Easy + Intermediate + Advanced + Expert + Freeride + Extreme + Undefined + Piste difficulty Download detailed %s map, to view this area. By default Plugin settings