mirror of
https://codeberg.org/comaps/comaps
synced 2026-01-06 20:44:25 +00:00
Compare commits
48 Commits
release/20
...
pastk-ios-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aea784ddd7 | ||
|
|
52e9ddc038 | ||
|
|
bfffa1fff4 | ||
|
|
9f0290c0ec | ||
|
|
8a8a3c5a08 | ||
|
|
518747d503 | ||
|
|
5063b511ae | ||
|
|
fbe3f72fb1 | ||
|
|
872c0d3e15 | ||
|
|
9833918aac | ||
|
|
0000ec149c | ||
|
|
da3053f5fc | ||
|
|
5a0ff536a7 | ||
|
|
36f123ef25 | ||
|
|
01c2f02c86 | ||
|
|
4d702ec541 | ||
|
|
344cf6d709 | ||
|
|
14b3e8fc8f | ||
|
|
6d0daf6fe7 | ||
|
|
9b3507211f | ||
|
|
a406462549 | ||
|
|
897d7a253d | ||
|
|
b23c2ba3e3 | ||
|
|
705c715356 | ||
|
|
826ddba26f | ||
|
|
2492e8bda4 | ||
|
|
9e494ed8a5 | ||
|
|
1c8ac1f32a | ||
|
|
d0bb8c1c49 | ||
|
|
6c4503b0db | ||
|
|
a39b3a9921 | ||
|
|
8493ed369a | ||
|
|
2ded7e5e2b | ||
|
|
d9335c0b6c | ||
|
|
ebc5370052 | ||
|
|
0a96a23ca0 | ||
|
|
5b05a7ac71 | ||
|
|
31104eed4d | ||
|
|
0f2353aae6 | ||
|
|
d01b8aaab4 | ||
|
|
33f8e20f1b | ||
|
|
76d8396cb1 | ||
|
|
0f744e7cf2 | ||
|
|
5d990bdc19 | ||
|
|
1f2d70c720 | ||
|
|
76ffc99abd | ||
|
|
c9cbb64f12 | ||
|
|
c4722f7025 |
@@ -3,7 +3,6 @@ BasedOnStyle: Google
|
||||
|
||||
AccessModifierOffset: -2
|
||||
AlignAfterOpenBracket: Align
|
||||
AlignArrayOfStructures: Right
|
||||
AlignConsecutiveMacros: AcrossEmptyLinesAndComments
|
||||
AlignEscapedNewlines: LeftWithLastLine
|
||||
AlignOperands: AlignAfterOperator
|
||||
@@ -40,8 +39,10 @@ ColumnLimit: 120
|
||||
ConstructorInitializerIndentWidth: 2
|
||||
ContinuationIndentWidth: 4
|
||||
DerivePointerAlignment: false
|
||||
EmptyLineBeforeAccessModifier: Always
|
||||
IncludeBlocks: Preserve
|
||||
IndentAccessModifiers: false
|
||||
IndentCaseLabels: false
|
||||
IndentExternBlock: NoIndent
|
||||
InsertBraces: false
|
||||
InsertNewlineAtEOF: true
|
||||
@@ -49,6 +50,7 @@ LambdaBodyIndentation: OuterScope
|
||||
PackConstructorInitializers: CurrentLine
|
||||
PointerAlignment: Middle
|
||||
RemoveBracesLLVM: true
|
||||
RemoveSemicolon: true
|
||||
QualifierAlignment: Right
|
||||
SpacesInContainerLiterals: false
|
||||
Standard: Latest
|
||||
|
||||
8
.clang-format-ignore
Normal file
8
.clang-format-ignore
Normal file
@@ -0,0 +1,8 @@
|
||||
# Files that should not be formatted.
|
||||
./3party
|
||||
# A patched copy of the https://registry.khronos.org/OpenGL/api/GLES3/gl3.h
|
||||
./android/sdk/src/main/cpp/app/organicmaps/sdk/opengl/gl3stub.h
|
||||
# Formatting it leads to crashes in runtime. Newer protobuf may fix it.
|
||||
./libs/indexer/drules_struct.pb.cc
|
||||
# No need to format this 3party tool.
|
||||
tools/osmctools/*.c
|
||||
@@ -3,7 +3,7 @@ on:
|
||||
workflow_dispatch: # Manual trigger
|
||||
pull_request:
|
||||
paths:
|
||||
- qt/res/app.comaps.comaps.desktop
|
||||
- qt/res/linux/app.comaps.comaps.desktop
|
||||
- .forgejo/workflows/desktop-file-check.yaml # Run check on self change
|
||||
|
||||
jobs:
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 1
|
||||
sparse-checkout: |
|
||||
qt/res/app.comaps.comaps.desktop
|
||||
qt/res/linux/app.comaps.comaps.desktop
|
||||
|
||||
- name: Install desktop-file-validate tool
|
||||
shell: bash
|
||||
@@ -27,4 +27,4 @@ jobs:
|
||||
|
||||
- name: Validate desktop file
|
||||
shell: bash
|
||||
run: desktop-file-validate qt/res/app.comaps.comaps.desktop && echo "Successfully validated .desktop file"
|
||||
run: desktop-file-validate qt/res/linux/app.comaps.comaps.desktop && echo "Successfully validated .desktop file"
|
||||
|
||||
5
.github/workflows/android-check.yaml
vendored
5
.github/workflows/android-check.yaml
vendored
@@ -23,6 +23,10 @@ jobs:
|
||||
shell: bash
|
||||
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
||||
|
||||
- name: Configure repository
|
||||
shell: bash
|
||||
run: SKIP_GENERATE_SYMBOLS=1 ./configure.sh
|
||||
|
||||
- name: Lint
|
||||
shell: bash
|
||||
working-directory: android
|
||||
@@ -62,6 +66,7 @@ jobs:
|
||||
libxinerama-dev \
|
||||
libxcursor-dev \
|
||||
libxi-dev \
|
||||
python3-protobuf \
|
||||
zlib1g-dev
|
||||
|
||||
- name: Checkout sources
|
||||
|
||||
43
.github/workflows/clang-format.yaml
vendored
43
.github/workflows/clang-format.yaml
vendored
@@ -1,43 +0,0 @@
|
||||
name: clang-format
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
paths:
|
||||
- 'android/app/src/**.java'
|
||||
- '.clang-format'
|
||||
- '.github/workflows/clang-format.yml'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
paths:
|
||||
- 'android/app/src/**.java'
|
||||
- '.clang-format'
|
||||
- '.github/workflows/clang-format.yml'
|
||||
|
||||
jobs:
|
||||
check-formatting:
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true # TODO(AB): Remove this line when ready to enforce formatting.
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install clang-format
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y clang-format-19
|
||||
clang-format-19 --version
|
||||
|
||||
- name: Check Java formatting
|
||||
run: |
|
||||
JAVA_FILES=($(find android/app/src -name '*.java'))
|
||||
|
||||
FORMATTING_ISSUES=$(clang-format-19 --dry-run --Werror $JAVA_FILES 2>&1 || true)
|
||||
|
||||
if [ -n "$FORMATTING_ISSUES" ]; then
|
||||
echo "$FORMATTING_ISSUES"
|
||||
echo ""
|
||||
echo "To fix formatting, please run:"
|
||||
echo " clang-format -i <file>"
|
||||
exit 1
|
||||
fi
|
||||
51
.github/workflows/code-style-check.yaml
vendored
Normal file
51
.github/workflows/code-style-check.yaml
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
name: Code style check
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
paths: # Should stay in sync with tools/unix/clang-format.sh
|
||||
- '.github/workflows/code-style-check.yaml'
|
||||
- 'android/app/src/**.java'
|
||||
- 'android/sdk/src/**.java'
|
||||
- 'android/sdk/src/main/cpp/**.[ch]pp'
|
||||
- 'dev_sandbox/**.[ch]pp'
|
||||
- 'generator/**.[ch]pp'
|
||||
- 'iphone/**.[ch]pp'
|
||||
- 'iphone/**.[hm]'
|
||||
- 'iphone/**.mm'
|
||||
- 'libs/**.[ch]pp'
|
||||
- 'libs/**.[hm]'
|
||||
- '!libs/indexer/drules_struct.pb.h'
|
||||
- 'libs/**.mm'
|
||||
- 'qt/**.[ch]pp'
|
||||
- 'qt/**.h'
|
||||
- 'tools/**.[ch]pp'
|
||||
- '.clang-format'
|
||||
- '.clang-format-ignore'
|
||||
|
||||
jobs:
|
||||
code-style-check:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Install clang-format
|
||||
run: |
|
||||
sudo apt purge -y clang-format-18 # Remove default old version of clang-format
|
||||
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
|
||||
echo 'deb http://apt.llvm.org/noble/ llvm-toolchain-noble-20 main' | sudo tee /etc/apt/sources.list.d/llvm-toolchain-noble-20.list
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y clang-format-20
|
||||
sudo update-alternatives --force --install /usr/bin/clang-format clang-format /usr/bin/clang-format-20 10
|
||||
sudo update-alternatives --force --install /usr/bin/git-clang-format git-clang-format /usr/bin/git-clang-format-20 10
|
||||
clang-format --version
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Check code style
|
||||
run: tools/unix/clang-format.sh
|
||||
|
||||
- name: Post clang-format comments
|
||||
if: failure()
|
||||
uses: reviewdog/action-suggester@v1.21.0
|
||||
with:
|
||||
tool_name: clang-format
|
||||
fail_level: error
|
||||
1
.github/workflows/ios-check.yaml
vendored
1
.github/workflows/ios-check.yaml
vendored
@@ -30,6 +30,7 @@ jobs:
|
||||
run: |
|
||||
brew install qt \
|
||||
optipng
|
||||
pip3 install "protobuf<3.21" --break-system-packages
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v4
|
||||
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -50,7 +50,7 @@ omim.sdf
|
||||
*.suo
|
||||
*.aps
|
||||
*.rc
|
||||
!qt/res/windows.rc
|
||||
!qt/res/windows/windows.rc
|
||||
*.pdb
|
||||
out/
|
||||
|
||||
|
||||
Submodule 3party/Vulkan-Headers updated: 595c8d4794...f69f0433ba
Submodule 3party/protobuf/protobuf updated: a6189acd18...9442c12e86
@@ -185,7 +185,7 @@ if (NOT PLATFORM_IPHONE AND NOT PLATFORM_ANDROID)
|
||||
endif()
|
||||
|
||||
# To allow #include "base/file_name.hpp" in all sources.
|
||||
include_directories(${CMAKE_HOME_DIRECTORY})
|
||||
include_directories("${CMAKE_HOME_DIRECTORY}" "${CMAKE_HOME_DIRECTORY}/libs" "${CMAKE_HOME_DIRECTORY}/tools")
|
||||
|
||||
if (USE_PCH)
|
||||
message(STATUS "Precompiled headers are ON")
|
||||
@@ -227,49 +227,22 @@ endif()
|
||||
# Used in qt/ and shaders/
|
||||
find_package(Python3 REQUIRED COMPONENTS Interpreter)
|
||||
|
||||
add_subdirectory(base)
|
||||
add_subdirectory(coding)
|
||||
add_subdirectory(descriptions)
|
||||
add_subdirectory(drape)
|
||||
add_subdirectory(drape_frontend)
|
||||
add_subdirectory(editor)
|
||||
add_subdirectory(ge0)
|
||||
add_subdirectory(generator/mwm_diff)
|
||||
add_subdirectory(geometry)
|
||||
add_subdirectory(indexer)
|
||||
add_subdirectory(kml)
|
||||
add_subdirectory(map)
|
||||
add_subdirectory(cppjansson)
|
||||
add_subdirectory(platform)
|
||||
add_subdirectory(routing)
|
||||
add_subdirectory(routing_common)
|
||||
add_subdirectory(search)
|
||||
add_subdirectory(shaders)
|
||||
add_subdirectory(storage)
|
||||
add_subdirectory(tracking)
|
||||
add_subdirectory(traffic)
|
||||
add_subdirectory(transit)
|
||||
add_subdirectory(libs)
|
||||
|
||||
if (PLATFORM_DESKTOP)
|
||||
omim_add_tool_subdirectory(feature_list)
|
||||
add_subdirectory(dev_sandbox)
|
||||
add_subdirectory(generator)
|
||||
add_subdirectory(openlr)
|
||||
add_subdirectory(poly_borders)
|
||||
omim_add_tool_subdirectory(topography_generator)
|
||||
add_subdirectory(track_analyzing)
|
||||
omim_add_tool_subdirectory(track_generator)
|
||||
add_subdirectory(tools)
|
||||
if (NOT SKIP_QT_GUI)
|
||||
add_subdirectory(qt)
|
||||
omim_add_tool_subdirectory(skin_generator)
|
||||
endif()
|
||||
if (GENERATOR_TOOL)
|
||||
add_compile_options(-march=native -mtune=native)
|
||||
message(STATUS "target CPU optimizations enabled, produced binaries will NOT work on a different CPU")
|
||||
endif()
|
||||
add_subdirectory(dev_sandbox)
|
||||
endif()
|
||||
|
||||
omim_add_test_subdirectory(qt_tstfrm)
|
||||
omim_add_test_subdirectory(libs/qt_tstfrm)
|
||||
|
||||
if (PLATFORM_ANDROID)
|
||||
add_subdirectory(android/sdk/src/main/cpp)
|
||||
|
||||
@@ -140,7 +140,7 @@ There is a dedicated [Zulip](https://codeberg.org/comaps/Governance/src/branch/m
|
||||
|
||||
## 💸 Funding
|
||||
|
||||
CoMaps is free. To stay that way, it relies on your support.
|
||||
CoMaps is free. To fund development, we rely on your voluntary support ♥️
|
||||
Donate via [OpenCollective](https://opencollective.com/comaps/donate) or [Liberapay](https://liberapay.com/CoMaps).
|
||||
The project's financial information is completely open and transparent at [our Open Collective](https://opencollective.com/comaps).
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
version: 2025.08.13-8-FDroid+25081308
|
||||
version: 2025.03.02-7-FDroid+25030207
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
<!-- Requiring "android.hardware.touchscreen" here breaks DeX mode -->
|
||||
<uses-feature
|
||||
android:glEsVersion="0x00020000"
|
||||
android:glEsVersion="0x00030000"
|
||||
android:required="true"/>
|
||||
<uses-feature
|
||||
android:name="android.hardware.wifi"
|
||||
|
||||
@@ -155,9 +155,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
showMap();
|
||||
return;
|
||||
|
||||
case CountryItem.STATUS_FAILED:
|
||||
MapManager.showError(DownloadResourcesLegacyActivity.this, item, null);
|
||||
return;
|
||||
case CountryItem.STATUS_FAILED: MapManager.showError(DownloadResourcesLegacyActivity.this, item, null); return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,10 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
public class MapFragment extends BaseMwmFragment implements View.OnTouchListener, SurfaceHolder.Callback
|
||||
{
|
||||
private static final String TAG = MapFragment.class.getSimpleName();
|
||||
private final Map mMap = new Map(DisplayType.Device);
|
||||
|
||||
@SuppressWarnings("NonNullFieldNotInitialized")
|
||||
@NonNull
|
||||
private Map mMap;
|
||||
|
||||
public void updateCompassOffset(int offsetX, int offsetY)
|
||||
{
|
||||
@@ -84,6 +87,7 @@ public class MapFragment extends BaseMwmFragment implements View.OnTouchListener
|
||||
{
|
||||
Logger.d(TAG);
|
||||
super.onAttach(context);
|
||||
mMap = new Map(DisplayType.Device, MwmApplication.from(requireContext()).getLocationHelper());
|
||||
mMap.setMapRenderingListener((MapRenderingListener) context);
|
||||
mMap.setCallbackUnsupported(this::reportUnsupported);
|
||||
}
|
||||
|
||||
@@ -82,7 +82,6 @@ import app.organicmaps.routing.ManageRouteBottomSheet;
|
||||
import app.organicmaps.routing.NavigationController;
|
||||
import app.organicmaps.routing.NavigationService;
|
||||
import app.organicmaps.routing.RoutingBottomMenuListener;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.routing.RoutingErrorDialogFragment;
|
||||
import app.organicmaps.routing.RoutingPlanFragment;
|
||||
import app.organicmaps.routing.RoutingPlanInplaceController;
|
||||
@@ -108,6 +107,7 @@ import app.organicmaps.sdk.location.SensorListener;
|
||||
import app.organicmaps.sdk.location.TrackRecorder;
|
||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesState;
|
||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.routing.RoutingOptions;
|
||||
import app.organicmaps.sdk.search.SearchEngine;
|
||||
import app.organicmaps.sdk.settings.RoadType;
|
||||
@@ -115,7 +115,6 @@ import app.organicmaps.sdk.settings.UnitLocale;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.LocationUtils;
|
||||
import app.organicmaps.sdk.util.PowerManagment;
|
||||
import app.organicmaps.sdk.util.ThemeSwitcher;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import app.organicmaps.sdk.widget.placepage.PlacePageData;
|
||||
@@ -125,6 +124,7 @@ import app.organicmaps.search.SearchFragment;
|
||||
import app.organicmaps.settings.DrivingOptionsActivity;
|
||||
import app.organicmaps.settings.SettingsActivity;
|
||||
import app.organicmaps.util.SharingUtils;
|
||||
import app.organicmaps.util.ThemeSwitcher;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
||||
@@ -1223,22 +1223,23 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
|
||||
private void onIsolinesStateChanged(@NonNull IsolinesState type)
|
||||
{
|
||||
if (type != IsolinesState.EXPIREDDATA)
|
||||
if (type == IsolinesState.NODATA)
|
||||
{
|
||||
type.activate(this, findViewById(R.id.coordinator), findViewById(R.id.menu_frame));
|
||||
return;
|
||||
Toast.makeText(this, R.string.isolines_location_error_dialog, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
dismissAlertDialog();
|
||||
if (type == IsolinesState.EXPIREDDATA)
|
||||
{
|
||||
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
||||
.setTitle(R.string.downloader_update_maps)
|
||||
.setMessage(R.string.isolines_activation_error_dialog)
|
||||
.setPositiveButton(R.string.ok,
|
||||
(dialog, which) -> startActivity(new Intent(this, DownloaderActivity.class)))
|
||||
.setPositiveButton(
|
||||
R.string.ok, (dialog, which) -> startActivity(new Intent(this, DownloaderActivity.class)))
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setOnDismissListener(dialog -> mAlertDialog = null)
|
||||
.show();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onNewIntent(Intent intent)
|
||||
|
||||
@@ -18,7 +18,6 @@ import app.organicmaps.background.OsmUploadWork;
|
||||
import app.organicmaps.downloader.DownloaderNotifier;
|
||||
import app.organicmaps.location.TrackRecordingService;
|
||||
import app.organicmaps.routing.NavigationService;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.Map;
|
||||
import app.organicmaps.sdk.OrganicMaps;
|
||||
import app.organicmaps.sdk.display.DisplayManager;
|
||||
@@ -28,9 +27,11 @@ import app.organicmaps.sdk.location.SensorHelper;
|
||||
import app.organicmaps.sdk.location.TrackRecorder;
|
||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
||||
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.ConnectionState;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import app.organicmaps.util.ThemeSwitcher;
|
||||
import app.organicmaps.util.Utils;
|
||||
import java.io.IOException;
|
||||
import java.lang.ref.WeakReference;
|
||||
@@ -133,6 +134,8 @@ public class MwmApplication extends Application implements Application.ActivityL
|
||||
public boolean initOrganicMaps(@NonNull Runnable onComplete) throws IOException
|
||||
{
|
||||
return mOrganicMaps.init(() -> {
|
||||
ThemeSwitcher.INSTANCE.initialize(this);
|
||||
ThemeSwitcher.INSTANCE.restart(false);
|
||||
ProcessLifecycleOwner.get().getLifecycle().addObserver(mProcessLifecycleObserver);
|
||||
onComplete.run();
|
||||
});
|
||||
|
||||
@@ -35,6 +35,7 @@ import app.organicmaps.sdk.bookmarks.data.BookmarkSharingResult;
|
||||
import app.organicmaps.sdk.bookmarks.data.CategoryDataSource;
|
||||
import app.organicmaps.sdk.bookmarks.data.Icon;
|
||||
import app.organicmaps.sdk.bookmarks.data.KmlFileType;
|
||||
import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
|
||||
import app.organicmaps.sdk.bookmarks.data.SortedBlock;
|
||||
import app.organicmaps.sdk.bookmarks.data.Track;
|
||||
import app.organicmaps.sdk.search.BookmarkSearchListener;
|
||||
@@ -592,7 +593,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
||||
if (mTrack == null)
|
||||
return;
|
||||
final Bundle args = new Bundle();
|
||||
args.putInt(BookmarkColorDialogFragment.ICON_TYPE, Icon.getColorPosition(mTrack.getColor()));
|
||||
args.putInt(BookmarkColorDialogFragment.ICON_COLOR, PredefinedColors.getPredefinedColorIndex(mTrack.getColor()));
|
||||
final FragmentManager manager = getChildFragmentManager();
|
||||
String className = BookmarkColorDialogFragment.class.getName();
|
||||
final FragmentFactory factory = manager.getFragmentFactory();
|
||||
@@ -601,7 +602,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
||||
dialogFragment.setArguments(args);
|
||||
dialogFragment.setOnColorSetListener((colorPos) -> {
|
||||
int from = mTrack.getColor();
|
||||
int to = BookmarkManager.ICONS.get(colorPos).argb();
|
||||
int to = PredefinedColors.getColor(colorPos);
|
||||
if (from == to)
|
||||
return;
|
||||
BookmarkManager.INSTANCE.changeTrackColor(mTrack.getTrackId(), to);
|
||||
|
||||
@@ -6,19 +6,26 @@ import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ArrayAdapter;
|
||||
import androidx.annotation.DrawableRes;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.bookmarks.data.Icon;
|
||||
import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
public class IconsAdapter extends ArrayAdapter<Icon>
|
||||
public class ColorsAdapter extends ArrayAdapter<Integer>
|
||||
{
|
||||
@PredefinedColors.Color
|
||||
private int mCheckedIconColor;
|
||||
|
||||
public IconsAdapter(Context context, List<Icon> list)
|
||||
@DrawableRes
|
||||
private final int mIconResId;
|
||||
|
||||
public ColorsAdapter(Context context, List<Integer> list, @DrawableRes int iconResId)
|
||||
{
|
||||
super(context, 0, 0, list);
|
||||
mIconResId = iconResId;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -35,19 +42,19 @@ public class IconsAdapter extends ArrayAdapter<Icon>
|
||||
else
|
||||
holder = (SpinnerViewHolder) convertView.getTag();
|
||||
|
||||
final Icon icon = getItem(position);
|
||||
@PredefinedColors.Color
|
||||
final int color = Objects.requireNonNull(getItem(position));
|
||||
|
||||
Drawable circle;
|
||||
if (icon.getColor() == mCheckedIconColor)
|
||||
if (color == mCheckedIconColor)
|
||||
{
|
||||
circle = Graphics.drawCircleAndImage(getItem(position).argb(), R.dimen.track_circle_size,
|
||||
app.organicmaps.sdk.R.drawable.ic_bookmark_none, R.dimen.bookmark_icon_size,
|
||||
getContext());
|
||||
circle = Graphics.drawCircleAndImage(PredefinedColors.getColor(mCheckedIconColor), R.dimen.track_circle_size,
|
||||
mIconResId, R.dimen.bookmark_icon_size, getContext());
|
||||
}
|
||||
else
|
||||
{
|
||||
circle =
|
||||
Graphics.drawCircle(getItem(position).argb(), R.dimen.select_color_circle_size, getContext().getResources());
|
||||
circle = Graphics.drawCircle(PredefinedColors.getColor(color), R.dimen.select_color_circle_size,
|
||||
getContext().getResources());
|
||||
}
|
||||
holder.icon.setImageDrawable(circle);
|
||||
return convertView;
|
||||
@@ -26,7 +26,6 @@ import app.organicmaps.car.util.CurrentCountryChangedListener;
|
||||
import app.organicmaps.car.util.IntentUtils;
|
||||
import app.organicmaps.car.util.ThemeUtils;
|
||||
import app.organicmaps.car.util.UserActionRequired;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.PlacePageActivationListener;
|
||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
@@ -34,6 +33,7 @@ import app.organicmaps.sdk.display.DisplayChangedListener;
|
||||
import app.organicmaps.sdk.display.DisplayManager;
|
||||
import app.organicmaps.sdk.display.DisplayType;
|
||||
import app.organicmaps.sdk.location.LocationState;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.LocationUtils;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
|
||||
@@ -27,8 +27,11 @@ public class SurfaceRenderer implements DefaultLifecycleObserver, SurfaceCallbac
|
||||
{
|
||||
private static final String TAG = SurfaceRenderer.class.getSimpleName();
|
||||
|
||||
@NonNull
|
||||
private final CarContext mCarContext;
|
||||
private final Map mMap = new Map(Car);
|
||||
|
||||
@NonNull
|
||||
private final Map mMap;
|
||||
|
||||
@NonNull
|
||||
private Rect mVisibleArea = new Rect();
|
||||
@@ -42,6 +45,7 @@ public class SurfaceRenderer implements DefaultLifecycleObserver, SurfaceCallbac
|
||||
{
|
||||
Logger.d(TAG, "SurfaceRenderer()");
|
||||
mCarContext = carContext;
|
||||
mMap = new Map(Car, MwmApplication.from(mCarContext).getLocationHelper());
|
||||
mIsRunning = true;
|
||||
lifecycle.addObserver(this);
|
||||
mMap.setMapRenderingListener(this);
|
||||
|
||||
@@ -28,11 +28,11 @@ import app.organicmaps.car.util.RoutingUtils;
|
||||
import app.organicmaps.car.util.ThemeUtils;
|
||||
import app.organicmaps.car.util.UiHelpers;
|
||||
import app.organicmaps.routing.NavigationService;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.location.LocationHelper;
|
||||
import app.organicmaps.sdk.location.LocationListener;
|
||||
import app.organicmaps.sdk.routing.JunctionInfo;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.sound.TtsPlayer;
|
||||
import app.organicmaps.sdk.util.LocationUtils;
|
||||
|
||||
@@ -35,11 +35,11 @@ import app.organicmaps.car.util.OnBackPressedCallback;
|
||||
import app.organicmaps.car.util.RoutingHelpers;
|
||||
import app.organicmaps.car.util.UiHelpers;
|
||||
import app.organicmaps.routing.ResultCodesHelper;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.Router;
|
||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
import app.organicmaps.sdk.bookmarks.data.Metadata;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import java.util.Objects;
|
||||
|
||||
@@ -7,9 +7,9 @@ import androidx.car.app.CarContext;
|
||||
import androidx.car.app.ScreenManager;
|
||||
import app.organicmaps.car.screens.download.DownloadMapsScreen;
|
||||
import app.organicmaps.car.screens.download.DownloadMapsScreenBuilder;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
|
||||
public class CurrentCountryChangedListener implements MapManager.CurrentCountryChangedListener
|
||||
{
|
||||
|
||||
@@ -15,13 +15,13 @@ import app.organicmaps.car.CarAppService;
|
||||
import app.organicmaps.car.SurfaceRenderer;
|
||||
import app.organicmaps.car.screens.NavigationScreen;
|
||||
import app.organicmaps.car.screens.search.SearchScreen;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.Map;
|
||||
import app.organicmaps.sdk.api.ParsedSearchRequest;
|
||||
import app.organicmaps.sdk.api.RequestType;
|
||||
import app.organicmaps.sdk.display.DisplayManager;
|
||||
import app.organicmaps.sdk.display.DisplayType;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
|
||||
public final class IntentUtils
|
||||
|
||||
@@ -8,8 +8,8 @@ import androidx.annotation.StringRes;
|
||||
import androidx.annotation.UiThread;
|
||||
import androidx.car.app.CarContext;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.MapStyle;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
|
||||
public final class ThemeUtils
|
||||
{
|
||||
|
||||
@@ -20,9 +20,9 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
||||
|
||||
@@ -24,8 +24,8 @@ import app.organicmaps.widget.PlaceholderView;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class DownloaderFragment extends BaseMwmRecyclerFragment<DownloaderAdapter>
|
||||
implements MenuBottomSheetFragment.MenuBottomSheetInterface
|
||||
public class DownloaderFragment
|
||||
extends BaseMwmRecyclerFragment<DownloaderAdapter> implements MenuBottomSheetFragment.MenuBottomSheetInterface
|
||||
{
|
||||
private DownloaderToolbarController mToolbarController;
|
||||
|
||||
@@ -153,7 +153,8 @@ public class DownloaderFragment extends BaseMwmRecyclerFragment<DownloaderAdapte
|
||||
|
||||
mBottomPanel = new BottomPanel(this, view);
|
||||
mToolbarController = new DownloaderToolbarController(view, requireActivity(), this);
|
||||
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), mToolbarController.getBackPressedCallback());
|
||||
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
|
||||
mToolbarController.getBackPressedCallback());
|
||||
|
||||
update();
|
||||
}
|
||||
@@ -195,7 +196,8 @@ public class DownloaderFragment extends BaseMwmRecyclerFragment<DownloaderAdapte
|
||||
{
|
||||
if (mAdapter == null)
|
||||
mAdapter = new DownloaderAdapter(this);
|
||||
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), mAdapter.getBackPressedCallback());
|
||||
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
|
||||
mAdapter.getBackPressedCallback());
|
||||
|
||||
return mAdapter;
|
||||
}
|
||||
|
||||
@@ -9,9 +9,9 @@ import androidx.core.view.ViewCompat;
|
||||
import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.ConnectionState;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
|
||||
@@ -87,8 +87,8 @@ public class AdvancedTimetableFragment extends BaseMwmFragment implements View.O
|
||||
private void setExampleDrawables(@DrawableRes int left, @DrawableRes int right)
|
||||
{
|
||||
mExamplesTitle.setCompoundDrawablesRelativeWithIntrinsicBounds(
|
||||
Graphics.tint(requireActivity(), left, androidx.appcompat.R.attr.colorAccent), null,
|
||||
Graphics.tint(requireActivity(), right, androidx.appcompat.R.attr.colorAccent), null);
|
||||
Graphics.tint(requireActivity(), left, com.google.android.material.R.attr.colorSecondary), null,
|
||||
Graphics.tint(requireActivity(), right, com.google.android.material.R.attr.colorSecondary), null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -20,13 +20,13 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmFragment;
|
||||
import app.organicmaps.dialog.EditTextDialogFragment;
|
||||
import app.organicmaps.editor.data.TimeFormatUtils;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.bookmarks.data.Metadata;
|
||||
import app.organicmaps.sdk.editor.Editor;
|
||||
import app.organicmaps.sdk.editor.OpeningHours;
|
||||
import app.organicmaps.sdk.editor.data.LocalizedName;
|
||||
import app.organicmaps.sdk.editor.data.LocalizedStreet;
|
||||
import app.organicmaps.editor.data.TimeFormatUtils;
|
||||
import app.organicmaps.sdk.editor.data.Timetable;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
|
||||
@@ -292,8 +292,8 @@ public class EditorHostFragment
|
||||
editMapObject();
|
||||
}
|
||||
case STREET ->
|
||||
setStreet(((StreetFragment) getChildFragmentManager().findFragmentByTag(StreetFragment.class.getName()))
|
||||
.getStreet());
|
||||
setStreet(
|
||||
((StreetFragment) getChildFragmentManager().findFragmentByTag(StreetFragment.class.getName())).getStreet());
|
||||
case CUISINE ->
|
||||
{
|
||||
String[] cuisines =
|
||||
|
||||
@@ -9,7 +9,9 @@ import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.editor.data.FeatureCategory;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||
@@ -21,6 +23,12 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
||||
private final FeatureCategoryFragment mFragment;
|
||||
private final FeatureCategory mSelectedCategory;
|
||||
|
||||
public interface FooterListener
|
||||
{
|
||||
void onNoteTextChanged(String newText);
|
||||
void onSendNoteClicked();
|
||||
}
|
||||
|
||||
public FeatureCategoryAdapter(@NonNull FeatureCategoryFragment host, @NonNull FeatureCategory[] categories,
|
||||
@Nullable FeatureCategory category)
|
||||
{
|
||||
@@ -57,7 +65,8 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
||||
case TYPE_FOOTER ->
|
||||
{
|
||||
return new FooterViewHolder(
|
||||
LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feature_category_footer, parent, false));
|
||||
LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feature_category_footer, parent, false),
|
||||
(FooterListener) mFragment);
|
||||
}
|
||||
default -> throw new IllegalArgumentException("Unsupported");
|
||||
}
|
||||
@@ -70,6 +79,10 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
||||
{
|
||||
((FeatureViewHolder) holder).bind(position);
|
||||
}
|
||||
else if (holder instanceof FooterViewHolder)
|
||||
{
|
||||
((FooterViewHolder) holder).bind(mFragment.getPendingNoteText());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -105,11 +118,36 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
||||
|
||||
protected static class FooterViewHolder extends RecyclerView.ViewHolder
|
||||
{
|
||||
FooterViewHolder(@NonNull View itemView)
|
||||
private final TextInputEditText mNoteEditText;
|
||||
private final View mSendNoteButton;
|
||||
|
||||
FooterViewHolder(@NonNull View itemView, @NonNull FooterListener listener)
|
||||
{
|
||||
super(itemView);
|
||||
MaterialTextView categoryUnsuitableText = itemView.findViewById(R.id.editor_category_unsuitable_text);
|
||||
categoryUnsuitableText.setMovementMethod(LinkMovementMethod.getInstance());
|
||||
mNoteEditText = itemView.findViewById(R.id.note_edit_text);
|
||||
mSendNoteButton = itemView.findViewById(R.id.send_note_button);
|
||||
mSendNoteButton.setOnClickListener(v -> listener.onSendNoteClicked());
|
||||
mNoteEditText.addTextChangedListener(new StringUtils.SimpleTextWatcher() {
|
||||
@Override
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count)
|
||||
{
|
||||
final String str = s.toString();
|
||||
listener.onNoteTextChanged(str);
|
||||
mSendNoteButton.setEnabled(!str.trim().isEmpty());
|
||||
}
|
||||
});
|
||||
}
|
||||
public void bind(String pendingNoteText)
|
||||
{
|
||||
if (!mNoteEditText.getText().toString().equals(pendingNoteText))
|
||||
{
|
||||
mNoteEditText.setText(pendingNoteText);
|
||||
if (pendingNoteText != null)
|
||||
mNoteEditText.setSelection(pendingNoteText.length());
|
||||
}
|
||||
mSendNoteButton.setEnabled(pendingNoteText != null && !pendingNoteText.trim().isEmpty());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,28 +2,39 @@ package app.organicmaps.editor;
|
||||
|
||||
import static app.organicmaps.sdk.util.Utils.getLocalizedFeatureType;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Toast;
|
||||
import androidx.annotation.CallSuper;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmRecyclerFragment;
|
||||
import app.organicmaps.dialog.EditTextDialogFragment;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.editor.Editor;
|
||||
import app.organicmaps.sdk.editor.OsmOAuth;
|
||||
import app.organicmaps.sdk.editor.data.FeatureCategory;
|
||||
import app.organicmaps.sdk.util.Language;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.widget.SearchToolbarController;
|
||||
import app.organicmaps.widget.ToolbarController;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
|
||||
public class FeatureCategoryFragment extends BaseMwmRecyclerFragment<FeatureCategoryAdapter>
|
||||
public class FeatureCategoryFragment
|
||||
extends BaseMwmRecyclerFragment<FeatureCategoryAdapter> implements FeatureCategoryAdapter.FooterListener
|
||||
{
|
||||
private FeatureCategory mSelectedCategory;
|
||||
protected ToolbarController mToolbarController;
|
||||
private static final String NOTE_CONFIRMATION_SHOWN = "NoteConfirmationAlertWasShown";
|
||||
private static String mPendingNoteText = "";
|
||||
|
||||
public interface FeatureCategoryListener
|
||||
{
|
||||
@@ -104,4 +115,64 @@ public class FeatureCategoryFragment extends BaseMwmRecyclerFragment<FeatureCate
|
||||
else if (getParentFragment() instanceof FeatureCategoryListener)
|
||||
((FeatureCategoryListener) getParentFragment()).onFeatureCategorySelected(category);
|
||||
}
|
||||
|
||||
public String getPendingNoteText()
|
||||
{
|
||||
return mPendingNoteText;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNoteTextChanged(String newText)
|
||||
{
|
||||
mPendingNoteText = newText;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSendNoteClicked()
|
||||
{
|
||||
if (!OsmOAuth.isAuthorized())
|
||||
{
|
||||
final Intent intent = new Intent(requireActivity(), OsmLoginActivity.class);
|
||||
startActivity(intent);
|
||||
return;
|
||||
}
|
||||
|
||||
final double[] center = Framework.nativeGetScreenRectCenter();
|
||||
final double lat = center[0];
|
||||
final double lon = center[1];
|
||||
|
||||
if (!MwmApplication.prefs(requireContext().getApplicationContext()).contains(NOTE_CONFIRMATION_SHOWN))
|
||||
{
|
||||
showNoteConfirmationDialog(lat, lon, mPendingNoteText);
|
||||
}
|
||||
else
|
||||
{
|
||||
Editor.nativeCreateStandaloneNote(lat, lon, mPendingNoteText);
|
||||
mPendingNoteText = "";
|
||||
Toast.makeText(requireContext(), R.string.osm_note_toast, Toast.LENGTH_SHORT).show();
|
||||
requireActivity().finish();
|
||||
}
|
||||
}
|
||||
|
||||
// Duplicate of showNoobDialog()
|
||||
private void showNoteConfirmationDialog(double lat, double lon, String noteText)
|
||||
{
|
||||
new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
|
||||
.setTitle(R.string.editor_share_to_all_dialog_title)
|
||||
.setMessage(getString(R.string.editor_share_to_all_dialog_message_1) + " "
|
||||
+ getString(R.string.editor_share_to_all_dialog_message_2))
|
||||
.setPositiveButton(android.R.string.ok,
|
||||
(dlg, which) -> {
|
||||
MwmApplication.prefs(requireContext().getApplicationContext())
|
||||
.edit()
|
||||
.putBoolean(NOTE_CONFIRMATION_SHOWN, true)
|
||||
.apply();
|
||||
Editor.nativeCreateStandaloneNote(lat, lon, noteText);
|
||||
mPendingNoteText = "";
|
||||
Toast.makeText(requireContext(), R.string.osm_note_toast, Toast.LENGTH_SHORT).show();
|
||||
requireActivity().finish();
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.show();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,9 +13,9 @@ import androidx.appcompat.widget.SwitchCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.editor.data.TimeFormatUtils;
|
||||
import app.organicmaps.sdk.editor.OpeningHours;
|
||||
import app.organicmaps.sdk.editor.data.HoursMinutes;
|
||||
import app.organicmaps.editor.data.TimeFormatUtils;
|
||||
import app.organicmaps.sdk.editor.data.Timespan;
|
||||
import app.organicmaps.sdk.editor.data.Timetable;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
|
||||
@@ -10,7 +10,6 @@ import androidx.core.content.IntentCompat;
|
||||
import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.editor.OsmLoginActivity;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.Map;
|
||||
import app.organicmaps.sdk.api.ParsedRoutingData;
|
||||
@@ -20,6 +19,7 @@ import app.organicmaps.sdk.api.RoutePoint;
|
||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||
import app.organicmaps.sdk.bookmarks.data.FeatureId;
|
||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.search.SearchEngine;
|
||||
import app.organicmaps.sdk.util.StorageUtils;
|
||||
import app.organicmaps.sdk.util.concurrency.ThreadPool;
|
||||
|
||||
@@ -26,7 +26,6 @@ import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.leftbutton.LeftButton;
|
||||
import app.organicmaps.leftbutton.LeftToggleButton;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.downloader.UpdateInfo;
|
||||
@@ -34,6 +33,7 @@ import app.organicmaps.sdk.location.TrackRecorder;
|
||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
||||
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
||||
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
|
||||
@@ -14,7 +14,7 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.search.SearchEngine;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||
@@ -215,7 +215,7 @@ public class SearchWheel implements View.OnClickListener
|
||||
final SearchOption searchOption = mMapButtonsViewModel.getSearchOption().getValue();
|
||||
mSearchButton.setImageDrawable(Graphics.tint(
|
||||
mSearchButton.getContext(), searchOption == null ? R.drawable.ic_routing_search_off : searchOption.mDrawableOff,
|
||||
androidx.appcompat.R.attr.colorAccent));
|
||||
com.google.android.material.R.attr.colorSecondary));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -14,6 +14,7 @@ import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.maplayer.Mode;
|
||||
import app.organicmaps.sdk.util.SharedPropertiesUtils;
|
||||
import app.organicmaps.util.ThemeSwitcher;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
||||
import app.organicmaps.widget.recycler.SpanningLinearLayoutManager;
|
||||
@@ -72,6 +73,9 @@ public class ToggleMapLayerFragment extends Fragment
|
||||
Context context = v.getContext();
|
||||
SharedPropertiesUtils.setLayerMarkerShownForLayerMode(mode);
|
||||
mode.setEnabled(context, !mode.isEnabled(context));
|
||||
// TODO: dirty hack :(
|
||||
if (mode == Mode.OUTDOORS)
|
||||
ThemeSwitcher.INSTANCE.restart(true);
|
||||
mAdapter.notifyDataSetChanged();
|
||||
mMapButtonsController.updateLayerButton();
|
||||
if (MwmApplication.from(context).getIsolinesManager().shouldShowNotification())
|
||||
|
||||
@@ -15,6 +15,7 @@ import app.organicmaps.R;
|
||||
import app.organicmaps.adapter.DisabledChildSimpleExpandableListAdapter;
|
||||
import app.organicmaps.base.BaseMwmDialogFragment;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
@@ -11,14 +11,14 @@ import android.view.ViewGroup;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.content.res.AppCompatResources;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
|
||||
@@ -22,6 +22,7 @@ import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior;
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialog;
|
||||
|
||||
@@ -18,6 +18,7 @@ import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.Router;
|
||||
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
||||
import app.organicmaps.sdk.routing.CarDirection;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
|
||||
@@ -35,6 +35,7 @@ import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.location.LocationHelper;
|
||||
import app.organicmaps.sdk.location.LocationListener;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.sound.MediaPlayerWrapper;
|
||||
import app.organicmaps.sdk.sound.TtsPlayer;
|
||||
|
||||
@@ -32,6 +32,7 @@ import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.bookmarks.data.DistanceAndAzimut;
|
||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.routing.TransitRouteInfo;
|
||||
import app.organicmaps.sdk.routing.TransitStepInfo;
|
||||
@@ -39,6 +40,7 @@ import app.organicmaps.sdk.util.Distance;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.widget.recycler.DotDividerItemDecoration;
|
||||
import app.organicmaps.widget.recycler.MultilineLayoutManager;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
@@ -117,10 +119,11 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
||||
|
||||
private RoutingBottomMenuController(@NonNull Activity context, @NonNull View altitudeChartFrame,
|
||||
@NonNull View timeElevationLine, @NonNull View transitFrame,
|
||||
@NonNull MaterialTextView error, @NonNull Button start, @NonNull ImageView altitudeChart,
|
||||
@NonNull MaterialTextView time, @NonNull MaterialTextView altitudeDifference,
|
||||
@NonNull TextView timeVehicle, @Nullable MaterialTextView arrival,
|
||||
@NonNull View actionFrame, @Nullable RoutingBottomMenuListener listener)
|
||||
@NonNull MaterialTextView error, @NonNull Button start,
|
||||
@NonNull ImageView altitudeChart, @NonNull MaterialTextView time,
|
||||
@NonNull MaterialTextView altitudeDifference, @NonNull TextView timeVehicle,
|
||||
@Nullable MaterialTextView arrival, @NonNull View actionFrame,
|
||||
@Nullable RoutingBottomMenuListener listener)
|
||||
{
|
||||
mContext = context;
|
||||
mAltitudeChartFrame = altitudeChartFrame;
|
||||
@@ -191,8 +194,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
||||
scrollToBottom(rv);
|
||||
|
||||
MaterialTextView totalTimeView = mTransitFrame.findViewById(R.id.total_time);
|
||||
totalTimeView.setText(
|
||||
RoutingController.formatRoutingTime(mContext, info.getTotalTime(), R.dimen.text_size_routing_number));
|
||||
totalTimeView.setText(Utils.formatRoutingTime(mContext, info.getTotalTime(), R.dimen.text_size_routing_number));
|
||||
View dotView = mTransitFrame.findViewById(R.id.dot);
|
||||
View pedestrianIcon = mTransitFrame.findViewById(R.id.pedestrian_icon);
|
||||
MaterialTextView distanceView = mTransitFrame.findViewById(R.id.total_distance);
|
||||
@@ -261,9 +263,9 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
||||
{
|
||||
UiUtils.show(mActionButton);
|
||||
Drawable icon = ContextCompat.getDrawable(mContext, R.drawable.ic_location_crosshair);
|
||||
int colorAccent = ContextCompat.getColor(
|
||||
mContext, UiUtils.getStyledResourceId(mContext, androidx.appcompat.R.attr.colorAccent));
|
||||
mActionIcon.setImageDrawable(Graphics.tint(icon, colorAccent));
|
||||
int colorSecondary = ContextCompat.getColor(
|
||||
mContext, UiUtils.getStyledResourceId(mContext, com.google.android.material.R.attr.colorSecondary));
|
||||
mActionIcon.setImageDrawable(Graphics.tint(icon, colorSecondary));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -382,7 +384,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
||||
|
||||
if (mArrival != null)
|
||||
{
|
||||
String arrivalTime = RoutingController.formatArrivalTime(rinfo.totalTimeInSeconds);
|
||||
String arrivalTime = Utils.formatArrivalTime(rinfo.totalTimeInSeconds);
|
||||
mArrival.setText(arrivalTime);
|
||||
}
|
||||
}
|
||||
@@ -400,7 +402,7 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
||||
|
||||
{
|
||||
CharSequence time =
|
||||
RoutingController.formatRoutingTime(context, routingInfo.totalTimeInSeconds, R.dimen.text_size_routing_number);
|
||||
Utils.formatRoutingTime(context, routingInfo.totalTimeInSeconds, R.dimen.text_size_routing_number);
|
||||
|
||||
SpannableStringBuilder builder = new SpannableStringBuilder();
|
||||
initTimeBuilderSequence(context, time, builder);
|
||||
|
||||
@@ -13,11 +13,11 @@ import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.fragment.app.FragmentFactory;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
public class RoutingErrorDialogFragment extends BaseRoutingErrorDialogFragment
|
||||
{
|
||||
|
||||
@@ -11,6 +11,7 @@ import androidx.fragment.app.FragmentFactory;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.widget.WheelProgressView;
|
||||
import java.util.HashSet;
|
||||
|
||||
@@ -17,6 +17,7 @@ import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.Router;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.routing.RoutingOptions;
|
||||
import app.organicmaps.sdk.routing.TransitRouteInfo;
|
||||
|
||||
@@ -10,6 +10,7 @@ import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmFragment;
|
||||
import app.organicmaps.sdk.Router;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
|
||||
public class RoutingPlanFragment extends BaseMwmFragment
|
||||
{
|
||||
|
||||
@@ -4,9 +4,9 @@ import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.Surface;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import app.organicmaps.BuildConfig;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.display.DisplayType;
|
||||
import app.organicmaps.sdk.location.LocationHelper;
|
||||
@@ -53,8 +53,12 @@ public final class Map
|
||||
public static final int INVALID_POINTER_MASK = 0xFF;
|
||||
public static final int INVALID_TOUCH_ID = -1;
|
||||
|
||||
@NonNull
|
||||
private final DisplayType mDisplayType;
|
||||
|
||||
@NonNull
|
||||
private final LocationHelper mLocationHelper;
|
||||
|
||||
private int mCurrentCompassOffsetX;
|
||||
private int mCurrentCompassOffsetY;
|
||||
private int mBottomWidgetOffsetX;
|
||||
@@ -75,9 +79,10 @@ public final class Map
|
||||
|
||||
private static int sCurrentDpi = 0;
|
||||
|
||||
public Map(DisplayType mapType)
|
||||
public Map(@NonNull DisplayType mapType, @NonNull LocationHelper locationHelper)
|
||||
{
|
||||
mDisplayType = mapType;
|
||||
mLocationHelper = locationHelper;
|
||||
onCreate(false);
|
||||
}
|
||||
|
||||
@@ -169,9 +174,7 @@ public final class Map
|
||||
mRequireResize = false;
|
||||
setupWidgets(context, surfaceFrame.width(), surfaceFrame.height());
|
||||
|
||||
final LocationHelper locationHelper = MwmApplication.from(context).getLocationHelper();
|
||||
|
||||
final boolean firstStart = locationHelper.isInFirstRun();
|
||||
final boolean firstStart = mLocationHelper.isInFirstRun();
|
||||
if (!nativeCreateEngine(surface, surfaceDpi, firstStart, mLaunchByDeepLink, BuildConfig.VERSION_CODE,
|
||||
ROMUtils.isCustomROM()))
|
||||
{
|
||||
@@ -182,7 +185,7 @@ public final class Map
|
||||
sCurrentDpi = surfaceDpi;
|
||||
|
||||
if (firstStart)
|
||||
UiThread.runLater(locationHelper::onExitFromFirstRun);
|
||||
UiThread.runLater(mLocationHelper::onExitFromFirstRun);
|
||||
|
||||
mSurfaceCreated = true;
|
||||
mSurfaceAttached = true;
|
||||
|
||||
@@ -7,8 +7,8 @@ import androidx.lifecycle.DefaultLifecycleObserver;
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
import androidx.lifecycle.ProcessLifecycleOwner;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||
import app.organicmaps.sdk.bookmarks.data.Icon;
|
||||
import app.organicmaps.sdk.downloader.Android7RootCertificateWorkaround;
|
||||
import app.organicmaps.sdk.editor.OsmOAuth;
|
||||
import app.organicmaps.sdk.location.LocationHelper;
|
||||
@@ -16,16 +16,16 @@ import app.organicmaps.sdk.location.SensorHelper;
|
||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
||||
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
||||
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.search.SearchEngine;
|
||||
import app.organicmaps.sdk.settings.StoragePathManager;
|
||||
import app.organicmaps.sdk.sound.TtsPlayer;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.SharedPropertiesUtils;
|
||||
import app.organicmaps.sdk.util.StorageUtils;
|
||||
import app.organicmaps.sdk.util.ThemeSwitcher;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import app.organicmaps.sdk.util.log.LogsManager;
|
||||
import app.organicmaps.settings.StoragePathManager;
|
||||
import java.io.IOException;
|
||||
|
||||
public final class OrganicMaps implements DefaultLifecycleObserver
|
||||
@@ -96,9 +96,11 @@ public final class OrganicMaps implements DefaultLifecycleObserver
|
||||
|
||||
Android7RootCertificateWorkaround.initializeIfNeeded(mContext);
|
||||
|
||||
Icon.loadDefaultIcons(mContext.getResources(), mContext.getPackageName());
|
||||
|
||||
mSensorHelper = new SensorHelper(mContext);
|
||||
mLocationHelper = new LocationHelper(mContext, mSensorHelper);
|
||||
mIsolinesManager = new IsolinesManager(mContext);
|
||||
mIsolinesManager = new IsolinesManager();
|
||||
mSubwayManager = new SubwayManager(mContext);
|
||||
}
|
||||
|
||||
@@ -174,12 +176,10 @@ public final class OrganicMaps implements DefaultLifecycleObserver
|
||||
nativeInitFramework(onComplete);
|
||||
|
||||
initNativeStrings();
|
||||
ThemeSwitcher.INSTANCE.initialize(mContext);
|
||||
SearchEngine.INSTANCE.initialize();
|
||||
BookmarkManager.loadBookmarks();
|
||||
TtsPlayer.INSTANCE.initialize(mContext);
|
||||
ThemeSwitcher.INSTANCE.restart(false);
|
||||
RoutingController.get().initialize(mContext);
|
||||
RoutingController.get().initialize(mLocationHelper);
|
||||
TrafficManager.INSTANCE.initialize();
|
||||
mSubwayManager.initialize();
|
||||
mIsolinesManager.initialize();
|
||||
|
||||
@@ -10,12 +10,12 @@ import java.lang.annotation.RetentionPolicy;
|
||||
public @interface RequestType
|
||||
{
|
||||
// Represents url_scheme::ParsedMapApi::UrlType from c++ part.
|
||||
public static final int INCORRECT = 0;
|
||||
public static final int MAP = 1;
|
||||
public static final int ROUTE = 2;
|
||||
public static final int SEARCH = 3;
|
||||
public static final int CROSSHAIR = 4;
|
||||
public static final int OAUTH2 = 5;
|
||||
public static final int MENU = 6;
|
||||
public static final int SETTINGS = 7;
|
||||
int INCORRECT = 0;
|
||||
int MAP = 1;
|
||||
int ROUTE = 2;
|
||||
int SEARCH = 3;
|
||||
int CROSSHAIR = 4;
|
||||
int OAUTH2 = 5;
|
||||
int MENU = 6;
|
||||
int SETTINGS = 7;
|
||||
}
|
||||
|
||||
@@ -41,8 +41,6 @@ public enum BookmarkManager {
|
||||
// These values have to match the values of kml::CompilationType from kml/types.hpp
|
||||
public static final int CATEGORY = 0;
|
||||
|
||||
public static final List<Icon> ICONS = new ArrayList<>();
|
||||
|
||||
private static final String[] BOOKMARKS_EXTENSIONS = Framework.nativeGetBookmarksFilesExts();
|
||||
|
||||
private static final String TAG = BookmarkManager.class.getSimpleName();
|
||||
@@ -70,26 +68,6 @@ public enum BookmarkManager {
|
||||
@Nullable
|
||||
private OnElevationActivePointChangedListener mOnElevationActivePointChangedListener;
|
||||
|
||||
static
|
||||
{
|
||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_RED, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_PINK, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_PURPLE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_DEEPPURPLE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_BLUE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_LIGHTBLUE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_CYAN, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_TEAL, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_GREEN, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_LIME, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_YELLOW, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_ORANGE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_DEEPORANGE, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_BROWN, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_GRAY, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||
ICONS.add(new Icon(Icon.PREDEFINED_COLOR_BLUEGRAY, Icon.BOOKMARK_ICON_TYPE_NONE));
|
||||
}
|
||||
|
||||
public void toggleCategoryVisibility(@NonNull BookmarkCategory category)
|
||||
{
|
||||
boolean isVisible = isVisible(category.getId());
|
||||
@@ -342,7 +320,7 @@ public enum BookmarkManager {
|
||||
nativeShowBookmarkCategoryOnMap(catId);
|
||||
}
|
||||
|
||||
@Icon.PredefinedColor
|
||||
@PredefinedColors.Color
|
||||
public int getLastEditedColor()
|
||||
{
|
||||
return nativeGetLastEditedColor();
|
||||
@@ -618,7 +596,7 @@ public enum BookmarkManager {
|
||||
return nativeGetBookmarkXY(bookmarkId);
|
||||
}
|
||||
|
||||
@Icon.PredefinedColor
|
||||
@PredefinedColors.Color
|
||||
public int getBookmarkColor(@IntRange(from = 0) long bookmarkId)
|
||||
{
|
||||
return nativeGetBookmarkColor(bookmarkId);
|
||||
@@ -652,7 +630,7 @@ public enum BookmarkManager {
|
||||
}
|
||||
|
||||
public void setBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name,
|
||||
@Icon.PredefinedColor int color, @NonNull String descr)
|
||||
@PredefinedColors.Color int color, @NonNull String descr)
|
||||
{
|
||||
nativeSetBookmarkParams(bookmarkId, name, color, descr);
|
||||
}
|
||||
@@ -808,7 +786,7 @@ public enum BookmarkManager {
|
||||
@Nullable
|
||||
private native Bookmark nativeAddBookmarkToLastEditedCategory(double lat, double lon);
|
||||
|
||||
@Icon.PredefinedColor
|
||||
@PredefinedColors.Color
|
||||
private native int nativeGetLastEditedColor();
|
||||
|
||||
private static native void nativeLoadBookmarksFile(@NonNull String path, boolean isTemporaryFile);
|
||||
@@ -874,7 +852,7 @@ public enum BookmarkManager {
|
||||
@NonNull
|
||||
private static native ParcelablePointD nativeGetBookmarkXY(@IntRange(from = 0) long bookmarkId);
|
||||
|
||||
@Icon.PredefinedColor
|
||||
@PredefinedColors.Color
|
||||
private static native int nativeGetBookmarkColor(@IntRange(from = 0) long bookmarkId);
|
||||
|
||||
private static native int nativeGetBookmarkIcon(@IntRange(from = 0) long bookmarkId);
|
||||
@@ -889,12 +867,13 @@ public enum BookmarkManager {
|
||||
private static native String nativeEncode2Ge0Url(@IntRange(from = 0) long bookmarkId, boolean addName);
|
||||
|
||||
private static native void nativeSetBookmarkParams(@IntRange(from = 0) long bookmarkId, @NonNull String name,
|
||||
@Icon.PredefinedColor int color, @NonNull String descr);
|
||||
@PredefinedColors.Color int color, @NonNull String descr);
|
||||
|
||||
private static native void nativeChangeTrackColor(@IntRange(from = 0) long trackId, @Icon.PredefinedColor int color);
|
||||
private static native void nativeChangeTrackColor(@IntRange(from = 0) long trackId,
|
||||
@PredefinedColors.Color int color);
|
||||
|
||||
private static native void nativeSetTrackParams(@IntRange(from = 0) long trackId, @NonNull String name,
|
||||
@Icon.PredefinedColor int color, @NonNull String descr);
|
||||
@PredefinedColors.Color int color, @NonNull String descr);
|
||||
|
||||
private static native void nativeChangeBookmarkCategory(@IntRange(from = 0) long oldCatId,
|
||||
@IntRange(from = 0) long newCatId,
|
||||
|
||||
@@ -1,108 +1,29 @@
|
||||
package app.organicmaps.sdk.bookmarks.data;
|
||||
|
||||
import android.content.res.Resources;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import androidx.annotation.ColorInt;
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.IntDef;
|
||||
import app.organicmaps.sdk.R;
|
||||
import androidx.annotation.NonNull;
|
||||
import app.organicmaps.BuildConfig;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import com.google.common.base.Objects;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import dalvik.annotation.optimization.FastNative;
|
||||
|
||||
public class Icon implements Parcelable
|
||||
{
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef({PREDEFINED_COLOR_NONE, PREDEFINED_COLOR_RED, PREDEFINED_COLOR_BLUE, PREDEFINED_COLOR_PURPLE,
|
||||
PREDEFINED_COLOR_YELLOW, PREDEFINED_COLOR_PINK, PREDEFINED_COLOR_BROWN, PREDEFINED_COLOR_GREEN,
|
||||
PREDEFINED_COLOR_ORANGE, PREDEFINED_COLOR_DEEPPURPLE, PREDEFINED_COLOR_LIGHTBLUE, PREDEFINED_COLOR_CYAN,
|
||||
PREDEFINED_COLOR_TEAL, PREDEFINED_COLOR_LIME, PREDEFINED_COLOR_DEEPORANGE, PREDEFINED_COLOR_GRAY,
|
||||
PREDEFINED_COLOR_BLUEGRAY})
|
||||
@interface PredefinedColor
|
||||
{}
|
||||
private static final String TAG = Icon.class.getSimpleName();
|
||||
|
||||
static final int PREDEFINED_COLOR_NONE = 0;
|
||||
static final int PREDEFINED_COLOR_RED = 1;
|
||||
static final int PREDEFINED_COLOR_BLUE = 2;
|
||||
static final int PREDEFINED_COLOR_PURPLE = 3;
|
||||
static final int PREDEFINED_COLOR_YELLOW = 4;
|
||||
static final int PREDEFINED_COLOR_PINK = 5;
|
||||
static final int PREDEFINED_COLOR_BROWN = 6;
|
||||
static final int PREDEFINED_COLOR_GREEN = 7;
|
||||
static final int PREDEFINED_COLOR_ORANGE = 8;
|
||||
static final int PREDEFINED_COLOR_DEEPPURPLE = 9;
|
||||
static final int PREDEFINED_COLOR_LIGHTBLUE = 10;
|
||||
static final int PREDEFINED_COLOR_CYAN = 11;
|
||||
static final int PREDEFINED_COLOR_TEAL = 12;
|
||||
static final int PREDEFINED_COLOR_LIME = 13;
|
||||
static final int PREDEFINED_COLOR_DEEPORANGE = 14;
|
||||
static final int PREDEFINED_COLOR_GRAY = 15;
|
||||
static final int PREDEFINED_COLOR_BLUEGRAY = 16;
|
||||
|
||||
private static int shift(int v, int bitCount)
|
||||
{
|
||||
return v << bitCount;
|
||||
}
|
||||
private static int toARGB(int r, int g, int b)
|
||||
{
|
||||
return shift(255, 24) + shift(r, 16) + shift(g, 8) + b;
|
||||
}
|
||||
|
||||
/// @note Important! Should be synced with kml/types.hpp/PredefinedColor
|
||||
/// @todo Values can be taken from Core.
|
||||
private static final int[] ARGB_COLORS = {toARGB(229, 27, 35), // none
|
||||
toARGB(229, 27, 35), // red
|
||||
toARGB(0, 110, 199), // blue
|
||||
toARGB(156, 39, 176), // purple
|
||||
toARGB(255, 200, 0), // yellow
|
||||
toARGB(255, 65, 130), // pink
|
||||
toARGB(121, 85, 72), // brown
|
||||
toARGB(56, 142, 60), // green
|
||||
toARGB(255, 160, 0), // orange
|
||||
toARGB(102, 57, 191), // deeppurple
|
||||
toARGB(36, 156, 242), // lightblue
|
||||
toARGB(20, 190, 205), // cyan
|
||||
toARGB(0, 165, 140), // teal
|
||||
toARGB(147, 191, 57), // lime
|
||||
toARGB(240, 100, 50), // deeporange
|
||||
toARGB(115, 115, 115), // gray
|
||||
toARGB(89, 115, 128)}; // bluegray
|
||||
|
||||
static final int BOOKMARK_ICON_TYPE_NONE = 0;
|
||||
|
||||
/// @note Important! Should be synced with kml/types.hpp/BookmarkIcon
|
||||
/// @todo Can make better: take name-by-type from Core and make a concat: "R.drawable.ic_bookmark_" + name.
|
||||
// First icon should be "none" <-> BOOKMARK_ICON_TYPE_NONE.
|
||||
@DrawableRes
|
||||
private static final int[] TYPE_ICONS = {
|
||||
R.drawable.ic_bookmark_none, R.drawable.ic_bookmark_hotel, R.drawable.ic_bookmark_animals,
|
||||
R.drawable.ic_bookmark_buddhism, R.drawable.ic_bookmark_building, R.drawable.ic_bookmark_christianity,
|
||||
R.drawable.ic_bookmark_entertainment, R.drawable.ic_bookmark_money, R.drawable.ic_bookmark_food,
|
||||
R.drawable.ic_bookmark_gas, R.drawable.ic_bookmark_judaism, R.drawable.ic_bookmark_medicine,
|
||||
R.drawable.ic_bookmark_mountain, R.drawable.ic_bookmark_museum, R.drawable.ic_bookmark_islam,
|
||||
R.drawable.ic_bookmark_park, R.drawable.ic_bookmark_parking, R.drawable.ic_bookmark_shop,
|
||||
R.drawable.ic_bookmark_sights, R.drawable.ic_bookmark_swim, R.drawable.ic_bookmark_water,
|
||||
R.drawable.ic_bookmark_bar, R.drawable.ic_bookmark_transport, R.drawable.ic_bookmark_viewpoint,
|
||||
R.drawable.ic_bookmark_sport,
|
||||
R.drawable.ic_bookmark_none, // pub
|
||||
R.drawable.ic_bookmark_none, // art
|
||||
R.drawable.ic_bookmark_none, // bank
|
||||
R.drawable.ic_bookmark_none, // cafe
|
||||
R.drawable.ic_bookmark_none, // pharmacy
|
||||
R.drawable.ic_bookmark_none, // stadium
|
||||
R.drawable.ic_bookmark_none, // theatre
|
||||
R.drawable.ic_bookmark_none, // information
|
||||
R.drawable.ic_bookmark_none, // ChargingStation
|
||||
R.drawable.ic_bookmark_none, // BicycleParking
|
||||
R.drawable.ic_bookmark_none, // BicycleParkingCovered
|
||||
R.drawable.ic_bookmark_none, // BicycleRental
|
||||
R.drawable.ic_bookmark_none // FastFood
|
||||
};
|
||||
private static int[] sTypeIcons = null;
|
||||
|
||||
@PredefinedColor
|
||||
@PredefinedColors.Color
|
||||
private final int mColor;
|
||||
private final int mType;
|
||||
|
||||
public Icon(@PredefinedColor int color, int type)
|
||||
public Icon(@PredefinedColors.Color int color, int type)
|
||||
{
|
||||
mColor = color;
|
||||
mType = type;
|
||||
@@ -127,31 +48,29 @@ public class Icon implements Parcelable
|
||||
mType = in.readInt();
|
||||
}
|
||||
|
||||
@PredefinedColor
|
||||
@PredefinedColors.Color
|
||||
public int getColor()
|
||||
{
|
||||
return mColor;
|
||||
}
|
||||
|
||||
@ColorInt
|
||||
public int argb()
|
||||
{
|
||||
return ARGB_COLORS[mColor];
|
||||
}
|
||||
|
||||
public static int getColorPosition(int color)
|
||||
{
|
||||
for (int index = 1; index < ARGB_COLORS.length; index++)
|
||||
{
|
||||
if (ARGB_COLORS[index] == color)
|
||||
return index;
|
||||
}
|
||||
return -1;
|
||||
return PredefinedColors.getColor(mColor);
|
||||
}
|
||||
|
||||
@DrawableRes
|
||||
public int getResId()
|
||||
{
|
||||
return TYPE_ICONS[mType];
|
||||
// loadDefaultIcons should be called
|
||||
assert (sTypeIcons != null);
|
||||
return sTypeIcons[mType];
|
||||
}
|
||||
|
||||
public int getType()
|
||||
{
|
||||
return mType;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -181,4 +100,29 @@ public class Icon implements Parcelable
|
||||
return new Icon[size];
|
||||
}
|
||||
};
|
||||
|
||||
static public void loadDefaultIcons(@NonNull Resources resources, @NonNull String packageName)
|
||||
{
|
||||
final String[] names = nativeGetBookmarkIconNames();
|
||||
int[] icons = new int[names.length];
|
||||
for (int i = 0; i < names.length; i++)
|
||||
{
|
||||
final String name = StringUtils.toSnakeCase(names[i]);
|
||||
icons[i] = resources.getIdentifier("ic_bookmark_" + name, "drawable", packageName);
|
||||
if (icons[i] == 0)
|
||||
{
|
||||
Logger.e(TAG, "Error getting icon for " + name);
|
||||
// Force devs to add an icon for each bookmark type.
|
||||
if (BuildConfig.DEBUG)
|
||||
throw new RuntimeException("Error getting icon for " + name);
|
||||
icons[i] = app.organicmaps.sdk.R.drawable.ic_bookmark_none; // Fallback icon
|
||||
}
|
||||
}
|
||||
|
||||
sTypeIcons = icons;
|
||||
}
|
||||
|
||||
@FastNative
|
||||
@NonNull
|
||||
private static native String[] nativeGetBookmarkIconNames();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
package app.organicmaps.sdk.bookmarks.data;
|
||||
|
||||
import androidx.annotation.ColorInt;
|
||||
import androidx.annotation.IntRange;
|
||||
import androidx.annotation.NonNull;
|
||||
import dalvik.annotation.optimization.FastNative;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.List;
|
||||
import java.util.stream.IntStream;
|
||||
|
||||
public class PredefinedColors
|
||||
{
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntRange(from = 0)
|
||||
public @interface Color
|
||||
{}
|
||||
|
||||
/// @note Color format: ARGB
|
||||
@ColorInt
|
||||
private static final int[] PREDEFINED_COLORS = nativeGetPredefinedColors();
|
||||
|
||||
@ColorInt
|
||||
public static int getColor(int index)
|
||||
{
|
||||
return PREDEFINED_COLORS[index];
|
||||
}
|
||||
|
||||
@PredefinedColors.Color
|
||||
public static List<Integer> getAllPredefinedColors()
|
||||
{
|
||||
// 0 is reserved for "no color" option.
|
||||
return IntStream.range(1, PREDEFINED_COLORS.length).boxed().toList();
|
||||
}
|
||||
|
||||
public static int getPredefinedColorIndex(@ColorInt int color)
|
||||
{
|
||||
// 0 is reserved for "no color" option.
|
||||
for (int index = 1; index < PREDEFINED_COLORS.length; index++)
|
||||
{
|
||||
if (PREDEFINED_COLORS[index] == color)
|
||||
return index;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
@FastNative
|
||||
@NonNull
|
||||
private static native int[] nativeGetPredefinedColors();
|
||||
}
|
||||
@@ -161,6 +161,7 @@ public final class Editor
|
||||
public static native void nativeCreateNote(String text);
|
||||
public static native void nativePlaceDoesNotExist(@NonNull String comment);
|
||||
public static native void nativeRollbackMapObject();
|
||||
public static native void nativeCreateStandaloneNote(double lat, double lon, String text);
|
||||
|
||||
/**
|
||||
* @return all cuisines keys.
|
||||
|
||||
@@ -16,13 +16,12 @@ import androidx.annotation.UiThread;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.location.GnssStatusCompat;
|
||||
import androidx.core.location.LocationManagerCompat;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.Map;
|
||||
import app.organicmaps.sdk.bookmarks.data.FeatureId;
|
||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
import app.organicmaps.sdk.routing.JunctionInfo;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.LocationUtils;
|
||||
import app.organicmaps.sdk.util.NetworkPolicy;
|
||||
|
||||
@@ -6,7 +6,6 @@ import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
||||
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
||||
import app.organicmaps.sdk.maplayer.traffic.TrafficManager;
|
||||
import app.organicmaps.sdk.util.ThemeSwitcher;
|
||||
|
||||
public enum Mode
|
||||
{
|
||||
@@ -61,7 +60,8 @@ public enum Mode
|
||||
public void setEnabled(@NonNull Context context, boolean isEnabled)
|
||||
{
|
||||
Framework.nativeSetOutdoorsLayerEnabled(isEnabled);
|
||||
ThemeSwitcher.INSTANCE.restart(true);
|
||||
// TODO: ThemeSwitcher is outside sdk package. Properly fix dependencies
|
||||
// ThemeSwitcher.INSTANCE.restart(true);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,18 +1,12 @@
|
||||
package app.organicmaps.sdk.maplayer.isolines;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.annotation.NonNull;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
|
||||
public class IsolinesManager
|
||||
{
|
||||
@NonNull
|
||||
private final OnIsolinesChangedListener mListener;
|
||||
|
||||
public IsolinesManager(@NonNull Context context)
|
||||
{
|
||||
mListener = new OnIsolinesChangedListener(context);
|
||||
}
|
||||
private final OnIsolinesChangedListener mListener = new OnIsolinesChangedListener();
|
||||
|
||||
static public boolean isEnabled()
|
||||
{
|
||||
|
||||
@@ -1,40 +1,9 @@
|
||||
package app.organicmaps.sdk.maplayer.isolines;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.View;
|
||||
import android.widget.Toast;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.Utils;
|
||||
|
||||
public enum IsolinesState
|
||||
{
|
||||
DISABLED,
|
||||
ENABLED,
|
||||
EXPIREDDATA {
|
||||
@Override
|
||||
public void activate(@NonNull Context context, @Nullable View view, @Nullable View viewAbove)
|
||||
{
|
||||
if (view != null)
|
||||
Utils.showSnackbar(context, view, viewAbove, R.string.isolines_activation_error_dialog);
|
||||
else
|
||||
Toast.makeText(context, R.string.isolines_activation_error_dialog, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
},
|
||||
NODATA {
|
||||
@Override
|
||||
public void activate(@NonNull Context context, @Nullable View view, @Nullable View viewAbove)
|
||||
{
|
||||
if (view != null)
|
||||
Utils.showSnackbar(context, view, viewAbove, R.string.isolines_location_error_dialog);
|
||||
else
|
||||
Toast.makeText(context, R.string.isolines_location_error_dialog, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
};
|
||||
|
||||
public void activate(@NonNull Context context, @Nullable View viewAbove, @Nullable View view)
|
||||
{
|
||||
/* Do nothing by default */
|
||||
}
|
||||
EXPIREDDATA,
|
||||
NODATA;
|
||||
}
|
||||
|
||||
@@ -1,33 +1,22 @@
|
||||
package app.organicmaps.sdk.maplayer.isolines;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.annotation.Keep;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
class OnIsolinesChangedListener
|
||||
{
|
||||
@NonNull
|
||||
private final Context mContext;
|
||||
@Nullable
|
||||
private IsolinesErrorDialogListener mListener;
|
||||
|
||||
OnIsolinesChangedListener(@NonNull Context app)
|
||||
{
|
||||
mContext = app;
|
||||
}
|
||||
|
||||
// Called from JNI.
|
||||
@Keep
|
||||
@SuppressWarnings("unused")
|
||||
public void onStateChanged(int type)
|
||||
{
|
||||
IsolinesState state = IsolinesState.values()[type];
|
||||
if (mListener == null)
|
||||
{
|
||||
state.activate(mContext, null, null);
|
||||
return;
|
||||
}
|
||||
|
||||
mListener.onStateChanged(state);
|
||||
mListener.onStateChanged(IsolinesState.values()[type]);
|
||||
}
|
||||
|
||||
public void attach(@NonNull IsolinesErrorDialogListener listener)
|
||||
|
||||
@@ -1,38 +1,19 @@
|
||||
package app.organicmaps.routing;
|
||||
package app.organicmaps.sdk.routing;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.text.TextUtils;
|
||||
import androidx.annotation.DimenRes;
|
||||
import androidx.annotation.IntRange;
|
||||
import androidx.annotation.MainThread;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.util.Pair;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.Router;
|
||||
import app.organicmaps.sdk.bookmarks.data.FeatureId;
|
||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
import app.organicmaps.sdk.routing.ResultCodes;
|
||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||
import app.organicmaps.sdk.routing.RoutePointInfo;
|
||||
import app.organicmaps.sdk.routing.RouteRecommendationType;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.routing.RoutingListener;
|
||||
import app.organicmaps.sdk.routing.RoutingLoadPointsListener;
|
||||
import app.organicmaps.sdk.routing.RoutingOptions;
|
||||
import app.organicmaps.sdk.routing.RoutingProgressListener;
|
||||
import app.organicmaps.sdk.routing.TransitRouteInfo;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.location.LocationHelper;
|
||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.widget.placepage.CoordinatesFormat;
|
||||
import java.time.LocalTime;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import app.organicmaps.sdk.widget.placepage.CoordinatesFormat;
|
||||
|
||||
@androidx.annotation.UiThread
|
||||
public class RoutingController
|
||||
@@ -114,7 +95,7 @@ public class RoutingController
|
||||
mLastMissingMaps = missingMaps;
|
||||
mContainsCachedResult = true;
|
||||
|
||||
if (mLastResultCode == ResultCodes.NO_ERROR || ResultCodesHelper.isMoreMapsNeeded(mLastResultCode))
|
||||
if (mLastResultCode == ResultCodes.NO_ERROR || resultCode == ResultCodes.NEED_MORE_MAPS)
|
||||
{
|
||||
onBuiltRoute();
|
||||
}
|
||||
@@ -180,7 +161,7 @@ public class RoutingController
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ResultCodesHelper.isMoreMapsNeeded(mLastResultCode))
|
||||
if (mLastResultCode != ResultCodes.NEED_MORE_MAPS)
|
||||
{
|
||||
setBuildState(BuildState.ERROR);
|
||||
mLastBuildProgress = 0;
|
||||
@@ -195,8 +176,7 @@ public class RoutingController
|
||||
|
||||
private boolean isDrivingOptionsBuildError()
|
||||
{
|
||||
return !ResultCodesHelper.isMoreMapsNeeded(mLastResultCode) && RoutingOptions.hasAnyOptions()
|
||||
&& !isRulerRouterType();
|
||||
return mLastResultCode != ResultCodes.NEED_MORE_MAPS && RoutingOptions.hasAnyOptions() && !isRulerRouterType();
|
||||
}
|
||||
|
||||
private void setState(State newState)
|
||||
@@ -250,7 +230,7 @@ public class RoutingController
|
||||
mContainer = container;
|
||||
}
|
||||
|
||||
public void initialize(@NonNull Context context)
|
||||
public void initialize(@NonNull LocationHelper locationHelper)
|
||||
{
|
||||
mLastRouterType = Router.getLastUsed();
|
||||
mInvalidRoutePointsTransactionId = Framework.nativeInvalidRoutePointsTransactionId();
|
||||
@@ -260,7 +240,7 @@ public class RoutingController
|
||||
Framework.nativeSetRouteProgressListener(mRoutingProgressListener);
|
||||
Framework.nativeSetRoutingRecommendationListener(recommendation -> UiThread.run(() -> {
|
||||
if (recommendation == RouteRecommendationType.RebuildAfterPointsLoading)
|
||||
setStartPoint(MwmApplication.from(context).getLocationHelper().getMyPosition());
|
||||
setStartPoint(locationHelper.getMyPosition());
|
||||
}));
|
||||
Framework.nativeSetRoutingLoadPointsListener(mRoutingLoadPointsListener);
|
||||
}
|
||||
@@ -557,7 +537,7 @@ public class RoutingController
|
||||
return mLastRouterType == Router.Vehicle;
|
||||
}
|
||||
|
||||
boolean isRulerRouterType()
|
||||
public boolean isRulerRouterType()
|
||||
{
|
||||
return mLastRouterType == Router.Ruler;
|
||||
}
|
||||
@@ -883,26 +863,4 @@ public class RoutingController
|
||||
|
||||
mWaitingPoiPickType = null;
|
||||
}
|
||||
public static CharSequence formatRoutingTime(Context context, int seconds, @DimenRes int unitsSize)
|
||||
{
|
||||
return formatRoutingTime(context, seconds, unitsSize, R.dimen.text_size_routing_number);
|
||||
}
|
||||
|
||||
public static CharSequence formatRoutingTime(Context context, int seconds, @DimenRes int unitsSize,
|
||||
@DimenRes int textSize)
|
||||
{
|
||||
long minutes = TimeUnit.SECONDS.toMinutes(seconds) % 60;
|
||||
long hours = TimeUnit.SECONDS.toHours(seconds);
|
||||
String min = context.getString(R.string.minute);
|
||||
String hour = context.getString(R.string.hour);
|
||||
SpannableStringBuilder displayedH = Utils.formatTime(context, textSize, unitsSize, String.valueOf(hours), hour);
|
||||
SpannableStringBuilder displayedM = Utils.formatTime(context, textSize, unitsSize, String.valueOf(minutes), min);
|
||||
return hours == 0 ? displayedM : TextUtils.concat(displayedH + "\u00A0", displayedM);
|
||||
}
|
||||
|
||||
static String formatArrivalTime(int seconds)
|
||||
{
|
||||
final LocalTime time = LocalTime.now().plusSeconds(seconds);
|
||||
return StringUtils.formatUsingUsLocale("%d:%02d", time.getHour(), time.getMinute());
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.organicmaps.settings;
|
||||
package app.organicmaps.sdk.settings;
|
||||
|
||||
/**
|
||||
* Represents storage option.
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.organicmaps.settings;
|
||||
package app.organicmaps.sdk.settings;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ContentResolver;
|
||||
@@ -28,7 +28,7 @@ public class StoragePathManager
|
||||
private static final String TAG = StoragePathManager.class.getSimpleName();
|
||||
private static final String DATA_FILE_EXT = Framework.nativeGetDataFileExt();
|
||||
private static final String[] MOVABLE_EXTS = Framework.nativeGetMovableFilesExts();
|
||||
static final FilenameFilter MOVABLE_FILES_FILTER = (dir, filename) ->
|
||||
public static final FilenameFilter MOVABLE_FILES_FILTER = (dir, filename) ->
|
||||
{
|
||||
for (String ext : MOVABLE_EXTS)
|
||||
if (filename.endsWith(ext))
|
||||
@@ -37,7 +37,7 @@ public class StoragePathManager
|
||||
return false;
|
||||
};
|
||||
|
||||
interface OnStorageListChangedListener
|
||||
public interface OnStorageListChangedListener
|
||||
{
|
||||
void onStorageListChanged(List<StorageItem> storageItems, int currentStorageIndex);
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
package app.organicmaps.sdk.sound;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.database.ContentObserver;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
@@ -10,9 +9,9 @@ import android.provider.Settings;
|
||||
import android.speech.tts.TextToSpeech;
|
||||
import android.speech.tts.UtteranceProgressListener;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Pair;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
@@ -43,6 +42,9 @@ public enum TtsPlayer
|
||||
private static final float SPEECH_RATE = 1.0f;
|
||||
private static final int TTS_SPEAK_DELAY_MILLIS = 50;
|
||||
|
||||
@Nullable
|
||||
private static List<Pair<String, String>> sSupportedLanguages = null;
|
||||
|
||||
public static Runnable sOnReloadCallback = null;
|
||||
|
||||
private ContentObserver mTtsEngineObserver;
|
||||
@@ -286,19 +288,15 @@ public enum TtsPlayer
|
||||
|
||||
private boolean getUsableLanguages(List<LanguageData> outList)
|
||||
{
|
||||
Resources resources = mContext.getResources();
|
||||
String[] codes = resources.getStringArray(R.array.tts_languages_supported);
|
||||
String[] names = resources.getStringArray(R.array.tts_language_names);
|
||||
|
||||
for (int i = 0; i < codes.length; i++)
|
||||
for (final Pair<String, String> langNamePair : getSupportedLanguages())
|
||||
{
|
||||
try
|
||||
{
|
||||
outList.add(new LanguageData(codes[i], names[i], mTts));
|
||||
outList.add(new LanguageData(langNamePair.first, langNamePair.second, mTts));
|
||||
}
|
||||
catch (LanguageData.NotAvailableException ignored)
|
||||
catch (LanguageData.NotAvailableException ex)
|
||||
{
|
||||
Logger.w(TAG, "Failed to get usable languages " + ignored.getMessage());
|
||||
Logger.w(TAG, "Failed to get usable languages " + ex.getMessage());
|
||||
}
|
||||
catch (IllegalArgumentException e)
|
||||
{
|
||||
@@ -351,8 +349,20 @@ public enum TtsPlayer
|
||||
return res;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private List<Pair<String, String>> getSupportedLanguages()
|
||||
{
|
||||
if (sSupportedLanguages == null)
|
||||
{
|
||||
sSupportedLanguages = nativeGetSupportedLanguages();
|
||||
}
|
||||
return sSupportedLanguages;
|
||||
}
|
||||
|
||||
private native static void nativeEnableTurnNotifications(boolean enable);
|
||||
private native static boolean nativeAreTurnNotificationsEnabled();
|
||||
private native static void nativeSetTurnNotificationsLocale(String code);
|
||||
private native static String nativeGetTurnNotificationsLocale();
|
||||
@NonNull
|
||||
private native static List<Pair<String, String>> nativeGetSupportedLanguages();
|
||||
}
|
||||
|
||||
@@ -231,7 +231,7 @@ public final class Config
|
||||
return defaultTheme;
|
||||
}
|
||||
|
||||
static void setCurrentUiTheme(@NonNull Context context, @NonNull String theme)
|
||||
public static void setCurrentUiTheme(@NonNull Context context, @NonNull String theme)
|
||||
{
|
||||
if (getCurrentUiTheme(context).equals(theme))
|
||||
return;
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package app.organicmaps.sdk.util;
|
||||
|
||||
import app.organicmaps.BuildConfig;
|
||||
|
||||
public final class Constants
|
||||
{
|
||||
public static final int KB = 1024;
|
||||
@@ -36,13 +34,6 @@ public final class Constants
|
||||
private Url() {}
|
||||
}
|
||||
|
||||
public static class Email
|
||||
{
|
||||
public static final String SUPPORT = BuildConfig.SUPPORT_MAIL;
|
||||
|
||||
private Email() {}
|
||||
}
|
||||
|
||||
public static class Package
|
||||
{
|
||||
public static final String FB_PACKAGE = "com.facebook.katana";
|
||||
|
||||
@@ -11,6 +11,10 @@ import java.util.Locale;
|
||||
|
||||
public class StringUtils
|
||||
{
|
||||
public static String toSnakeCase(String input)
|
||||
{
|
||||
return input.replaceAll("([a-z])([A-Z]+)", "$1_$2").toLowerCase();
|
||||
}
|
||||
public static String formatUsingUsLocale(String pattern, Object... args)
|
||||
{
|
||||
return String.format(Locale.US, pattern, args);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.organicmaps.widget.placepage;
|
||||
package app.organicmaps.sdk.widget.placepage;
|
||||
|
||||
public enum CoordinatesFormat
|
||||
{
|
||||
@@ -65,7 +65,7 @@ class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.SearchDataViewHol
|
||||
@AttrRes
|
||||
int getTintAttr()
|
||||
{
|
||||
return androidx.appcompat.R.attr.colorAccent;
|
||||
return com.google.android.material.R.attr.colorSecondary;
|
||||
}
|
||||
|
||||
abstract TextView getTitleView();
|
||||
|
||||
@@ -26,12 +26,12 @@ import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmFragment;
|
||||
import app.organicmaps.downloader.CountrySuggestFragment;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.bookmarks.data.FeatureId;
|
||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.location.LocationListener;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.search.SearchEngine;
|
||||
import app.organicmaps.sdk.search.SearchListener;
|
||||
import app.organicmaps.sdk.search.SearchRecents;
|
||||
|
||||
@@ -8,7 +8,7 @@ import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.search.SearchRecents;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.widget.SearchToolbarController;
|
||||
|
||||
@@ -10,7 +10,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmRecyclerFragment;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.widget.PlaceholderView;
|
||||
import app.organicmaps.widget.SearchToolbarController;
|
||||
|
||||
@@ -92,7 +92,7 @@ class TabAdapter extends FragmentPagerAdapter
|
||||
editor.putInt(Config.KEY_PREF_LAST_SEARCHED_TAB, tab.getPosition());
|
||||
editor.apply();
|
||||
super.onTabSelected(tab);
|
||||
Graphics.tint(mContext, tab.getIcon(), androidx.appcompat.R.attr.colorAccent);
|
||||
Graphics.tint(mContext, tab.getIcon(), com.google.android.material.R.attr.colorSecondary);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -11,7 +11,7 @@ import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.widget.SwitchCompat;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmToolbarFragment;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.routing.RoutingOptions;
|
||||
import app.organicmaps.sdk.settings.RoadType;
|
||||
import java.util.ArrayList;
|
||||
|
||||
@@ -35,8 +35,8 @@ import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.NetworkPolicy;
|
||||
import app.organicmaps.sdk.util.PowerManagment;
|
||||
import app.organicmaps.sdk.util.SharedPropertiesUtils;
|
||||
import app.organicmaps.sdk.util.ThemeSwitcher;
|
||||
import app.organicmaps.sdk.util.log.LogsManager;
|
||||
import app.organicmaps.util.ThemeSwitcher;
|
||||
import app.organicmaps.util.Utils;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import java.util.ArrayList;
|
||||
|
||||
@@ -11,6 +11,8 @@ import android.view.ViewGroup;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.CheckedTextView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.settings.StorageItem;
|
||||
import app.organicmaps.sdk.settings.StoragePathManager;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
|
||||
|
||||
@@ -12,6 +12,8 @@ import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.annotation.NonNull;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.settings.StorageItem;
|
||||
import app.organicmaps.sdk.settings.StoragePathManager;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.StorageUtils;
|
||||
import app.organicmaps.sdk.util.concurrency.ThreadPool;
|
||||
|
||||
@@ -326,9 +326,9 @@ public class VoiceInstructionsSettingsFragment extends BaseXmlSettingsFragment
|
||||
final String ttsLinkText = getString(R.string.prefs_languages_information_off_link);
|
||||
final Spannable link = new SpannableString(ttsLinkText + "↗");
|
||||
// Set link color.
|
||||
link.setSpan(
|
||||
new ForegroundColorSpan(ContextCompat.getColor(
|
||||
requireContext(), UiUtils.getStyledResourceId(requireContext(), androidx.appcompat.R.attr.colorAccent))),
|
||||
link.setSpan(new ForegroundColorSpan(ContextCompat.getColor(
|
||||
requireContext(),
|
||||
UiUtils.getStyledResourceId(requireContext(), com.google.android.material.R.attr.colorSecondary))),
|
||||
0, ttsLinkText.length(), 0);
|
||||
ttsLangInfoLink.setSummary(link);
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.organicmaps.sdk.util;
|
||||
package app.organicmaps.util;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.UiModeManager;
|
||||
@@ -10,12 +10,11 @@ import androidx.appcompat.app.AppCompatDelegate;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.downloader.DownloaderStatusIcon;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.MapStyle;
|
||||
import app.organicmaps.sdk.display.DisplayManager;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import java.util.Calendar;
|
||||
|
||||
public enum ThemeSwitcher
|
||||
@@ -150,6 +149,7 @@ public enum ThemeSwitcher
|
||||
*
|
||||
* @return theme_light/dark string
|
||||
*/
|
||||
@NonNull
|
||||
private String calcAutoTheme()
|
||||
{
|
||||
String defaultTheme = mContext.getResources().getString(R.string.theme_default);
|
||||
@@ -41,12 +41,15 @@ import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.Constants;
|
||||
import app.organicmaps.sdk.util.Distance;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import app.organicmaps.sdk.util.log.LogsManager;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.time.LocalTime;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@Keep
|
||||
public class Utils
|
||||
@@ -259,7 +262,7 @@ public class Utils
|
||||
subject =
|
||||
activity.getString(R.string.project_name) + " Bug Report" + (TextUtils.isEmpty(subject) ? "" : ": " + subject);
|
||||
LogsManager.INSTANCE.zipLogs(
|
||||
new SupportInfoWithLogsCallback(launcher, activity, subject, body, Constants.Email.SUPPORT));
|
||||
new SupportInfoWithLogsCallback(launcher, activity, subject, body, BuildConfig.SUPPORT_MAIL));
|
||||
}
|
||||
|
||||
// TODO: Don't send logs with general feedback, send system information only (version, device name, connectivity,
|
||||
@@ -268,7 +271,7 @@ public class Utils
|
||||
@NonNull Activity activity)
|
||||
{
|
||||
LogsManager.INSTANCE.zipLogs(new SupportInfoWithLogsCallback(
|
||||
launcher, activity, activity.getString(R.string.project_name) + " Feedback", "", Constants.Email.SUPPORT));
|
||||
launcher, activity, activity.getString(R.string.project_name) + " Feedback", "", BuildConfig.SUPPORT_MAIL));
|
||||
}
|
||||
|
||||
public static void navigateToParent(@NonNull Activity activity)
|
||||
@@ -460,4 +463,30 @@ public class Utils
|
||||
return getPackageInfoOld(manager, packageName, flags);
|
||||
return manager.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(flags));
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static CharSequence formatRoutingTime(Context context, int seconds, @DimenRes int unitsSize)
|
||||
{
|
||||
return formatRoutingTime(context, seconds, unitsSize, R.dimen.text_size_routing_number);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static CharSequence formatRoutingTime(Context context, int seconds, @DimenRes int unitsSize,
|
||||
@DimenRes int textSize)
|
||||
{
|
||||
long minutes = TimeUnit.SECONDS.toMinutes(seconds) % 60;
|
||||
long hours = TimeUnit.SECONDS.toHours(seconds);
|
||||
String min = context.getString(R.string.minute);
|
||||
String hour = context.getString(R.string.hour);
|
||||
SpannableStringBuilder displayedH = Utils.formatTime(context, textSize, unitsSize, String.valueOf(hours), hour);
|
||||
SpannableStringBuilder displayedM = Utils.formatTime(context, textSize, unitsSize, String.valueOf(minutes), min);
|
||||
return hours == 0 ? displayedM : TextUtils.concat(displayedH + "\u00A0", displayedM);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static String formatArrivalTime(int seconds)
|
||||
{
|
||||
final LocalTime time = LocalTime.now().plusSeconds(seconds);
|
||||
return StringUtils.formatUsingUsLocale("%d:%02d", time.getHour(), time.getMinute());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,7 +240,8 @@ public class SearchToolbarController extends ToolbarController implements View.O
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public OnBackPressedCallback getBackPressedCallback() {
|
||||
public OnBackPressedCallback getBackPressedCallback()
|
||||
{
|
||||
return mBackPressedCallback;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ public class MyPositionButton
|
||||
if (mode == LocationState.FOLLOW || mode == LocationState.FOLLOW_AND_ROTATE
|
||||
|| mode == LocationState.PENDING_POSITION)
|
||||
{
|
||||
colorAttr = androidx.appcompat.R.attr.colorAccent;
|
||||
colorAttr = com.google.android.material.R.attr.colorSecondary;
|
||||
if (mode == LocationState.PENDING_POSITION)
|
||||
sizeDimen = R.dimen.map_button_size;
|
||||
else
|
||||
|
||||
@@ -166,8 +166,8 @@ public class NavMenu
|
||||
|
||||
public void refreshTts()
|
||||
{
|
||||
mTts.setImageDrawable(TtsPlayer.isEnabled()
|
||||
? Graphics.tint(mActivity, R.drawable.ic_voice_on, androidx.appcompat.R.attr.colorAccent)
|
||||
mTts.setImageDrawable(TtsPlayer.isEnabled() ? Graphics.tint(mActivity, R.drawable.ic_voice_on,
|
||||
com.google.android.material.R.attr.colorSecondary)
|
||||
: Graphics.tint(mActivity, R.drawable.ic_voice_off));
|
||||
}
|
||||
|
||||
|
||||
@@ -6,24 +6,29 @@ import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.GridView;
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmDialogFragment;
|
||||
import app.organicmaps.bookmarks.IconsAdapter;
|
||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||
import app.organicmaps.sdk.bookmarks.data.Icon;
|
||||
import app.organicmaps.bookmarks.ColorsAdapter;
|
||||
import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import java.util.List;
|
||||
|
||||
public class BookmarkColorDialogFragment extends BaseMwmDialogFragment
|
||||
{
|
||||
public static final String ICON_TYPE = "ExtraIconType";
|
||||
public static final String ICON_COLOR = "ExtraIconColor";
|
||||
public static final String ICON_RES = "ExtraIconRes";
|
||||
|
||||
@PredefinedColors.Color
|
||||
private int mIconColor;
|
||||
|
||||
@DrawableRes
|
||||
private int mIconResId = app.organicmaps.sdk.R.drawable.ic_bookmark_none;
|
||||
|
||||
public interface OnBookmarkColorChangeListener
|
||||
{
|
||||
void onBookmarkColorSet(int colorPos);
|
||||
void onBookmarkColorSet(@PredefinedColors.Color int color);
|
||||
}
|
||||
|
||||
private OnBookmarkColorChangeListener mColorSetListener;
|
||||
@@ -35,7 +40,12 @@ public class BookmarkColorDialogFragment extends BaseMwmDialogFragment
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState)
|
||||
{
|
||||
if (getArguments() != null)
|
||||
mIconColor = getArguments().getInt(ICON_TYPE);
|
||||
{
|
||||
if (getArguments().containsKey(ICON_COLOR))
|
||||
mIconColor = getArguments().getInt(ICON_COLOR);
|
||||
if (getArguments().containsKey(ICON_RES))
|
||||
mIconResId = getArguments().getInt(ICON_RES);
|
||||
}
|
||||
|
||||
return new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
|
||||
.setView(buildView())
|
||||
@@ -49,19 +59,20 @@ public class BookmarkColorDialogFragment extends BaseMwmDialogFragment
|
||||
mColorSetListener = listener;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private View buildView()
|
||||
{
|
||||
final List<Icon> icons = BookmarkManager.ICONS;
|
||||
final IconsAdapter adapter = new IconsAdapter(requireActivity(), icons);
|
||||
final List<Integer> colors = PredefinedColors.getAllPredefinedColors();
|
||||
final ColorsAdapter adapter = new ColorsAdapter(requireActivity(), colors, mIconResId);
|
||||
adapter.chooseItem(mIconColor);
|
||||
|
||||
@SuppressLint("InflateParams")
|
||||
final GridView gView =
|
||||
(GridView) LayoutInflater.from(requireActivity()).inflate(R.layout.fragment_color_grid, null);
|
||||
gView.setAdapter(adapter);
|
||||
gView.setOnItemClickListener((arg0, who, pos, id) -> {
|
||||
gView.setOnItemClickListener((parent, view, pos, id) -> {
|
||||
if (mColorSetListener != null)
|
||||
mColorSetListener.onBookmarkColorSet(pos);
|
||||
mColorSetListener.onBookmarkColorSet(adapter.getItem(pos));
|
||||
dismiss();
|
||||
});
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ import app.organicmaps.sdk.bookmarks.data.BookmarkCategory;
|
||||
import app.organicmaps.sdk.bookmarks.data.BookmarkInfo;
|
||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||
import app.organicmaps.sdk.bookmarks.data.Icon;
|
||||
import app.organicmaps.sdk.bookmarks.data.PredefinedColors;
|
||||
import app.organicmaps.sdk.bookmarks.data.Track;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.util.Graphics;
|
||||
@@ -304,9 +305,12 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
||||
|
||||
final Bundle args = new Bundle();
|
||||
if (mTrack != null)
|
||||
args.putInt(BookmarkColorDialogFragment.ICON_TYPE, mTrack.getColor());
|
||||
args.putInt(BookmarkColorDialogFragment.ICON_COLOR, PredefinedColors.getPredefinedColorIndex(mColor));
|
||||
else
|
||||
args.putInt(BookmarkColorDialogFragment.ICON_TYPE, mIcon.getColor());
|
||||
{
|
||||
args.putInt(BookmarkColorDialogFragment.ICON_COLOR, mIcon.getColor());
|
||||
args.putInt(BookmarkColorDialogFragment.ICON_RES, mIcon.getResId());
|
||||
}
|
||||
final FragmentManager manager = getChildFragmentManager();
|
||||
String className = BookmarkColorDialogFragment.class.getName();
|
||||
final FragmentFactory factory = manager.getFragmentFactory();
|
||||
@@ -317,17 +321,16 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
||||
{
|
||||
case TYPE_BOOKMARK ->
|
||||
dialogFragment.setOnColorSetListener(colorPos -> {
|
||||
final Icon newIcon = BookmarkManager.ICONS.get(colorPos);
|
||||
if (mIcon.getColor() == newIcon.getColor())
|
||||
if (mIcon != null && mIcon.getColor() == colorPos)
|
||||
return;
|
||||
|
||||
mIcon = newIcon;
|
||||
mIcon = new Icon(colorPos, mIcon.getType());
|
||||
refreshColorMarker();
|
||||
});
|
||||
case TYPE_TRACK ->
|
||||
dialogFragment.setOnColorSetListener(colorPos -> {
|
||||
int from = mTrack.getColor();
|
||||
int to = BookmarkManager.ICONS.get(colorPos).argb();
|
||||
int to = PredefinedColors.getColor(colorPos);
|
||||
if (from == to)
|
||||
return;
|
||||
mColor = to;
|
||||
@@ -342,8 +345,7 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
||||
{
|
||||
if (mIcon != null)
|
||||
{
|
||||
Drawable circle =
|
||||
Graphics.drawCircleAndImage(mIcon.argb(), R.dimen.track_circle_size, app.organicmaps.sdk.R.drawable.ic_bookmark_none,
|
||||
final Drawable circle = Graphics.drawCircleAndImage(mIcon.argb(), R.dimen.track_circle_size, mIcon.getResId(),
|
||||
R.dimen.bookmark_icon_size, requireContext());
|
||||
mIvColor.setImageDrawable(circle);
|
||||
}
|
||||
|
||||
@@ -10,11 +10,11 @@ import androidx.annotation.Nullable;
|
||||
import androidx.core.widget.NestedScrollView;
|
||||
import app.organicmaps.ChartController;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.bookmarks.data.ElevationInfo;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.widget.placepage.PlacePageData;
|
||||
import app.organicmaps.util.Utils;
|
||||
import java.util.Objects;
|
||||
|
||||
@SuppressWarnings("unused") // https://github.com/organicmaps/organicmaps/issues/2829
|
||||
@@ -72,8 +72,8 @@ public class ElevationProfileViewRenderer implements PlacePageStateListener
|
||||
mMaxAltitude.setText(formatDistance(context, mElevationInfo.getMaxAltitude()));
|
||||
mMinAltitude.setText(formatDistance(context, mElevationInfo.getMinAltitude()));
|
||||
UiUtils.hideIf(mElevationInfo.getDuration() == 0, mTimeContainer);
|
||||
mTime.setText(RoutingController.formatRoutingTime(mTitle.getContext(), (int) mElevationInfo.getDuration(),
|
||||
R.dimen.text_size_body_2));
|
||||
mTime.setText(
|
||||
Utils.formatRoutingTime(mTitle.getContext(), (int) mElevationInfo.getDuration(), R.dimen.text_size_body_2));
|
||||
}
|
||||
|
||||
@NonNull
|
||||
|
||||
@@ -25,15 +25,15 @@ import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.api.Const;
|
||||
import app.organicmaps.intent.Factory;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.sdk.ChoosePositionMode;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
import app.organicmaps.sdk.bookmarks.data.RoadWarningMarkType;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.settings.RoadType;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
import app.organicmaps.sdk.ChoosePositionMode;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetItem;
|
||||
|
||||
@@ -30,8 +30,7 @@ import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.downloader.DownloaderStatusIcon;
|
||||
import app.organicmaps.editor.OhState; //pastk: move?
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.editor.OhState;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.bookmarks.data.DistanceAndAzimut;
|
||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
@@ -39,15 +38,17 @@ import app.organicmaps.sdk.bookmarks.data.Metadata;
|
||||
import app.organicmaps.sdk.downloader.CountryItem;
|
||||
import app.organicmaps.sdk.downloader.MapManager;
|
||||
import app.organicmaps.sdk.editor.Editor;
|
||||
import app.organicmaps.sdk.editor.OpeningHours; //pastk: a part of Editor?
|
||||
import app.organicmaps.sdk.editor.OpeningHours;
|
||||
import app.organicmaps.sdk.editor.data.HoursMinutes;
|
||||
import app.organicmaps.sdk.editor.data.Timetable;
|
||||
import app.organicmaps.sdk.location.LocationListener;
|
||||
import app.organicmaps.sdk.location.SensorListener;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.DateUtils;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||
import app.organicmaps.sdk.widget.placepage.CoordinatesFormat;
|
||||
import app.organicmaps.util.SharingUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.widget.ArrowView;
|
||||
@@ -477,8 +478,9 @@ public class PlacePageView extends Fragment
|
||||
MaterialTextView mTvAddPlace = mAddPlace.findViewById(R.id.tv__editor);
|
||||
final int editPlaceButtonColor =
|
||||
Editor.nativeShouldEnableEditPlace()
|
||||
? ContextCompat.getColor(getContext(),
|
||||
UiUtils.getStyledResourceId(getContext(), androidx.appcompat.R.attr.colorAccent))
|
||||
? ContextCompat.getColor(
|
||||
getContext(),
|
||||
UiUtils.getStyledResourceId(getContext(), com.google.android.material.R.attr.colorSecondary))
|
||||
: getResources().getColor(R.color.button_accent_text_disabled);
|
||||
mTvEditPlace.setTextColor(editPlaceButtonColor);
|
||||
mTvAddBusiness.setTextColor(editPlaceButtonColor);
|
||||
|
||||
@@ -14,10 +14,10 @@ import androidx.lifecycle.Observer;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.editor.data.TimeFormatUtils;
|
||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
import app.organicmaps.sdk.bookmarks.data.Metadata;
|
||||
import app.organicmaps.sdk.editor.OpeningHours;
|
||||
import app.organicmaps.editor.data.TimeFormatUtils;
|
||||
import app.organicmaps.sdk.editor.data.Timespan;
|
||||
import app.organicmaps.sdk.editor.data.Timetable;
|
||||
import app.organicmaps.sdk.util.UiUtils;
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body3"
|
||||
android:fontFamily="@string/robotoMedium"
|
||||
android:textColor="?colorAccent"
|
||||
android:textColor="?colorSecondary"
|
||||
android:gravity="center"
|
||||
tools:text="↗ 43 m ↘ 88 m"
|
||||
tools:visibility="visible" />
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
app:layout_constraintTop_toBottomOf="@id/street_frame"
|
||||
app:lanesActiveLaneTintColor="?navLaneArrowActiveColor"
|
||||
app:lanesInactiveLaneTintColor="?navLaneArrowInactiveColor"
|
||||
app:lanesBackgroundColor="?colorAccent"
|
||||
app:lanesBackgroundColor="?colorSecondary"
|
||||
app:lanesCornerRadius="@dimen/margin_quarter"
|
||||
app:lanesEditModeLanesCount="10"
|
||||
tools:visibility="visible" />
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
android:layout_width="@dimen/downloader_status_size"
|
||||
android:layout_height="@dimen/downloader_status_size"
|
||||
android:layout_gravity="center"
|
||||
app:wheelProgressColor="?colorAccent"
|
||||
app:wheelProgressColor="?colorSecondary"
|
||||
app:wheelSecondaryColor="?dividerHorizontal"
|
||||
app:wheelThickness="@dimen/margin_eighth"
|
||||
android:visibility="visible"
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
android:layout_height="@dimen/altitude_chart_time_distance_height"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body3"
|
||||
android:fontFamily="@string/robotoMedium"
|
||||
android:textColor="?colorAccent"
|
||||
android:textColor="?colorSecondary"
|
||||
android:visibility="gone"
|
||||
tools:text="43 m"
|
||||
tools:visibility="visible"/>
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body3"
|
||||
android:fontFamily="@string/robotoMedium"
|
||||
android:textColor="?colorAccent"
|
||||
android:textColor="?colorSecondary"
|
||||
android:gravity="center"
|
||||
tools:text="↗ 43 m ↘ 88 m"
|
||||
tools:visibility="visible" />
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
android:layout_alignParentEnd="true"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body3"
|
||||
android:fontFamily="@string/robotoMedium"
|
||||
android:textColor="?colorAccent"
|
||||
android:textColor="?colorSecondary"
|
||||
android:visibility="gone"
|
||||
tools:text="43 m"
|
||||
tools:visibility="visible"/>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
android:layout_width="90dp"
|
||||
android:layout_height="90dp"
|
||||
app:srcCompat="@drawable/ic_download"
|
||||
app:tint="?android:colorAccent"/>
|
||||
app:tint="?colorSecondary"/>
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/head_message"
|
||||
style="?fontHeadline6"
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
android:layout_height="@dimen/altitude_chart_time_distance_height"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body3"
|
||||
android:fontFamily="@string/robotoMedium"
|
||||
android:textColor="?colorAccent"
|
||||
android:textColor="?colorSecondary"
|
||||
android:layout_gravity="end"
|
||||
android:gravity="center"
|
||||
android:visibility="gone"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
android:layout_marginStart="@dimen/margin_base"
|
||||
android:text="@string/download_country_ask"
|
||||
android:textAppearance="?fontBody2"
|
||||
app:buttonTint="?colorAccent"
|
||||
app:buttonTint="?colorSecondary"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"/>
|
||||
<com.google.android.material.progressindicator.LinearProgressIndicator
|
||||
@@ -26,7 +26,7 @@
|
||||
android:layout_marginEnd="@dimen/margin_base_plus"
|
||||
android:layout_marginBottom="@dimen/margin_base"
|
||||
android:indeterminate="false"
|
||||
app:indicatorColor="?android:colorAccent"
|
||||
app:indicatorColor="?colorSecondary"
|
||||
app:trackColor="@color/bg_routing_progress"/>
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/btn_download_resources"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user