Compare commits
116 Commits
hb0nd-url-
...
2025.08.10
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1e358375c6 | ||
|
|
c3d0689d8a | ||
|
|
607191503c | ||
|
|
7ec05f16e5 | ||
|
|
b41bad5ea4 | ||
|
|
1e22b678e2 | ||
|
|
f88b0afa58 | ||
|
|
d7ece38279 | ||
|
|
722fc5e333 | ||
|
|
f05a9c9eb4 | ||
|
|
07c26a5ab8 | ||
|
|
8f5c8a5bd7 | ||
|
|
04246a55f2 | ||
|
|
b096199695 | ||
|
|
5de22c6de8 | ||
|
|
d7f73f4b9b | ||
|
|
d5ce81b20b | ||
|
|
905a823490 | ||
|
|
b195059fb6 | ||
|
|
460a7fa480 | ||
|
|
e65ab6e458 | ||
|
|
effc8ba5d1 | ||
|
|
014b54b1f7 | ||
|
|
a25ae124d7 | ||
|
|
372a7a90c5 | ||
|
|
9bd6e2cdf2 | ||
|
|
c2cc61e4d9 | ||
|
|
e3fa656f4f | ||
|
|
d7216b7ccc | ||
|
|
aaa61f7f75 | ||
|
|
ccfd2107f3 | ||
|
|
45ec96dd3c | ||
|
|
dd7739a8b2 | ||
|
|
ae0ef4d3f8 | ||
|
|
68d1ead44c | ||
|
|
09de87fd29 | ||
|
|
1a241121c4 | ||
|
|
fdeeb1ae34 | ||
|
|
c2bd2b897a | ||
|
|
e39b5eb507 | ||
|
|
96ef33a401 | ||
|
|
c6dcfc71bf | ||
|
|
053fe3c143 | ||
|
|
c6439aaa82 | ||
|
|
e50a668feb | ||
|
|
5ce753bd5c | ||
|
|
8058183f72 | ||
|
|
07f745411f | ||
|
|
2004c9bfc1 | ||
|
|
1e7715d10f | ||
|
|
e884e32bb6 | ||
|
|
660694aee0 | ||
|
|
99fa3ec551 | ||
|
|
f26db1a79b | ||
|
|
1151f0fb75 | ||
|
|
bbb28107b8 | ||
|
|
9c7b39fd5b | ||
|
|
0d9514bee9 | ||
|
|
a036edc9c5 | ||
|
|
90492e95e6 | ||
|
|
fc199252eb | ||
|
|
327d302aae | ||
|
|
0b8bd42cb0 | ||
|
|
962ee67833 | ||
|
|
69e3fdca90 | ||
|
|
ac8f945455 | ||
|
|
c8a4726500 | ||
|
|
40adb0f860 | ||
|
|
c600a4fd5d | ||
|
|
07420a3f19 | ||
|
|
3920988ef4 | ||
|
|
6136abb33a | ||
|
|
a0e40c98d7 | ||
|
|
3bdaa44c3a | ||
|
|
945c6205a0 | ||
|
|
ef4fd85883 | ||
|
|
83db427c40 | ||
|
|
946fea1e07 | ||
|
|
bd80e9160d | ||
|
|
5333ad3597 | ||
|
|
65b5234396 | ||
|
|
969c805182 | ||
|
|
8b03e99035 | ||
|
|
3aabde338a | ||
|
|
d5d86ffd36 | ||
|
|
d4cef9385b | ||
|
|
9c495ca616 | ||
|
|
a08f3df3e6 | ||
|
|
bb5da20fec | ||
|
|
e112dc2ac4 | ||
|
|
3e2e6cb487 | ||
|
|
21020429cb | ||
|
|
07025ff696 | ||
|
|
c13da0f0a2 | ||
|
|
dd023b65c7 | ||
|
|
0c8648d1e3 | ||
|
|
760e050110 | ||
|
|
db4b46f8ad | ||
|
|
29ebd8b725 | ||
|
|
6b53d1fb91 | ||
|
|
d1da6c197e | ||
|
|
0dc8d69375 | ||
|
|
3352279d9d | ||
|
|
6da8b69a1b | ||
|
|
fe1c371b5f | ||
|
|
309eed2365 | ||
|
|
979c713436 | ||
|
|
5e8a8de646 | ||
|
|
b0bdd2c665 | ||
|
|
dd949925f6 | ||
|
|
b37572000f | ||
|
|
332ab819b2 | ||
|
|
860f58e60e | ||
|
|
0e7d8a65cc | ||
|
|
4c6207a8ce | ||
|
|
b96afc6fbb |
@@ -1,48 +1,59 @@
|
|||||||
# Configuration file for clang-format, based on docs/CPP_STYLE.md.
|
# Configuration file for clang-format, based on docs/CPP_STYLE.md.
|
||||||
|
|
||||||
---
|
|
||||||
BasedOnStyle: Google
|
BasedOnStyle: Google
|
||||||
|
|
||||||
AccessModifierOffset: -2
|
AccessModifierOffset: -2
|
||||||
|
AlignAfterOpenBracket: Align
|
||||||
|
AlignArrayOfStructures: Right
|
||||||
|
AlignConsecutiveMacros: AcrossEmptyLinesAndComments
|
||||||
|
AlignEscapedNewlines: LeftWithLastLine
|
||||||
AlignOperands: AlignAfterOperator
|
AlignOperands: AlignAfterOperator
|
||||||
AllowShortBlocksOnASingleLine: Empty
|
AllowShortBlocksOnASingleLine: Empty
|
||||||
|
AllowShortCaseLabelsOnASingleLine: true
|
||||||
|
AllowShortFunctionsOnASingleLine: Inline
|
||||||
AllowShortIfStatementsOnASingleLine: Never
|
AllowShortIfStatementsOnASingleLine: Never
|
||||||
AllowShortLoopsOnASingleLine: false
|
AllowShortLoopsOnASingleLine: false
|
||||||
AllowShortCaseLabelsOnASingleLine: true
|
|
||||||
BraceWrapping:
|
BraceWrapping:
|
||||||
AfterCaseLabel: true
|
AfterCaseLabel: true
|
||||||
AfterClass: true
|
AfterClass: true
|
||||||
AfterControlStatement: Always
|
AfterControlStatement: Always
|
||||||
AfterEnum: true
|
AfterEnum: true
|
||||||
|
AfterExternBlock: true
|
||||||
AfterFunction: true
|
AfterFunction: true
|
||||||
AfterNamespace: true
|
AfterNamespace: true
|
||||||
AfterObjCDeclaration: true
|
AfterObjCDeclaration: true
|
||||||
AfterStruct: true
|
AfterStruct: true
|
||||||
AfterUnion: true
|
AfterUnion: true
|
||||||
AfterExternBlock: true
|
|
||||||
BeforeCatch: true
|
BeforeCatch: true
|
||||||
BeforeElse: true
|
BeforeElse: true
|
||||||
BeforeLambdaBody: true
|
BeforeLambdaBody: true
|
||||||
BeforeWhile: true
|
BeforeWhile: true
|
||||||
IndentBraces: false
|
|
||||||
SplitEmptyFunction: false
|
SplitEmptyFunction: false
|
||||||
SplitEmptyRecord: false
|
|
||||||
SplitEmptyNamespace: false
|
SplitEmptyNamespace: false
|
||||||
|
SplitEmptyRecord: false
|
||||||
|
BinPackArguments: true
|
||||||
|
BinPackParameters: true
|
||||||
|
BreakAfterJavaFieldAnnotations: true
|
||||||
BreakBeforeBraces: Custom
|
BreakBeforeBraces: Custom
|
||||||
BreakConstructorInitializers: BeforeComma
|
BreakConstructorInitializers: BeforeComma
|
||||||
BreakInheritanceList: BeforeComma
|
BreakInheritanceList: BeforeComma
|
||||||
ColumnLimit: 120
|
ColumnLimit: 120
|
||||||
ConstructorInitializerIndentWidth: 2
|
ConstructorInitializerIndentWidth: 2
|
||||||
ContinuationIndentWidth: 2
|
ContinuationIndentWidth: 4
|
||||||
DerivePointerAlignment: false
|
DerivePointerAlignment: false
|
||||||
IncludeBlocks: Preserve
|
IncludeBlocks: Preserve
|
||||||
IndentCaseLabels: false
|
IndentAccessModifiers: false
|
||||||
IndentExternBlock: NoIndent
|
IndentExternBlock: NoIndent
|
||||||
|
InsertBraces: false
|
||||||
InsertNewlineAtEOF: true
|
InsertNewlineAtEOF: true
|
||||||
PackConstructorInitializers: Never
|
LambdaBodyIndentation: OuterScope
|
||||||
|
PackConstructorInitializers: CurrentLine
|
||||||
PointerAlignment: Middle
|
PointerAlignment: Middle
|
||||||
|
RemoveBracesLLVM: true
|
||||||
QualifierAlignment: Right
|
QualifierAlignment: Right
|
||||||
SpacesInContainerLiterals: false
|
SpacesInContainerLiterals: false
|
||||||
Standard: Latest
|
Standard: Latest
|
||||||
TabWidth: 2
|
TabWidth: 2
|
||||||
UseTab: Never
|
|
||||||
|
---
|
||||||
|
Language: Java
|
||||||
|
AllowShortFunctionsOnASingleLine: Empty
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
name: 🐞 Bug Report
|
name: 🐞 Bug Report
|
||||||
description: Report a problem you've encountered
|
description: Report a problem you've encountered
|
||||||
title: "bug: "
|
|
||||||
labels:
|
labels:
|
||||||
- bug
|
- bug
|
||||||
body:
|
body:
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
name: "💡 Feature Request"
|
name: "💡 Feature Request"
|
||||||
description: "Suggest an idea or improvement for CoMaps"
|
description: "Suggest an idea or improvement for CoMaps"
|
||||||
title: "feat: "
|
|
||||||
labels:
|
labels:
|
||||||
- "enhancement"
|
- "enhancement"
|
||||||
body:
|
body:
|
||||||
|
|||||||
@@ -32,13 +32,12 @@ on:
|
|||||||
- track_generator/**
|
- track_generator/**
|
||||||
- xcode/**
|
- xcode/**
|
||||||
|
|
||||||
env:
|
|
||||||
JAVA_HOME: /usr/lib/jvm/temurin-17-jdk-amd64 # Java 17 is required for Android Gradle 8 plugin
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
android-google-beta:
|
android-google-beta:
|
||||||
name: Android Google Beta
|
name: Android Google Beta
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: runmymind/docker-android-sdk:latest
|
||||||
environment: beta
|
environment: beta
|
||||||
steps:
|
steps:
|
||||||
- name: Install build tools and dependencies
|
- name: Install build tools and dependencies
|
||||||
@@ -71,10 +70,6 @@ jobs:
|
|||||||
SECURE_PROPERTIES: ${{ secrets.SECURE_PROPERTIES }}
|
SECURE_PROPERTIES: ${{ secrets.SECURE_PROPERTIES }}
|
||||||
RELEASE_KEYSTORE: ${{ secrets.RELEASE_KEYSTORE }}
|
RELEASE_KEYSTORE: ${{ secrets.RELEASE_KEYSTORE }}
|
||||||
|
|
||||||
- name: Configure repository
|
|
||||||
shell: bash
|
|
||||||
run: ./configure.sh
|
|
||||||
|
|
||||||
- name: Compile
|
- name: Compile
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: android
|
working-directory: android
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
android-check-metadata:
|
android-check-metadata:
|
||||||
name: Check app metadata
|
name: Check app metadata
|
||||||
runs-on: ubuntu-latest
|
runs-on: codeberg-tiny
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|||||||
@@ -34,13 +34,12 @@ on:
|
|||||||
- track_generator/**
|
- track_generator/**
|
||||||
- xcode/**
|
- xcode/**
|
||||||
|
|
||||||
env:
|
|
||||||
JAVA_HOME: /usr/lib/jvm/temurin-17-jdk-amd64 # Java 17 is required for Android Gradle 8 plugin
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
name: Android Lint
|
name: Android Lint
|
||||||
runs-on: ubuntu-latest
|
runs-on: codeberg-tiny
|
||||||
|
container:
|
||||||
|
image: runmymind/docker-android-sdk:latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -51,10 +50,6 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
||||||
|
|
||||||
- name: Configure repository
|
|
||||||
shell: bash
|
|
||||||
run: ./configure.sh
|
|
||||||
|
|
||||||
- name: Lint
|
- name: Lint
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: android
|
working-directory: android
|
||||||
@@ -63,6 +58,8 @@ jobs:
|
|||||||
android-check:
|
android-check:
|
||||||
name: Build Android Debug
|
name: Build Android Debug
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: runmymind/docker-android-sdk:latest
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -93,10 +90,6 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
||||||
|
|
||||||
- name: Configure repository
|
|
||||||
shell: bash
|
|
||||||
run: ./configure.sh
|
|
||||||
|
|
||||||
- name: Configure ccache
|
- name: Configure ccache
|
||||||
uses: hendrikmuhs/ccache-action@v1.2
|
uses: hendrikmuhs/ccache-action@v1.2
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -4,12 +4,9 @@ on:
|
|||||||
schedule:
|
schedule:
|
||||||
- cron: '0 5 * * 0' # Once per week at 05:00 UTC
|
- cron: '0 5 * * 0' # Once per week at 05:00 UTC
|
||||||
|
|
||||||
env:
|
|
||||||
JAVA_HOME: /usr/lib/jvm/temurin-17-jdk-amd64 # Java 17 is required for Android Gradle 8 plugin
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
precondition:
|
precondition:
|
||||||
runs-on: ubuntu-latest
|
runs-on: codeberg-tiny
|
||||||
name: Check preconditions
|
name: Check preconditions
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
@@ -34,6 +31,8 @@ jobs:
|
|||||||
android-google-beta:
|
android-google-beta:
|
||||||
name: Android Google Beta
|
name: Android Google Beta
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: runmymind/docker-android-sdk:latest
|
||||||
needs: precondition
|
needs: precondition
|
||||||
if: ${{ needs.precondition.outputs.updated != '' }}
|
if: ${{ needs.precondition.outputs.updated != '' }}
|
||||||
environment: beta
|
environment: beta
|
||||||
@@ -73,10 +72,6 @@ jobs:
|
|||||||
SECURE_PROPERTIES: ${{ secrets.SECURE_PROPERTIES }}
|
SECURE_PROPERTIES: ${{ secrets.SECURE_PROPERTIES }}
|
||||||
RELEASE_KEYSTORE: ${{ secrets.RELEASE_KEYSTORE }}
|
RELEASE_KEYSTORE: ${{ secrets.RELEASE_KEYSTORE }}
|
||||||
|
|
||||||
- name: Configure repository
|
|
||||||
shell: bash
|
|
||||||
run: ./configure.sh
|
|
||||||
|
|
||||||
- name: Compile
|
- name: Compile
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: android
|
working-directory: android
|
||||||
|
|||||||
@@ -2,13 +2,12 @@ name: Android Release Metadata
|
|||||||
on:
|
on:
|
||||||
workflow_dispatch: # Manual trigger
|
workflow_dispatch: # Manual trigger
|
||||||
|
|
||||||
env:
|
|
||||||
JAVA_HOME: /usr/lib/jvm/temurin-17-jdk-amd64 # Java 17 is required for Android Gradle 8 plugin
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
android-release-metadata:
|
android-release-metadata:
|
||||||
name: Upload Google Play metadata
|
name: Upload Google Play metadata
|
||||||
runs-on: ubuntu-latest
|
runs-on: codeberg-tiny
|
||||||
|
container:
|
||||||
|
image: runmymind/docker-android-sdk:latest
|
||||||
environment: production
|
environment: production
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
|
|||||||
@@ -5,12 +5,13 @@ on:
|
|||||||
env:
|
env:
|
||||||
RELEASE_NOTES: android/app/src/google/play/release-notes/en-US/default.txt
|
RELEASE_NOTES: android/app/src/google/play/release-notes/en-US/default.txt
|
||||||
FDROID_VERSION: android/app/src/fdroid/play/version.yaml
|
FDROID_VERSION: android/app/src/fdroid/play/version.yaml
|
||||||
JAVA_HOME: /usr/lib/jvm/temurin-17-jdk-amd64 # Java 17 is required for Android Gradle 8 plugin
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
tag:
|
tag:
|
||||||
name: Tag
|
name: Tag
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: runmymind/docker-android-sdk:latest
|
||||||
environment: production
|
environment: production
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
@@ -117,10 +118,6 @@ jobs:
|
|||||||
SECURE_PROPERTIES: ${{ secrets.SECURE_PROPERTIES }}
|
SECURE_PROPERTIES: ${{ secrets.SECURE_PROPERTIES }}
|
||||||
RELEASE_KEYSTORE: ${{ secrets.RELEASE_KEYSTORE }}
|
RELEASE_KEYSTORE: ${{ secrets.RELEASE_KEYSTORE }}
|
||||||
|
|
||||||
- name: Configure repository
|
|
||||||
shell: bash
|
|
||||||
run: ./configure.sh
|
|
||||||
|
|
||||||
- name: Set up SDK
|
- name: Set up SDK
|
||||||
shell: bash
|
shell: bash
|
||||||
run: echo "sdk.dir=$ANDROID_SDK_ROOT" > android/local.properties
|
run: echo "sdk.dir=$ANDROID_SDK_ROOT" > android/local.properties
|
||||||
|
|||||||
@@ -3,20 +3,20 @@ on:
|
|||||||
workflow_dispatch: # Manual trigger
|
workflow_dispatch: # Manual trigger
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packaging/app.organicmaps.desktop.metainfo.xml
|
- packaging/app.comaps.comaps.metainfo.xml
|
||||||
- .forgejo/workflows/appstream-check.yaml # Run check on self change
|
- .forgejo/workflows/appstream-check.yaml # Run check on self change
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
validate-appstream:
|
validate-appstream:
|
||||||
name: Validate appstream metadata xml
|
name: Validate appstream metadata xml
|
||||||
runs-on: ubuntu-24.04
|
runs-on: codeberg-tiny
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
sparse-checkout: |
|
sparse-checkout: |
|
||||||
packaging/app.organicmaps.desktop.metainfo.xml
|
packaging/app.comaps.comaps.metainfo.xml
|
||||||
|
|
||||||
- name: Install appstream validator and flatpak Builder
|
- name: Install appstream validator and flatpak Builder
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -29,8 +29,8 @@ jobs:
|
|||||||
|
|
||||||
- name: Lint appstream data with flatpak Builder
|
- name: Lint appstream data with flatpak Builder
|
||||||
shell: bash
|
shell: bash
|
||||||
run: flatpak run --command=flatpak-builder-lint org.flatpak.Builder appstream packaging/app.organicmaps.desktop.metainfo.xml
|
run: flatpak run --command=flatpak-builder-lint org.flatpak.Builder appstream packaging/app.comaps.comaps.metainfo.xml
|
||||||
|
|
||||||
- name: Run appstreamcli in pedantic mode
|
- name: Run appstreamcli in pedantic mode
|
||||||
shell: bash
|
shell: bash
|
||||||
run: flatpak run --command=appstreamcli org.flatpak.Builder validate --pedantic packaging/app.organicmaps.desktop.metainfo.xml
|
run: flatpak run --command=appstreamcli org.flatpak.Builder validate --pedantic packaging/app.comaps.comaps.metainfo.xml
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ concurrency:
|
|||||||
jobs:
|
jobs:
|
||||||
should-run-check:
|
should-run-check:
|
||||||
name: Should run coverage
|
name: Should run coverage
|
||||||
runs-on: ubuntu-24.04
|
runs-on: codeberg-tiny
|
||||||
outputs:
|
outputs:
|
||||||
run-from-pr: ${{ steps.run-from-pr.outputs.run-from-pr }}
|
run-from-pr: ${{ steps.run-from-pr.outputs.run-from-pr }}
|
||||||
manually-triggered: ${{ steps.manually-triggered.outputs.manually-triggered }}
|
manually-triggered: ${{ steps.manually-triggered.outputs.manually-triggered }}
|
||||||
@@ -59,14 +59,9 @@ jobs:
|
|||||||
coverage:
|
coverage:
|
||||||
needs: should-run-check
|
needs: should-run-check
|
||||||
name: Generate coverage report
|
name: Generate coverage report
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-latest
|
||||||
if: ${{ needs.should-run-check.outputs.run-from-pr == 'true' || needs.should-run-check.outputs.manually-triggered == 'true'}}
|
if: ${{ needs.should-run-check.outputs.run-from-pr == 'true' || needs.should-run-check.outputs.manually-triggered == 'true'}}
|
||||||
steps:
|
steps:
|
||||||
- name: Free disk space by removing .NET, Android and Haskell
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc
|
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
@@ -94,10 +89,6 @@ jobs:
|
|||||||
llvm \
|
llvm \
|
||||||
gcovr
|
gcovr
|
||||||
|
|
||||||
- name: Configure repository
|
|
||||||
shell: bash
|
|
||||||
run: ./configure.sh
|
|
||||||
|
|
||||||
- name: Configure ccache
|
- name: Configure ccache
|
||||||
uses: hendrikmuhs/ccache-action@v1.2
|
uses: hendrikmuhs/ccache-action@v1.2
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -3,20 +3,20 @@ on:
|
|||||||
workflow_dispatch: # Manual trigger
|
workflow_dispatch: # Manual trigger
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- qt/res/app.organicmaps.desktop.desktop
|
- qt/res/app.comaps.comaps.desktop
|
||||||
- .forgejo/workflows/desktop-file-check.yaml # Run check on self change
|
- .forgejo/workflows/desktop-file-check.yaml # Run check on self change
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
validate-desktop-file:
|
validate-desktop-file:
|
||||||
name: Validate .desktop file
|
name: Validate .desktop file
|
||||||
runs-on: ubuntu-24.04
|
runs-on: codeberg-tiny
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
sparse-checkout: |
|
sparse-checkout: |
|
||||||
qt/res/app.organicmaps.desktop.desktop
|
qt/res/app.comaps.comaps.desktop
|
||||||
|
|
||||||
- name: Install desktop-file-validate tool
|
- name: Install desktop-file-validate tool
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -27,4 +27,4 @@ jobs:
|
|||||||
|
|
||||||
- name: Validate desktop file
|
- name: Validate desktop file
|
||||||
shell: bash
|
shell: bash
|
||||||
run: desktop-file-validate qt/res/app.organicmaps.desktop.desktop && echo "Successfully validated .desktop file"
|
run: desktop-file-validate qt/res/app.comaps.comaps.desktop && echo "Successfully validated .desktop file"
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
ios-check-metadata:
|
ios-check-metadata:
|
||||||
name: Check app metadata
|
name: Check app metadata
|
||||||
runs-on: ubuntu-latest
|
runs-on: codeberg-tiny
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|||||||
@@ -31,18 +31,13 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
linux-no-unity:
|
linux-no-unity:
|
||||||
name: Linux no unity build
|
name: Linux no unity build
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-latest
|
||||||
# Cancels previous jobs if the same branch or PR was updated again.
|
# Cancels previous jobs if the same branch or PR was updated again.
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-no-unity-${{ github.event.pull_request.number || github.ref }}
|
group: ${{ github.workflow }}-no-unity-${{ github.event.pull_request.number || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Free disk space by removing .NET, Android and Haskell
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc
|
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
@@ -71,10 +66,6 @@ jobs:
|
|||||||
libqt6positioning6-plugins \
|
libqt6positioning6-plugins \
|
||||||
libqt6positioning6
|
libqt6positioning6
|
||||||
|
|
||||||
- name: Configure repository
|
|
||||||
shell: bash
|
|
||||||
run: ./configure.sh
|
|
||||||
|
|
||||||
- name: Configure ccache
|
- name: Configure ccache
|
||||||
uses: hendrikmuhs/ccache-action@v1.2
|
uses: hendrikmuhs/ccache-action@v1.2
|
||||||
with:
|
with:
|
||||||
@@ -99,7 +90,7 @@ jobs:
|
|||||||
|
|
||||||
linux-matrix:
|
linux-matrix:
|
||||||
name: Linux builds and tests
|
name: Linux builds and tests
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -111,11 +102,6 @@ jobs:
|
|||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Free disk space by removing .NET, Android and Haskell
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc
|
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
@@ -142,10 +128,6 @@ jobs:
|
|||||||
libqt6positioning6-plugins \
|
libqt6positioning6-plugins \
|
||||||
libqt6positioning6
|
libqt6positioning6
|
||||||
|
|
||||||
- name: Configure repository
|
|
||||||
shell: bash
|
|
||||||
run: ./configure.sh
|
|
||||||
|
|
||||||
- name: Configure ccache
|
- name: Configure ccache
|
||||||
uses: hendrikmuhs/ccache-action@v1.2
|
uses: hendrikmuhs/ccache-action@v1.2
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -57,10 +57,6 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 brew install ninja qt@6
|
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 brew install ninja qt@6
|
||||||
|
|
||||||
- name: Configure repository
|
|
||||||
shell: bash
|
|
||||||
run: ./configure.sh
|
|
||||||
|
|
||||||
- name: Configure ccache
|
- name: Configure ccache
|
||||||
uses: hendrikmuhs/ccache-action@v1.2
|
uses: hendrikmuhs/ccache-action@v1.2
|
||||||
with:
|
with:
|
||||||
|
|||||||
9
.github/workflows/android-check.yaml
vendored
@@ -7,6 +7,7 @@ on:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_HOME: /usr/lib/jvm/temurin-17-jdk-amd64 # Java 17 is required for Android Gradle 8 plugin
|
JAVA_HOME: /usr/lib/jvm/temurin-17-jdk-amd64 # Java 17 is required for Android Gradle 8 plugin
|
||||||
|
SKIP_MAP_DOWNLOAD: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
@@ -22,10 +23,6 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
||||||
|
|
||||||
- name: Init boost, generate textures
|
|
||||||
shell: bash
|
|
||||||
run: ./configure.sh --skip-map-download
|
|
||||||
|
|
||||||
- name: Lint
|
- name: Lint
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: android
|
working-directory: android
|
||||||
@@ -76,10 +73,6 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
||||||
|
|
||||||
- name: Init boost, generate textures
|
|
||||||
shell: bash
|
|
||||||
run: ./configure.sh --skip-map-download
|
|
||||||
|
|
||||||
- name: Configure ccache
|
- name: Configure ccache
|
||||||
uses: hendrikmuhs/ccache-action@v1.2
|
uses: hendrikmuhs/ccache-action@v1.2
|
||||||
with:
|
with:
|
||||||
|
|||||||
43
.github/workflows/clang-format.yaml
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
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
|
||||||
2
.github/workflows/ios-check.yaml
vendored
@@ -37,7 +37,7 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: git submodule update --depth 1 --init --recursive --jobs=$(($(sysctl -n hw.logicalcpu) * 20))
|
run: git submodule update --depth 1 --init --recursive --jobs=$(($(sysctl -n hw.logicalcpu) * 20))
|
||||||
|
|
||||||
- name: Init boost, download World map, generate textures
|
- name: Configure repository
|
||||||
shell: bash
|
shell: bash
|
||||||
run: ./configure.sh
|
run: ./configure.sh
|
||||||
|
|
||||||
|
|||||||
19
.gitignore
vendored
@@ -14,18 +14,24 @@ stxxl.errlog
|
|||||||
stxxl.log
|
stxxl.log
|
||||||
screenlog.0
|
screenlog.0
|
||||||
|
|
||||||
data/styles/*/*/out/*
|
data/symbols/*/design/
|
||||||
data/resources-*_design/*
|
|
||||||
# symbols png/sdf are now generated at build
|
# symbols png/sdf are now generated at build
|
||||||
data/resources-*_*/symbols.png
|
data/symbols/**/symbols.png
|
||||||
data/resources-*_*/symbols.sdf
|
data/symbols/**/symbols.sdf
|
||||||
data/drules_proto_default_design.bin
|
|
||||||
data/colors_design.txt
|
data/colors_design.txt
|
||||||
data/patterns_design.txt
|
data/patterns_design.txt
|
||||||
data/bookmarks
|
data/bookmarks
|
||||||
data/edits.xml
|
data/edits.xml
|
||||||
data/World.mwm
|
data/World.mwm
|
||||||
data/WorldCoasts.mwm
|
data/WorldCoasts.mwm
|
||||||
|
data/world_mwm/*
|
||||||
|
data/*_hash
|
||||||
|
data/drules_proto*
|
||||||
|
data/classificator.txt
|
||||||
|
data/types.txt
|
||||||
|
data/visibility.txt
|
||||||
|
data/colors.txt
|
||||||
|
data/patterns.txt
|
||||||
|
|
||||||
# Compiled Python
|
# Compiled Python
|
||||||
*.pyc
|
*.pyc
|
||||||
@@ -46,8 +52,7 @@ omim.sdf
|
|||||||
*.rc
|
*.rc
|
||||||
!qt/res/windows.rc
|
!qt/res/windows.rc
|
||||||
*.pdb
|
*.pdb
|
||||||
out/*
|
out/
|
||||||
qt/mapswithme.log
|
|
||||||
|
|
||||||
# XCode
|
# XCode
|
||||||
xcode/keys/*
|
xcode/keys/*
|
||||||
|
|||||||
@@ -48,6 +48,8 @@ if (APPLE AND NOT ("${CMAKE_SYSTEM_NAME}" STREQUAL Android))
|
|||||||
set(CMAKE_OBJCXX_VISIBILITY_PRESET hidden)
|
set(CMAKE_OBJCXX_VISIBILITY_PRESET hidden)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
execute_process(COMMAND "./configure.sh" WORKING_DIRECTORY ${OMIM_ROOT})
|
||||||
|
|
||||||
message(STATUS "Using compiler ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
|
message(STATUS "Using compiler ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
|
||||||
|
|
||||||
if (CMAKE_UNITY_BUILD)
|
if (CMAKE_UNITY_BUILD)
|
||||||
@@ -269,5 +271,5 @@ endif()
|
|||||||
omim_add_test_subdirectory(qt_tstfrm)
|
omim_add_test_subdirectory(qt_tstfrm)
|
||||||
|
|
||||||
if (PLATFORM_ANDROID)
|
if (PLATFORM_ANDROID)
|
||||||
add_subdirectory(android/app/src/main/cpp)
|
add_subdirectory(android/sdk/src/main/cpp)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -53,6 +53,9 @@ A community-led free & open source maps app based on [OpenStreetMap](https://www
|
|||||||
<a href="https://f-droid.org/en/packages/app.comaps.fdroid/">
|
<a href="https://f-droid.org/en/packages/app.comaps.fdroid/">
|
||||||
<img src="docs/badges/fdroid.png" alt="F-Droid" width="160"/>
|
<img src="docs/badges/fdroid.png" alt="F-Droid" width="160"/>
|
||||||
</a>
|
</a>
|
||||||
|
<a href="https://apps.obtainium.imranr.dev/redirect?r=obtainium://add/https://codeberg.org/comaps/comaps">
|
||||||
|
<img src="docs/badges/obtainium.png" alt="Obtainium" width="160"/>
|
||||||
|
</a>
|
||||||
<a href="https://codeberg.org/comaps/comaps/releases">
|
<a href="https://codeberg.org/comaps/comaps/releases">
|
||||||
<img src="docs/badges/codeberg.png" alt="Codeberg" width="160"/>
|
<img src="docs/badges/codeberg.png" alt="Codeberg" width="160"/>
|
||||||
</a>
|
</a>
|
||||||
@@ -122,10 +125,8 @@ You can help by donating, contributing code, translating, or by telling others a
|
|||||||
|
|
||||||
- Build instructions: [docs/INSTALL.md](docs/INSTALL.md)
|
- Build instructions: [docs/INSTALL.md](docs/INSTALL.md)
|
||||||
- Contribution guide: [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md)
|
- Contribution guide: [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md)
|
||||||
> [!NOTE]
|
|
||||||
> Some docs might be outdated, contain broken links or old references to Organic Maps, etc. Its a work in progress and help is much appreciated!
|
|
||||||
|
|
||||||
There is a dedicated Zulip chat for active contributors: [Zulip](https://comaps.zulipchat.com)
|
There is a dedicated [Zulip](https://codeberg.org/comaps/Governance/src/branch/main/contribute.md#3-team-messaging) chat for active contributors.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -18,5 +18,4 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
|||||||
libxi-dev \
|
libxi-dev \
|
||||||
optipng
|
optipng
|
||||||
WORKDIR /root/comaps
|
WORKDIR /root/comaps
|
||||||
RUN ./configure.sh
|
|
||||||
CMD ./gradlew -Parm64 assembleFdroidDebug
|
CMD ./gradlew -Parm64 assembleFdroidDebug
|
||||||
|
|||||||
@@ -15,43 +15,17 @@ buildscript {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
mavenCentral()
|
|
||||||
maven { url 'https://www.jitpack.io' } // MPAndroidChart
|
|
||||||
}
|
|
||||||
|
|
||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
apply plugin: 'com.github.triplet.play'
|
apply plugin: 'com.github.triplet.play'
|
||||||
apply plugin: 'ru.cian.huawei-publish-gradle-plugin'
|
apply plugin: 'ru.cian.huawei-publish-gradle-plugin'
|
||||||
|
|
||||||
def run(cmd) {
|
|
||||||
def stdout = new ByteArrayOutputStream()
|
|
||||||
exec {
|
|
||||||
commandLine = cmd
|
|
||||||
standardOutput = stdout
|
|
||||||
}
|
|
||||||
return stdout.toString()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
import com.github.triplet.gradle.androidpublisher.ReleaseStatus
|
import com.github.triplet.gradle.androidpublisher.ReleaseStatus
|
||||||
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
|
|
||||||
|
|
||||||
def getVersion() {
|
|
||||||
def isWindows = DefaultNativePlatform.getCurrentOperatingSystem().isWindows()
|
|
||||||
def bash = isWindows ? 'C:\\Program Files\\Git\\bin\\bash.exe' : 'bash'
|
|
||||||
def versionCode = Integer.parseInt(run([bash, '../../tools/unix/version.sh', 'android_code']).trim())
|
|
||||||
def versionName = run([bash, '../../tools/unix/version.sh', 'android_name']).trim()
|
|
||||||
return new Tuple2(versionCode, versionName)
|
|
||||||
}
|
|
||||||
|
|
||||||
def getCommitMessage() {
|
def getCommitMessage() {
|
||||||
return run(['git', '--no-pager', 'show', '-s', '--format=%s%n%n%b', 'HEAD']).trim()
|
return run(['git', '--no-pager', 'show', '-s', '--format=%s%n%n%b', 'HEAD']).trim()
|
||||||
}
|
}
|
||||||
|
|
||||||
def osName = System.properties['os.name'].toLowerCase()
|
|
||||||
|
|
||||||
project.ext.appId = 'app.comaps'
|
project.ext.appId = 'app.comaps'
|
||||||
project.ext.appName = 'CoMaps'
|
project.ext.appName = 'CoMaps'
|
||||||
|
|
||||||
@@ -63,7 +37,10 @@ project.ext.appName = 'CoMaps'
|
|||||||
//}
|
//}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace 'app.organicmaps'
|
namespace = 'app.organicmaps'
|
||||||
|
|
||||||
|
// TODO: it should not be here, but in sdk/build.gradle. But for some reason it should be specified here as well.
|
||||||
|
ndkVersion = '28.2.13676358'
|
||||||
|
|
||||||
dependenciesInfo {
|
dependenciesInfo {
|
||||||
// Disables dependency metadata when building APKs (for IzzyOnDroid/F-Droid)
|
// Disables dependency metadata when building APKs (for IzzyOnDroid/F-Droid)
|
||||||
@@ -85,79 +62,23 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// All properties are read from gradle.properties file
|
// All properties are read from gradle.properties file
|
||||||
compileSdk propCompileSdkVersion.toInteger()
|
compileSdk = propCompileSdkVersion.toInteger()
|
||||||
|
|
||||||
ndkVersion '28.2.13676358'
|
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
// Default package name is taken from the manifest and should be app.comaps
|
versionCode = rootProject.ext.versionCode
|
||||||
def ver = getVersion()
|
versionName = rootProject.ext.versionName
|
||||||
versionCode = ver.V1
|
|
||||||
versionName = ver.V2
|
|
||||||
println('Version: ' + versionName)
|
println('Version: ' + versionName)
|
||||||
println('VersionCode: ' + versionCode)
|
println('VersionCode: ' + versionCode)
|
||||||
minSdk propMinSdkVersion.toInteger()
|
minSdk = propMinSdkVersion.toInteger()
|
||||||
targetSdk propTargetSdkVersion.toInteger()
|
targetSdk = propTargetSdkVersion.toInteger()
|
||||||
applicationId project.ext.appId
|
applicationId project.ext.appId
|
||||||
buildConfigField 'String', 'SUPPORT_MAIL', '"android@comaps.app"'
|
buildConfigField 'String', 'SUPPORT_MAIL', '"android@comaps.app"'
|
||||||
// Should be customized in flavors.
|
// Should be customized in flavors.
|
||||||
buildConfigField 'String', 'REVIEW_URL', '""'
|
buildConfigField 'String', 'REVIEW_URL', '""'
|
||||||
|
|
||||||
externalNativeBuild {
|
base.archivesName = appName.replaceAll('\\s','') + '-' + defaultConfig.versionCode
|
||||||
def pchFlag = 'OFF'
|
|
||||||
if (project.hasProperty('pch')) pchFlag = 'ON'
|
|
||||||
|
|
||||||
def njobs = ''
|
ndk.debugSymbolLevel = 'full'
|
||||||
if (project.hasProperty('njobs')) njobs = project.getProperty('njobs')
|
|
||||||
|
|
||||||
def enableVulkanDiagnostics = 'OFF'
|
|
||||||
if (project.hasProperty('enableVulkanDiagnostics')) {
|
|
||||||
enableVulkanDiagnostics = project.getProperty('enableVulkanDiagnostics')
|
|
||||||
}
|
|
||||||
|
|
||||||
def enableTrace = 'OFF'
|
|
||||||
if (project.hasProperty('enableTrace')) {
|
|
||||||
enableTrace = project.getProperty('enableTrace')
|
|
||||||
}
|
|
||||||
|
|
||||||
cmake {
|
|
||||||
cppFlags '-fexceptions', '-frtti'
|
|
||||||
// There is no sense to enable sections without gcc's --gc-sections flag.
|
|
||||||
cFlags '-fno-function-sections', '-fno-data-sections',
|
|
||||||
'-Wno-extern-c-compat'
|
|
||||||
arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=c++_static',
|
|
||||||
"-DOS=$osName", '-DSKIP_TESTS=ON', '-DSKIP_TOOLS=ON', "-DUSE_PCH=$pchFlag",
|
|
||||||
"-DNJOBS=$njobs", "-DENABLE_VULKAN_DIAGNOSTICS=$enableVulkanDiagnostics",
|
|
||||||
"-DENABLE_TRACE=$enableTrace"
|
|
||||||
targets 'organicmaps'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use, for example, -Parm32 gradle parameter to build only for armeabi-v7a.
|
|
||||||
ndk {
|
|
||||||
abiFilters = new HashSet<>()
|
|
||||||
if (project.hasProperty('arm32') || project.hasProperty('armeabi-v7a')) {
|
|
||||||
abiFilters.add('armeabi-v7a')
|
|
||||||
}
|
|
||||||
if (project.hasProperty('arm64') || project.hasProperty('arm64-v8a')) {
|
|
||||||
abiFilters.add('arm64-v8a')
|
|
||||||
}
|
|
||||||
if (project.hasProperty('x86')) {
|
|
||||||
abiFilters.add('x86')
|
|
||||||
}
|
|
||||||
if (project.hasProperty('x86_64') || project.hasProperty('x64')) {
|
|
||||||
abiFilters.add('x86_64')
|
|
||||||
}
|
|
||||||
if (abiFilters.isEmpty()) {
|
|
||||||
abiFilters.add('armeabi-v7a')
|
|
||||||
abiFilters.add('arm64-v8a')
|
|
||||||
// For the emulator, chromebooks and some Intel Atom devices.
|
|
||||||
abiFilters.add('x86_64')
|
|
||||||
}
|
|
||||||
println('Building for ' + abiFilters + ' archs.')
|
|
||||||
}
|
|
||||||
|
|
||||||
setProperty('archivesBaseName', appName.replaceAll('\\s','') + '-' + defaultConfig.versionCode)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
flavorDimensions += 'default'
|
flavorDimensions += 'default'
|
||||||
@@ -207,10 +128,10 @@ android {
|
|||||||
splits.abi {
|
splits.abi {
|
||||||
boolean enabled = project.hasProperty('splitApk')
|
boolean enabled = project.hasProperty('splitApk')
|
||||||
println ('Create separate apks: ' + enabled)
|
println ('Create separate apks: ' + enabled)
|
||||||
enable enabled
|
enable = enabled
|
||||||
reset()
|
reset()
|
||||||
include 'x86', 'armeabi-v7a', 'arm64-v8a', 'x86_64'
|
include 'x86', 'armeabi-v7a', 'arm64-v8a', 'x86_64'
|
||||||
universalApk true
|
universalApk = true
|
||||||
}
|
}
|
||||||
|
|
||||||
lint {
|
lint {
|
||||||
@@ -223,7 +144,7 @@ android {
|
|||||||
disable 'CustomSplashScreen'
|
disable 'CustomSplashScreen'
|
||||||
// https://github.com/organicmaps/organicmaps/issues/3610
|
// https://github.com/organicmaps/organicmaps/issues/3610
|
||||||
disable 'InsecureBaseConfiguration'
|
disable 'InsecureBaseConfiguration'
|
||||||
abortOnError true
|
abortOnError = true
|
||||||
}
|
}
|
||||||
|
|
||||||
gradle.projectsEvaluated {
|
gradle.projectsEvaluated {
|
||||||
@@ -282,33 +203,29 @@ android {
|
|||||||
debug {
|
debug {
|
||||||
applicationIdSuffix '.debug' // Allows to install debug and release builds together
|
applicationIdSuffix '.debug' // Allows to install debug and release builds together
|
||||||
versionNameSuffix '-debug'
|
versionNameSuffix '-debug'
|
||||||
jniDebuggable true // Enable jni debug build
|
|
||||||
zipAlignEnabled true
|
zipAlignEnabled true
|
||||||
signingConfig signingConfigs.debug
|
signingConfig = signingConfigs.debug
|
||||||
resValue 'string', 'app_name', 'CoMaps Debug'
|
resValue 'string', 'app_name', 'CoMaps Debug'
|
||||||
// Do not generate separate debug symbols for debug apps, because we don't distribute them.
|
|
||||||
ndk.debugSymbolLevel = 'none'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
release {
|
release {
|
||||||
if (taskName.contains('release')) {
|
if (taskName.contains('release')) {
|
||||||
if (secureReleasePropertiesFileExists) {
|
if (secureReleasePropertiesFileExists) {
|
||||||
println('Using RELEASE signing keys from secure.properties.release')
|
println('Using RELEASE signing keys from secure.properties.release')
|
||||||
signingConfig signingConfigs.release
|
signingConfig = signingConfigs.release
|
||||||
} else {
|
} else {
|
||||||
println('NO RELEASE signing keys found')
|
println('NO RELEASE signing keys found')
|
||||||
println('Using DEBUG signing keys')
|
println('Using DEBUG signing keys')
|
||||||
signingConfig signingConfigs.debug
|
signingConfig = signingConfigs.debug
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
minifyEnabled true
|
minifyEnabled true
|
||||||
shrinkResources true
|
shrinkResources = true
|
||||||
// Includes the default ProGuard rules files that are packaged with the Android Gradle plugin.
|
// Includes the default ProGuard rules files that are packaged with the Android Gradle plugin.
|
||||||
// To learn more, go to the documentation section about R8 configuration files.
|
// To learn more, go to the documentation section about R8 configuration files.
|
||||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
resValue 'string', 'app_name', project.ext.appName
|
resValue 'string', 'app_name', project.ext.appName
|
||||||
// Full size symbols are too big for Google, 217mb aab vs 95mb.
|
|
||||||
ndk.debugSymbolLevel = 'symbol_table'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
beta {
|
beta {
|
||||||
@@ -317,37 +234,27 @@ android {
|
|||||||
if (taskName.contains('beta')) {
|
if (taskName.contains('beta')) {
|
||||||
if (secureTestPropertiesFileExists) {
|
if (secureTestPropertiesFileExists) {
|
||||||
println('Using TEST signing keys from secure.properties.test')
|
println('Using TEST signing keys from secure.properties.test')
|
||||||
signingConfig signingConfigs.test
|
signingConfig = signingConfigs.test
|
||||||
} else {
|
} else {
|
||||||
println('NO TEST signing keys found')
|
println('NO TEST signing keys found')
|
||||||
println('Using DEBUG signing keys')
|
println('Using DEBUG signing keys')
|
||||||
signingConfig signingConfigs.debug
|
signingConfig = signingConfigs.debug
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
minifyEnabled true
|
minifyEnabled true
|
||||||
shrinkResources true
|
shrinkResources = true
|
||||||
// Includes the default ProGuard rules files that are packaged with the Android Gradle plugin.
|
// Includes the default ProGuard rules files that are packaged with the Android Gradle plugin.
|
||||||
// To learn more, go to the documentation section about R8 configuration files.
|
// To learn more, go to the documentation section about R8 configuration files.
|
||||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
matchingFallbacks = ['release'] // use dependencies of "release" build type
|
matchingFallbacks = ['release'] // use dependencies of "release" build type
|
||||||
resValue 'string', 'app_name', 'CoMaps Test'
|
resValue 'string', 'app_name', 'CoMaps Test'
|
||||||
// Full size symbols are too big for Google, 217mb aab vs 95mb.
|
|
||||||
ndk.debugSymbolLevel = 'symbol_table'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
externalNativeBuild {
|
|
||||||
cmake {
|
|
||||||
version '3.22.1+'
|
|
||||||
buildStagingDirectory './nativeOutputs'
|
|
||||||
path '../../CMakeLists.txt'
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We don't compress these extensions in assets/ because our random FileReader can't read zip-compressed files from apk.
|
// We don't compress these extensions in assets/ because our random FileReader can't read zip-compressed files from apk.
|
||||||
// TODO: Load all minor files via separate call to ReadAsString which can correctly handle compressed files in zip containers.
|
// TODO: Load all minor files via separate call to ReadAsString which can correctly handle compressed files in zip containers.
|
||||||
androidResources {
|
androidResources {
|
||||||
ignoreAssetsPattern '!.svn:!.git:!.DS_Store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~'
|
ignoreAssetsPattern = '!.svn:!.git:!.DS_Store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~'
|
||||||
noCompress = ['txt', 'bin', 'html', 'png', 'json', 'mwm', 'ttf', 'sdf', 'ui', 'config', 'csv', 'spv', 'obj']
|
noCompress = ['txt', 'bin', 'html', 'png', 'json', 'mwm', 'ttf', 'sdf', 'ui', 'config', 'csv', 'spv', 'obj']
|
||||||
localeFilters += [
|
localeFilters += [
|
||||||
"af",
|
"af",
|
||||||
@@ -404,7 +311,7 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
coreLibraryDesugaringEnabled true
|
coreLibraryDesugaringEnabled = true
|
||||||
|
|
||||||
sourceCompatibility JavaVersion.VERSION_17
|
sourceCompatibility JavaVersion.VERSION_17
|
||||||
targetCompatibility JavaVersion.VERSION_17
|
targetCompatibility JavaVersion.VERSION_17
|
||||||
@@ -412,6 +319,8 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation project(':sdk')
|
||||||
|
|
||||||
coreLibraryDesugaring libs.android.tools.desugar
|
coreLibraryDesugaring libs.android.tools.desugar
|
||||||
|
|
||||||
// Google Play Location Services
|
// Google Play Location Services
|
||||||
@@ -457,10 +366,6 @@ dependencies {
|
|||||||
testImplementation libs.mockito.core
|
testImplementation libs.mockito.core
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType(JavaCompile) {
|
|
||||||
options.compilerArgs << '-Xlint:unchecked' << '-Xlint:deprecation'
|
|
||||||
}
|
|
||||||
|
|
||||||
android.applicationVariants.all { variant ->
|
android.applicationVariants.all { variant ->
|
||||||
def authorityValue = variant.applicationId + ".provider"
|
def authorityValue = variant.applicationId + ".provider"
|
||||||
def authority = "\"" + authorityValue + "\""
|
def authority = "\"" + authorityValue + "\""
|
||||||
@@ -508,3 +413,7 @@ huaweiPublish {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tasks.withType(JavaCompile).configureEach {
|
||||||
|
options.compilerArgs << '-Xlint:unchecked' << '-Xlint:deprecation'
|
||||||
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 97 KiB |
@@ -0,0 +1 @@
|
|||||||
|
সহজ মানচিত্র নেভিগেশন - আপনার যাত্রা সম্পর্কে আরও জানুন - সম্প্রদায় কর্তৃক পরিচালিত
|
||||||
1
android/app/src/fdroid/play/listings/bn/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
কোম্যাপস - অফলাইনে হাইকিং, সাইকেলিং এবং ড্রাইভিং করুন গোপনীয়তা সহ
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Navegació intuïtiva - Descobreix el teu camí - El poder de la comunitat
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
Una aplicación de mapas gratuita y de código abierto liderada por la comunidad, basada en los datos de OpenStreetMap y reforzada con un compromiso con la transparencia, la privacidad y la ausencia de fines de lucro. CoMaps es un fork o derivado de Organic Maps, que a su vez es un fork de Maps.ME.
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
Lee más sobre los motivos del proyecto y su dirección en <b><i>codeberg.org/comaps</i></b>.
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
Únete allí a la comunidad y ayuda a crear la mejor app de mapas
|
||||||
|
|
||||||
|
• Usa la aplicación y corre la voz sobre ella
|
||||||
|
|
||||||
|
• Envía comentarios y reporta problemas
|
||||||
|
|
||||||
|
• Actualiza los datos del mapa en la app o en el sitio web de OpenStreetMap
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
‣ <b>Enfocada en el uso sin conexión</b>: Planifica y navega tus viajes sin necesidad de conexión móvil, busca puntos de paso en rutas remotas, etc. Todas las funciones están diseñadas para funcionar sin conexión.
|
||||||
|
|
||||||
|
‣ <b>Respeta tu Privacidad</b>: La app está diseñada pensando en tu privacidad: no identifica personas, no rastrea y no recoge datos personales. Sin publicidad.
|
||||||
|
|
||||||
|
‣ <b>Sencilla y Pulida</b>: funciones esenciales fáciles de usar que simplemente funcionan.
|
||||||
|
|
||||||
|
‣ <b>Ahorra Batería y Espacio</b>: No consume la batería como otras apps de navegación. Los mapas compactos ahorran espacio valioso en tu teléfono.
|
||||||
|
|
||||||
|
‣ <b>Gratuita y Creada por la Comunidad</b>: Personas como tú ayudaron a construir la app añadiendo lugares a OpenStreetMap, probando funciones, dando opiniones y contribuyendo con desarrollo o financiación.
|
||||||
|
|
||||||
|
‣ <b>Toma de decisiones y finanzas abiertas y transparentes, sin ánimo de lucro y completamente de código abierto.</b>
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
<b>Funciones Principales</b>:
|
||||||
|
|
||||||
|
• Mapas detallados descargables con lugares que no aparecen en Google Maps
|
||||||
|
|
||||||
|
• Modo exterior con rutas de senderismo destacadas, campings, fuentes de agua, picos, curvas de nivel, etc.
|
||||||
|
|
||||||
|
• Caminos peatonales y carriles bici
|
||||||
|
|
||||||
|
• Puntos de interés como restaurantes, gasolineras, hoteles, tiendas, lugares turísticos y muchos más
|
||||||
|
|
||||||
|
• Búsqueda por nombre, dirección o categoría de punto de interés
|
||||||
|
|
||||||
|
• Navegación con indicaciones por voz para caminar, ir en bici o conducir
|
||||||
|
|
||||||
|
• Guarda tus lugares favoritos con un solo toque
|
||||||
|
|
||||||
|
• Artículos de Wikipedia sin conexión
|
||||||
|
|
||||||
|
• Capa de transporte subterráneo y rutas
|
||||||
|
|
||||||
|
• Grabación de rutas
|
||||||
|
|
||||||
|
• Exporta e importa favoritos y rutas en formatos KML, KMZ y GPX
|
||||||
|
|
||||||
|
• Modo oscuro para usar de noche
|
||||||
|
|
||||||
|
• Mejora los datos del mapa para todos usando un editor básico integrado
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
<b>La Libertad Está Aquí</b>
|
||||||
|
|
||||||
|
Descubre tu camino, navega el mundo con privacidad y con la comunidad como prioridad.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Navegación de mapa fácil - Descubre más en tu camino - Creado por la comunidad
|
||||||
1
android/app/src/fdroid/play/listings/es-ES/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Senderismo, ciclismo y conducción offline
|
||||||
@@ -1 +1 @@
|
|||||||
Navigation cartographique facile - Découvrez davantage de votre voyage - Propulsé par la communauté
|
Navigation cartographique facile - Vivez de grands voyages - Propulsé par la communauté
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Navigation facile del mappa – Discoperi tu viage – Alimentate per le communitate
|
||||||
@@ -1 +1 @@
|
|||||||
CoMaps - Mapas com Privacidade
|
CoMaps - Mapas e Navegação Offline com Privacidade
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Navegação fácil nos mapas - Descubra mais sobre o seu percurso - Feito por todos
|
||||||
1
android/app/src/fdroid/play/listings/pt-PT/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Mapas e Navegação - Offline e Privada
|
||||||
@@ -8,10 +8,10 @@ import android.app.PendingIntent;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.location.Location;
|
import android.location.Location;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.RequiresPermission;
|
import androidx.annotation.RequiresPermission;
|
||||||
|
import app.organicmaps.sdk.util.LocationUtils;
|
||||||
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
import com.google.android.gms.common.api.ApiException;
|
import com.google.android.gms.common.api.ApiException;
|
||||||
import com.google.android.gms.common.api.ResolvableApiException;
|
import com.google.android.gms.common.api.ResolvableApiException;
|
||||||
import com.google.android.gms.location.FusedLocationProviderClient;
|
import com.google.android.gms.location.FusedLocationProviderClient;
|
||||||
@@ -26,9 +26,6 @@ import com.google.android.gms.location.LocationSettingsStatusCodes;
|
|||||||
import com.google.android.gms.location.Priority;
|
import com.google.android.gms.location.Priority;
|
||||||
import com.google.android.gms.location.SettingsClient;
|
import com.google.android.gms.location.SettingsClient;
|
||||||
|
|
||||||
import app.organicmaps.sdk.util.LocationUtils;
|
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
|
||||||
|
|
||||||
class GoogleFusedLocationProvider extends BaseLocationProvider
|
class GoogleFusedLocationProvider extends BaseLocationProvider
|
||||||
{
|
{
|
||||||
private static final String TAG = GoogleFusedLocationProvider.class.getSimpleName();
|
private static final String TAG = GoogleFusedLocationProvider.class.getSimpleName();
|
||||||
@@ -72,9 +69,11 @@ class GoogleFusedLocationProvider extends BaseLocationProvider
|
|||||||
{
|
{
|
||||||
Logger.d(TAG);
|
Logger.d(TAG);
|
||||||
|
|
||||||
final LocationRequest locationRequest = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, interval)
|
final LocationRequest locationRequest =
|
||||||
// Wait a few seconds for accurate locations initially, when accurate locations could not be computed on the device immediately.
|
new LocationRequest
|
||||||
// https://github.com/organicmaps/organicmaps/issues/2149
|
.Builder(Priority.PRIORITY_HIGH_ACCURACY, interval)
|
||||||
|
// Wait a few seconds for accurate locations initially, when accurate locations could not be computed on the
|
||||||
|
// device immediately. https://github.com/organicmaps/organicmaps/issues/2149
|
||||||
.setWaitForAccurateLocation(true)
|
.setWaitForAccurateLocation(true)
|
||||||
// The desired location granularity should correspond to the client permission level. The client will be
|
// The desired location granularity should correspond to the client permission level. The client will be
|
||||||
// delivered fine locations while it has the Manifest.permission.ACCESS_FINE_LOCATION permission, coarse
|
// delivered fine locations while it has the Manifest.permission.ACCESS_FINE_LOCATION permission, coarse
|
||||||
@@ -90,10 +89,12 @@ class GoogleFusedLocationProvider extends BaseLocationProvider
|
|||||||
builder.setAlwaysShow(true); // improves the wording/appearance of the dialog
|
builder.setAlwaysShow(true); // improves the wording/appearance of the dialog
|
||||||
final LocationSettingsRequest locationSettingsRequest = builder.build();
|
final LocationSettingsRequest locationSettingsRequest = builder.build();
|
||||||
|
|
||||||
mSettingsClient.checkLocationSettings(locationSettingsRequest).addOnSuccessListener(locationSettingsResponse -> {
|
mSettingsClient.checkLocationSettings(locationSettingsRequest)
|
||||||
|
.addOnSuccessListener(locationSettingsResponse -> {
|
||||||
Logger.d(TAG, "Service is available");
|
Logger.d(TAG, "Service is available");
|
||||||
mFusedLocationClient.requestLocationUpdates(locationRequest, mCallback, Looper.myLooper());
|
mFusedLocationClient.requestLocationUpdates(locationRequest, mCallback, Looper.myLooper());
|
||||||
}).addOnFailureListener(e -> {
|
})
|
||||||
|
.addOnFailureListener(e -> {
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
int statusCode = ((ApiException) e).getStatusCode();
|
int statusCode = ((ApiException) e).getStatusCode();
|
||||||
@@ -104,10 +105,10 @@ class GoogleFusedLocationProvider extends BaseLocationProvider
|
|||||||
// 2. Google Location Accuracy a.k.a High Accuracy;
|
// 2. Google Location Accuracy a.k.a High Accuracy;
|
||||||
// 3. Both Wi-Fi && Mobile Data together (needed for 2).
|
// 3. Both Wi-Fi && Mobile Data together (needed for 2).
|
||||||
//
|
//
|
||||||
// PendingIntent below will show a special Google "For better experience... enable (1) and/or (2) and/or (3)"
|
// PendingIntent below will show a special Google "For better experience... enable (1) and/or (2) and/or
|
||||||
// dialog. This system dialog can change system settings if "Yes" is pressed. We can't do it from our app.
|
// (3)" dialog. This system dialog can change system settings if "Yes" is pressed. We can't do it from our
|
||||||
// However, we don't want to annoy a user who disabled (2) or (3) intentionally. GPS (1) is mandatory to
|
// app. However, we don't want to annoy a user who disabled (2) or (3) intentionally. GPS (1) is mandatory
|
||||||
// continue, while (2) and (3) are not dealbreakers here.
|
// to continue, while (2) and (3) are not dealbreakers here.
|
||||||
//
|
//
|
||||||
// See https://github.com/organicmaps/organicmaps/issues/3846
|
// See https://github.com/organicmaps/organicmaps/issues/3846
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
package app.organicmaps.sdk.location;
|
package app.organicmaps.sdk.location;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import com.google.android.gms.common.ConnectionResult;
|
|
||||||
import com.google.android.gms.common.GoogleApiAvailability;
|
|
||||||
|
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
|
import com.google.android.gms.common.ConnectionResult;
|
||||||
|
import com.google.android.gms.common.GoogleApiAvailability;
|
||||||
|
|
||||||
public class LocationProviderFactory
|
public class LocationProviderFactory
|
||||||
{
|
{
|
||||||
@@ -18,7 +16,8 @@ public class LocationProviderFactory
|
|||||||
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS;
|
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BaseLocationProvider getProvider(@NonNull Context context, @NonNull BaseLocationProvider.Listener listener)
|
public static BaseLocationProvider getProvider(@NonNull Context context,
|
||||||
|
@NonNull BaseLocationProvider.Listener listener)
|
||||||
{
|
{
|
||||||
if (isGoogleLocationAvailable(context) && Config.useGoogleServices())
|
if (isGoogleLocationAvailable(context) && Config.useGoogleServices())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
সহজ মানচিত্র নেভিগেশন - আপনার যাত্রা সম্পর্কে আরও জানুন - সম্প্রদায় কর্তৃক পরিচালিত
|
||||||
1
android/app/src/google/play/listings/bn/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - গোপনীয়তা সহ যাতায়াত
|
||||||
36
android/app/src/google/play/listings/ca/full-description.txt
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
CoMaps és una aplicació de mapes lliure i de codi obert a càrrec de la comunitat que es basa en les dades OpenStreetMap i es fonamenta en el compromís amb la transparència i la privadesa sense ànim de lucre.
|
||||||
|
|
||||||
|
Uneix-te a la comunitat i ajuda a crear la millor aplicació de mapes.
|
||||||
|
• Fes servir l'aplicació i recomana-la.
|
||||||
|
• Dona la teva opinió i comunica qualsevol problema.
|
||||||
|
• Actualitza les dades de mapes a l'aplicació o al web d'OpenStreetMap.
|
||||||
|
|
||||||
|
<i>Els teus comentaris i les valoracions de 5 estrelles són el que més ens ajuda.</i>
|
||||||
|
|
||||||
|
‣ <b>Disseny senzill i polit</b>: funcions bàsiques i fàcils de fer servir que funcionen i punt.
|
||||||
|
‣ <b>Centrada en l'ús sense connexió</b>: planifica viatges a l'estranger i navega sense haver d'accedir a les dades mòbils o cerca punts d'interès durant rutes d'excursionisme llargues. Totes les funcions de l'aplicació s'han dissenyat perquè funcionin sense connexió.
|
||||||
|
‣ <b>Respecte per la privadesa</b>: el disseny de l'aplicació prioritza la privadesa. No t'identifica, no fa cap seguiment i no recull dades personals. A més, no té anuncis.
|
||||||
|
‣ <b>Ús eficient de la bateria i l'espai</b>: consumeix menys bateria que altres aplicacions de navegació. Els mapes compactes ocupen molt poc espai al telèfon.
|
||||||
|
‣ <b>Lliure gràcies a la comunitat</b>: aquesta aplicació s'ha desenvolupat gràcies a persones com tu que han afegit llocs a OpenStreetMap, han provat funcions, n'han aportat comentaris i hi han contribuït amb diners i esforç.
|
||||||
|
‣ <b>És un projecte obert i transparent en les seves decisions i finances. No té cap ànim de lucre i és completament de codi obert.</b>
|
||||||
|
|
||||||
|
<b>Funcions principals</b>:
|
||||||
|
• Mapes detallats que es poden baixar i inclouen llocs que no apareixen a Google Maps
|
||||||
|
• Mode exterior en què es ressalten les rutes d'excursionisme, els llocs d'acampada, les fonts d'aigua, els pics i les línies de contorn, entre altres coses
|
||||||
|
• Zones per a vianants i carrils bici
|
||||||
|
• Punts d'interès, com ara restaurants, benzineres, hotels, botigues, atraccions turístiques i molt més
|
||||||
|
• Cerques per nom, adreça o categoria de punt d'interès
|
||||||
|
• Navegació amb indicacions per veu mentre camines, vas amb bicicleta o condueixes
|
||||||
|
• Adreces d'interès perquè desis els teus llocs preferits amb un toc
|
||||||
|
• Articles de Wikipedia sense connexió
|
||||||
|
• Capa de línies de metro amb direccions
|
||||||
|
• Enregistrament d'itineraris
|
||||||
|
• Exportació i importació d'adreces d'interès i itineraris en els formats KML, KMZ i GPX
|
||||||
|
• Mode fosc per fer servir l'aplicació a la nit
|
||||||
|
• Millora de les dades de mapes per a tothom amb un editor integrat bàsic
|
||||||
|
• Compatibilitat amb Android Auto
|
||||||
|
|
||||||
|
Pots informar de problemes a l'aplicació, suggerir idees i unir-te a la comunitat al web <b><i>comaps.app</i></b>.
|
||||||
|
|
||||||
|
<b>La llibertat ha arribat</b>
|
||||||
|
Descobreix el teu camí i explora el món amb la privadesa i la comunitat com a eix central!
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Navegació intuïtiva - Descobreix el teu camí - El poder de la comunitat
|
||||||
1
android/app/src/google/play/listings/ca/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps – Navega amb privadesa
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
En fællesskabsdrevet gratis og open source-kortapp baseret på OpenStreetMap-data og forstærket med en forpligtelse til gennemsigtighed, privatliv og non-profit.
|
||||||
|
|
||||||
|
Bliv en del af fællesskabet og vær med til at skabe den bedste kortapp
|
||||||
|
• Brug appen og fortæl andre om den
|
||||||
|
• Giv feedback og rapporter problemer
|
||||||
|
• Opdater kortdata i appen eller på OpenStreetMap-webstedet
|
||||||
|
|
||||||
|
<i>Din feedback og 5-stjernede anmeldelser er den bedste støtte for os!</i>
|
||||||
|
|
||||||
|
‣ <b>Enkel og poleret</b>: væsentlige, brugervenlige funktioner, der bare virker.
|
||||||
|
‣ <b>Offline-focused</b>: Planlæg og naviger på din rejse i udlandet uden behov for mobilfordbindelse, søg efter rutepunkter, mens du er på en lang vandretur osv. Alle app-funktioner er designet til at fungere offline..
|
||||||
|
‣ <b>Respekt for privatlivets fred</b>: Appen er designet med fokus på privatlivets fred – den identificerer ikke personer, sporer ikke og indsamler ikke personlige oplysninger. Annoncefri.
|
||||||
|
‣ <b>Sparer på batteriet og plads</b>: Dræner ikke dit batteri som andre navigationsapps. Kompakte kort sparer værdifuld plads på din telefon.
|
||||||
|
‣ <b>Gratis og udviklet af fællesskabet</b>: Folk som dig har været med til at udvikle appen ved at tilføje steder til OpenStreetMap, teste og give feedback på funktioner samt bidrage med deres udviklingskompetencer og penge.
|
||||||
|
‣ <b>Åben og gennemsigtig beslutningstagning og økonomi, non-profit og fuldstændig open source.</b>
|
||||||
|
|
||||||
|
<b>Vigtigste funktioner</b>:
|
||||||
|
• Detaljerede kort med steder, der ikke er tilgængelige på Google Maps, kan downloades.
|
||||||
|
• Udendørstilstand med fremhævede vandreruter, campingpladser, vandkilder, bjergtoppe, højdekurver osv.
|
||||||
|
• Gang- og cykelstier
|
||||||
|
• Interessepunkter som restauranter, tankstationer, hoteller, butikker, seværdigheder og meget mere
|
||||||
|
• Søg efter navn, adresse eller efter interessepunkt-kategori
|
||||||
|
• Navigation med stemmevejledning til gående, cyklende eller kørende
|
||||||
|
• Bogmærk dine yndlingssteder med ét enkelt tryk
|
||||||
|
• Offline Wikipedia-artikler
|
||||||
|
• Lag med metrolinjer og rutevejledning
|
||||||
|
• Sporoptagelse
|
||||||
|
• Eksportér og importér bogmærker og ruter i KML, KMZ, GPX-formater
|
||||||
|
• En mørk tilstand til brug om natten
|
||||||
|
• Forbedr kortdata for alle ved hjælp af en simpel, indbygget redigeringsfunktion
|
||||||
|
• Android Auto-understøttelse
|
||||||
|
|
||||||
|
Rapportér app-problemer, kom med forslag og bliv en del af vores fællesskab på <b><i>comaps.app</i></b> webstedet.
|
||||||
|
|
||||||
|
<b>Nu med frihed</b>
|
||||||
|
Udforsk din rejse, og navigér i verden med fokus på privatliv og fællesskab!
|
||||||
1
android/app/src/google/play/listings/da-DK/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Naviger med privatliv
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
Una aplicación de mapas gratuita y de código abierto liderada por la comunidad, basada en los datos de OpenStreetMap y reforzada con un compromiso con la transparencia, la privacidad y la ausencia de fines de lucro.
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
Únete a la comunidad y ayuda a crear la mejor app de mapas
|
||||||
|
|
||||||
|
• Usa la aplicación y corre la voz sobre ella
|
||||||
|
|
||||||
|
• Envía comentarios y reporta problemas
|
||||||
|
|
||||||
|
• Actualiza los datos del mapa en la app o en el sitio web de OpenStreetMap
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
<i>¡Tus comentarios y valoraciones de 5 estrellas son el mejor apoyo para nosotros!</i>
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
‣ <b>Sencilla y Pulida</b>: funciones esenciales fáciles de usar que simplemente funcionan.
|
||||||
|
|
||||||
|
‣ <b>Enfocada en el uso sin conexión</b>: Planifica y navega tus viajes sin necesidad de conexión móvil, busca puntos de paso en rutas remotas, etc. Todas las funciones están diseñadas para funcionar sin conexión.
|
||||||
|
|
||||||
|
‣ <b>Respeta tu Privacidad</b>: La app está diseñada pensando en tu privacidad: no identifica personas, no rastrea y no recoge datos personales. Sin publicidad.
|
||||||
|
|
||||||
|
‣ <b>Ahorra Batería y Espacio</b>: No consume la batería como otras apps de navegación. Los mapas compactos ahorran espacio valioso en tu teléfono.
|
||||||
|
|
||||||
|
‣ <b>Gratuita y Creada por la Comunidad</b>: Personas como tú ayudaron a construir la app añadiendo lugares a OpenStreetMap, probando funciones, dando opiniones y contribuyendo con desarrollo o financiación.
|
||||||
|
|
||||||
|
‣ <b>Toma de decisiones y finanzas abiertas y transparentes, sin ánimo de lucro y completamente de código abierto.</b>
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
<b>Funciones Principales</b>:
|
||||||
|
|
||||||
|
• Mapas detallados descargables con lugares que no aparecen en Google Maps
|
||||||
|
|
||||||
|
• Modo exterior con rutas de senderismo destacadas, campings, fuentes de agua, picos, curvas de nivel, etc.
|
||||||
|
|
||||||
|
• Caminos peatonales y carriles bici
|
||||||
|
|
||||||
|
• Puntos de interés como restaurantes, gasolineras, hoteles, tiendas, lugares turísticos y muchos más
|
||||||
|
|
||||||
|
• Búsqueda por nombre, dirección o categoría de punto de interés
|
||||||
|
|
||||||
|
• Navegación con indicaciones por voz para caminar, ir en bici o conducir
|
||||||
|
|
||||||
|
• Guarda tus lugares favoritos con un solo toque
|
||||||
|
|
||||||
|
• Artículos de Wikipedia sin conexión
|
||||||
|
|
||||||
|
• Capa de transporte subterráneo y rutas
|
||||||
|
|
||||||
|
• Grabación de rutas
|
||||||
|
|
||||||
|
• Exporta e importa favoritos y rutas en formatos KML, KMZ y GPX
|
||||||
|
|
||||||
|
• Modo oscuro para usar de noche
|
||||||
|
|
||||||
|
• Mejora los datos del mapa para todos usando un editor básico integrado
|
||||||
|
|
||||||
|
• Compatibilidad con Android Auto
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
Por favor, informa de errores, sugiere ideas y únete a nuestra comunidad en el sitio web <b><i>comaps.app</i></b>.
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
<b>La Libertad Está Aquí</b>
|
||||||
|
|
||||||
|
Descubre tu camino, navega el mundo con privacidad y con la comunidad como prioridad.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Navegación de mapa fácil - Descubre más en tu camino - Creado por la comunidad
|
||||||
1
android/app/src/google/play/listings/es-ES/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Navega con Privacidad
|
||||||
@@ -1 +1 @@
|
|||||||
Navigation cartographique facile - Propulsé par la communauté
|
Navigation cartographique facile - Vivez de grands voyages - Propulsé par la communauté
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Navigation facile del mappa – Discoperi tu viage – Alimentate per le communitate
|
||||||
1
android/app/src/google/play/listings/ia/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps – Naviga private
|
||||||
1
android/app/src/google/play/listings/ml-IN/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
കോമാപ്പ്സ് - സ്വകാര്യതയോടെ സഞ്ചരിക്കൂ
|
||||||
1
android/app/src/google/play/listings/pl-PL/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CoMaps - Nawigacja szanująca prywatność
|
||||||
@@ -1 +1 @@
|
|||||||
CoMaps - Navegue privadamente
|
CoMaps - Navegue Privadamente
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
CoMaps - Оффлайн навигация
|
CoMaps - Приватная навигация
|
||||||
|
|||||||
@@ -7,12 +7,12 @@ Topluluğa katılın ve en iyi harita uygulamasını oluşturmamıza yardım edi
|
|||||||
|
|
||||||
<i>Geri bildirimleriniz ve 5 yıldızlı yorumlarınız bizim için en iyi destektir!</i>
|
<i>Geri bildirimleriniz ve 5 yıldızlı yorumlarınız bizim için en iyi destektir!</i>
|
||||||
|
|
||||||
‣ <b>Basit ve Temiz</b>: Sadece temel, kullanımı basit, işe yarayan özellikler.
|
‣ <b>Basit ve Temiz</b>: Sadece temel, kullanımı basit ve işe yarayan özellikler.
|
||||||
‣ <b>Çevrimdışı Odaklı</b>: Mobil veriye ihtiyaç duymadan yurt dışı seyahatinizi planlayın ve gezin, uzun bir yürüyüş sırasında rotanızdaki noktaları bulun ve daha fazlası . Tüm özellikler çevrimdışı çalışmak üzere tasarlanmıştır.
|
‣ <b>Çevrimdışı Odaklı</b>: Mobil veriye ihtiyaç duymadan yurt dışı seyahatinizi planlayın ve gezin, uzun bir yürüyüş sırasında rotanızdaki noktaları bulun ve daha fazlası. Tüm özellikler çevrimdışı çalışmak üzere tasarlanmıştır.
|
||||||
‣ <b>Gizliliğe Saygılı</b>: Uygulama gizliliğe saygılı olarak tasarlanmıştır. Kullanıcı profilinizi çıkarmaz, sizi takip etmez ve kişisel bilgi toplamaz. Üstelik tamamen reklamsızdır.
|
‣ <b>Gizliliğe Saygılı</b>: Uygulama gizliliğe saygılı olarak tasarlanmıştır. Kullanıcı profilinizi çıkarmaz, sizi takip etmez ve kişisel bilgi toplamaz. Üstelik tamamen reklamsızdır.
|
||||||
‣ <b>Pil ve Depolamanızdan Tasarruf Eder</b>: Diğer navigasyon uygulamaları gibi pilinizi sömürmez. Compact maps değerli depolama alanınızdan tasarruf eder.
|
‣ <b>Pil ve Depolamanızdan Tasarruf Eder</b>: Diğer navigasyon uygulamaları gibi pilinizi sömürmez. Kompakt harita dosyaları, değerli depolama alanınızdan tasarruf eder.
|
||||||
‣ <b>Ücretsizdir ve Gücünü Topluluktan Alır</b>: Sizin gibi insanlar OpenStreetMap'e yer ekleyerek, yeni özellikleri test ederek, geri bildirimde bulunarak, program geliştirme becerileri ve bağışlarla katkıda bulunarak uygulamanın oluşturulmasına yardımcı oldu.
|
‣ <b>Ücretsizdir ve Gücünü Topluluktan Alır</b>: Sizin gibi insanlar OpenStreetMap'e yer ekleyerek, yeni özellikleri test ederek, geri bildirimde bulunarak, program geliştirme becerileri ve bağışlarla katkıda bulunarak bu uygulamanın oluşturulmasına yardımcı oldular.
|
||||||
‣ <b>Açık ve Şeffaf Şekilde Yürütülen Karar Alma ve Fonlama Süreçleri, Kâr Amacı Gütmez ve Tamamen Açık Kaynaklı.</b>
|
‣ <b>Açık ve Şeffaf Bir Şekilde Yürütülen Karar Alma ve Fonlama Süreçlerine Sahip, Kâr Amacı Gütmeyen ve Tamamen Açık Kaynaklı Bir Uygulama.</b>
|
||||||
|
|
||||||
<b>Ana Özellikler</b>:
|
<b>Ana Özellikler</b>:
|
||||||
• Google Haritalar'da bulunmayan yerleri içeren, çevrimdışı detaylı haritalar
|
• Google Haritalar'da bulunmayan yerleri içeren, çevrimdışı detaylı haritalar
|
||||||
|
|||||||
@@ -75,6 +75,7 @@
|
|||||||
android:backupInForeground="true"
|
android:backupInForeground="true"
|
||||||
android:fullBackupContent="@xml/backup_content"
|
android:fullBackupContent="@xml/backup_content"
|
||||||
android:dataExtractionRules="@xml/backup_content_v31"
|
android:dataExtractionRules="@xml/backup_content_v31"
|
||||||
|
android:enableOnBackInvokedCallback="false"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:localeConfig="@xml/locales_config"
|
android:localeConfig="@xml/locales_config"
|
||||||
@@ -376,6 +377,7 @@
|
|||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="app.organicmaps.downloader.DownloaderActivity"
|
android:name="app.organicmaps.downloader.DownloaderActivity"
|
||||||
|
android:enableOnBackInvokedCallback="true"
|
||||||
android:configChanges="orientation|screenLayout|screenSize"
|
android:configChanges="orientation|screenLayout|screenSize"
|
||||||
android:screenOrientation="fullUser"
|
android:screenOrientation="fullUser"
|
||||||
android:label="@string/download_maps"
|
android:label="@string/download_maps"
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../data/resources-6plus_dark
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../data/resources-6plus_light
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../data/resources-default
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../data/resources-hdpi_dark
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../data/resources-hdpi_light
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../data/resources-mdpi_dark
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../data/resources-mdpi_light
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../data/resources-xhdpi_dark
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../data/resources-xhdpi_light
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../data/resources-xxhdpi_dark
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../data/resources-xxhdpi_light
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../data/resources-xxxhdpi_dark
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../data/resources-xxxhdpi_light
|
|
||||||
@@ -5,10 +5,16 @@ import android.content.res.Resources;
|
|||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
|
import app.organicmaps.sdk.Framework;
|
||||||
|
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||||
|
import app.organicmaps.sdk.bookmarks.data.ElevationInfo;
|
||||||
|
import app.organicmaps.util.ThemeUtils;
|
||||||
|
import app.organicmaps.util.Utils;
|
||||||
|
import app.organicmaps.widget.placepage.AxisValueFormatter;
|
||||||
|
import app.organicmaps.widget.placepage.CurrentLocationMarkerView;
|
||||||
|
import app.organicmaps.widget.placepage.FloatingMarkerView;
|
||||||
import com.github.mikephil.charting.charts.LineChart;
|
import com.github.mikephil.charting.charts.LineChart;
|
||||||
import com.github.mikephil.charting.components.Legend;
|
import com.github.mikephil.charting.components.Legend;
|
||||||
import com.github.mikephil.charting.components.MarkerView;
|
import com.github.mikephil.charting.components.MarkerView;
|
||||||
@@ -20,16 +26,6 @@ import com.github.mikephil.charting.data.LineDataSet;
|
|||||||
import com.github.mikephil.charting.formatter.ValueFormatter;
|
import com.github.mikephil.charting.formatter.ValueFormatter;
|
||||||
import com.github.mikephil.charting.highlight.Highlight;
|
import com.github.mikephil.charting.highlight.Highlight;
|
||||||
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
|
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
|
||||||
|
|
||||||
import app.organicmaps.sdk.Framework;
|
|
||||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
|
||||||
import app.organicmaps.sdk.bookmarks.data.ElevationInfo;
|
|
||||||
import app.organicmaps.widget.placepage.AxisValueFormatter;
|
|
||||||
import app.organicmaps.widget.placepage.CurrentLocationMarkerView;
|
|
||||||
import app.organicmaps.widget.placepage.FloatingMarkerView;
|
|
||||||
import app.organicmaps.util.ThemeUtils;
|
|
||||||
import app.organicmaps.util.Utils;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -151,7 +147,7 @@ public class ChartController implements OnChartValueSelectedListener,
|
|||||||
mTrackId = info.getId();
|
mTrackId = info.getId();
|
||||||
List<Entry> values = new ArrayList<>();
|
List<Entry> values = new ArrayList<>();
|
||||||
|
|
||||||
for (ElevationInfo.Point point: info.getPoints())
|
for (ElevationInfo.Point point : info.getPoints())
|
||||||
values.add(new Entry((float) point.getDistance(), point.getAltitude()));
|
values.add(new Entry((float) point.getDistance(), point.getAltitude()));
|
||||||
|
|
||||||
LineDataSet set = new LineDataSet(values, "Elevation_profile_points");
|
LineDataSet set = new LineDataSet(values, "Elevation_profile_points");
|
||||||
@@ -184,15 +180,15 @@ public class ChartController implements OnChartValueSelectedListener,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onValueSelected(Entry e, Highlight h) {
|
public void onValueSelected(Entry e, Highlight h)
|
||||||
|
{
|
||||||
mFloatingMarkerView.updateOffsets(e, h);
|
mFloatingMarkerView.updateOffsets(e, h);
|
||||||
Highlight curPos = getCurrentPosHighlight();
|
Highlight curPos = getCurrentPosHighlight();
|
||||||
|
|
||||||
if (mCurrentPositionOutOfTrack)
|
if (mCurrentPositionOutOfTrack)
|
||||||
mChart.highlightValues(Collections.singletonList(h), Collections.singletonList(mFloatingMarkerView));
|
mChart.highlightValues(Collections.singletonList(h), Collections.singletonList(mFloatingMarkerView));
|
||||||
else
|
else
|
||||||
mChart.highlightValues(Arrays.asList(curPos, h), Arrays.asList(mCurrentLocationMarkerView,
|
mChart.highlightValues(Arrays.asList(curPos, h), Arrays.asList(mCurrentLocationMarkerView, mFloatingMarkerView));
|
||||||
mFloatingMarkerView));
|
|
||||||
if (mTrackId == Utils.INVALID_ID)
|
if (mTrackId == Utils.INVALID_ID)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import android.location.Location;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import androidx.activity.result.ActivityResultLauncher;
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
import androidx.activity.result.contract.ActivityResultContracts;
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
import androidx.annotation.CallSuper;
|
import androidx.annotation.CallSuper;
|
||||||
@@ -28,10 +27,10 @@ import androidx.annotation.StringRes;
|
|||||||
import androidx.annotation.StyleRes;
|
import androidx.annotation.StyleRes;
|
||||||
import androidx.core.view.ViewCompat;
|
import androidx.core.view.ViewCompat;
|
||||||
import app.organicmaps.base.BaseMwmFragmentActivity;
|
import app.organicmaps.base.BaseMwmFragmentActivity;
|
||||||
|
import app.organicmaps.intent.Factory;
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.downloader.CountryItem;
|
import app.organicmaps.sdk.downloader.CountryItem;
|
||||||
import app.organicmaps.sdk.downloader.MapManager;
|
import app.organicmaps.sdk.downloader.MapManager;
|
||||||
import app.organicmaps.intent.Factory;
|
|
||||||
import app.organicmaps.sdk.location.LocationListener;
|
import app.organicmaps.sdk.location.LocationListener;
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.ConnectionState;
|
import app.organicmaps.sdk.util.ConnectionState;
|
||||||
@@ -39,13 +38,11 @@ import app.organicmaps.sdk.util.StringUtils;
|
|||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
import app.organicmaps.util.Utils;
|
import app.organicmaps.util.Utils;
|
||||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||||
|
|
||||||
import com.google.android.material.button.MaterialButton;
|
import com.google.android.material.button.MaterialButton;
|
||||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import com.google.android.material.progressindicator.LinearProgressIndicator;
|
import com.google.android.material.progressindicator.LinearProgressIndicator;
|
||||||
import com.google.android.material.textview.MaterialTextView;
|
import com.google.android.material.textview.MaterialTextView;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@@ -81,10 +78,9 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
private int mCountryDownloadListenerSlot;
|
private int mCountryDownloadListenerSlot;
|
||||||
|
|
||||||
private final LocationListener mLocationListener = new LocationListener()
|
private final LocationListener mLocationListener = new LocationListener() {
|
||||||
{
|
|
||||||
@Override
|
@Override
|
||||||
public void onLocationUpdated(Location location)
|
public void onLocationUpdated(@NonNull Location location)
|
||||||
{
|
{
|
||||||
if (mCurrentCountry != null)
|
if (mCurrentCountry != null)
|
||||||
return;
|
return;
|
||||||
@@ -117,8 +113,8 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private final app.organicmaps.sdk.DownloadResourcesLegacyActivity.Listener mResourcesDownloadListener = new app.organicmaps.sdk.DownloadResourcesLegacyActivity.Listener()
|
private final app.organicmaps.sdk.DownloadResourcesLegacyActivity.Listener mResourcesDownloadListener =
|
||||||
{
|
new app.organicmaps.sdk.DownloadResourcesLegacyActivity.Listener() {
|
||||||
@Override
|
@Override
|
||||||
public void onProgress(final int percent)
|
public void onProgress(final int percent)
|
||||||
{
|
{
|
||||||
@@ -143,8 +139,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private final MapManager.StorageCallback mCountryDownloadListener = new MapManager.StorageCallback()
|
private final MapManager.StorageCallback mCountryDownloadListener = new MapManager.StorageCallback() {
|
||||||
{
|
|
||||||
@Override
|
@Override
|
||||||
public void onStatusChanged(List<MapManager.StorageCallbackData> data)
|
public void onStatusChanged(List<MapManager.StorageCallbackData> data)
|
||||||
{
|
{
|
||||||
@@ -237,8 +232,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
private void setDownloadMessage(int bytesToDownload)
|
private void setDownloadMessage(int bytesToDownload)
|
||||||
{
|
{
|
||||||
mTvMessage.setText(getString(R.string.download_resources,
|
mTvMessage.setText(getString(R.string.download_resources, StringUtils.getFileSizeString(this, bytesToDownload)));
|
||||||
StringUtils.getFileSizeString(this, bytesToDownload)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean prepareFilesDownload(boolean showMap)
|
private boolean prepareFilesDownload(boolean showMap)
|
||||||
@@ -375,7 +369,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
|||||||
CountryItem item = CountryItem.fill(mCurrentCountry);
|
CountryItem item = CountryItem.fill(mCurrentCountry);
|
||||||
String fileSizeString = StringUtils.getFileSizeString(this, item.totalSize);
|
String fileSizeString = StringUtils.getFileSizeString(this, item.totalSize);
|
||||||
mTvMessage.setText(getString(R.string.downloading_country_can_proceed, item.name, fileSizeString));
|
mTvMessage.setText(getString(R.string.downloading_country_can_proceed, item.name, fileSizeString));
|
||||||
mProgress.setMax((int)item.totalSize);
|
mProgress.setMax((int) item.totalSize);
|
||||||
mProgress.setProgressCompat(0, true);
|
mProgress.setProgressCompat(0, true);
|
||||||
|
|
||||||
mCountryDownloadListenerSlot = MapManager.nativeSubscribe(mCountryDownloadListener);
|
mCountryDownloadListenerSlot = MapManager.nativeSubscribe(mCountryDownloadListener);
|
||||||
@@ -399,8 +393,10 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
|||||||
if (mAlertDialog != null && mAlertDialog.isShowing())
|
if (mAlertDialog != null && mAlertDialog.isShowing())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@StringRes final int titleId;
|
@StringRes
|
||||||
@StringRes final int messageId = switch (result)
|
final int titleId;
|
||||||
|
@StringRes
|
||||||
|
final int messageId = switch (result)
|
||||||
{
|
{
|
||||||
case ERR_NOT_ENOUGH_FREE_SPACE ->
|
case ERR_NOT_ENOUGH_FREE_SPACE ->
|
||||||
{
|
{
|
||||||
@@ -415,7 +411,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
|||||||
case ERR_DOWNLOAD_ERROR ->
|
case ERR_DOWNLOAD_ERROR ->
|
||||||
{
|
{
|
||||||
titleId = R.string.connection_failure;
|
titleId = R.string.connection_failure;
|
||||||
yield (ConnectionState.INSTANCE.isConnected() ? R.string.download_has_failed
|
yield(ConnectionState.INSTANCE.isConnected() ? R.string.download_has_failed
|
||||||
: R.string.common_check_internet_connection_dialog);
|
: R.string.common_check_internet_connection_dialog);
|
||||||
}
|
}
|
||||||
case ERR_DISK_ERROR ->
|
case ERR_DISK_ERROR ->
|
||||||
@@ -431,7 +427,8 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
|||||||
.setMessage(messageId)
|
.setMessage(messageId)
|
||||||
.setCancelable(true)
|
.setCancelable(true)
|
||||||
.setOnCancelListener((dialog) -> setAction(PAUSE))
|
.setOnCancelListener((dialog) -> setAction(PAUSE))
|
||||||
.setPositiveButton(R.string.try_again, (dialog, which) -> {
|
.setPositiveButton(R.string.try_again,
|
||||||
|
(dialog, which) -> {
|
||||||
setAction(TRY_AGAIN);
|
setAction(TRY_AGAIN);
|
||||||
onTryAgainClicked();
|
onTryAgainClicked();
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -10,17 +10,14 @@ import android.view.SurfaceHolder;
|
|||||||
import android.view.SurfaceView;
|
import android.view.SurfaceView;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.core.content.res.ConfigurationHelper;
|
import androidx.core.content.res.ConfigurationHelper;
|
||||||
|
|
||||||
import app.organicmaps.base.BaseMwmFragment;
|
import app.organicmaps.base.BaseMwmFragment;
|
||||||
import app.organicmaps.sdk.display.DisplayType;
|
|
||||||
import app.organicmaps.sdk.Map;
|
import app.organicmaps.sdk.Map;
|
||||||
import app.organicmaps.sdk.MapRenderingListener;
|
import app.organicmaps.sdk.MapRenderingListener;
|
||||||
|
import app.organicmaps.sdk.display.DisplayType;
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
|
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
public class MapFragment extends BaseMwmFragment implements View.OnTouchListener, SurfaceHolder.Callback
|
public class MapFragment extends BaseMwmFragment implements View.OnTouchListener, SurfaceHolder.Callback
|
||||||
@@ -71,7 +68,8 @@ public class MapFragment extends BaseMwmFragment implements View.OnTouchListener
|
|||||||
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height)
|
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height)
|
||||||
{
|
{
|
||||||
Logger.d(TAG);
|
Logger.d(TAG);
|
||||||
mMap.onSurfaceChanged(requireContext(), surfaceHolder.getSurface(), surfaceHolder.getSurfaceFrame(), surfaceHolder.isCreating());
|
mMap.onSurfaceChanged(requireContext(), surfaceHolder.getSurface(), surfaceHolder.getSurfaceFrame(),
|
||||||
|
surfaceHolder.isCreating());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -2,10 +2,8 @@ package app.organicmaps;
|
|||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import app.organicmaps.base.BaseMwmFragmentActivity;
|
import app.organicmaps.base.BaseMwmFragmentActivity;
|
||||||
import app.organicmaps.sdk.display.DisplayChangedListener;
|
import app.organicmaps.sdk.display.DisplayChangedListener;
|
||||||
import app.organicmaps.sdk.display.DisplayManager;
|
import app.organicmaps.sdk.display.DisplayManager;
|
||||||
@@ -24,7 +22,7 @@ public class MapPlaceholderActivity extends BaseMwmFragmentActivity implements D
|
|||||||
super.onSafeCreate(savedInstanceState);
|
super.onSafeCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_map_placeholder);
|
setContentView(R.layout.activity_map_placeholder);
|
||||||
|
|
||||||
mDisplayManager = DisplayManager.from(this);
|
mDisplayManager = MwmApplication.from(this).getDisplayManager();
|
||||||
mDisplayManager.addListener(DisplayType.Device, this);
|
mDisplayManager.addListener(DisplayType.Device, this);
|
||||||
|
|
||||||
findViewById(R.id.btn_continue).setOnClickListener((unused) -> mDisplayManager.changeDisplay(DisplayType.Device));
|
findViewById(R.id.btn_continue).setOnClickListener((unused) -> mDisplayManager.changeDisplay(DisplayType.Device));
|
||||||
@@ -34,8 +32,7 @@ public class MapPlaceholderActivity extends BaseMwmFragmentActivity implements D
|
|||||||
public void onDisplayChangedToDevice(@NonNull Runnable onTaskFinishedCallback)
|
public void onDisplayChangedToDevice(@NonNull Runnable onTaskFinishedCallback)
|
||||||
{
|
{
|
||||||
mRemoveDisplayListener = false;
|
mRemoveDisplayListener = false;
|
||||||
startActivity(new Intent(this, MwmActivity.class)
|
startActivity(new Intent(this, MwmActivity.class).putExtra(MwmActivity.EXTRA_UPDATE_THEME, true));
|
||||||
.putExtra(MwmActivity.EXTRA_UPDATE_THEME, true));
|
|
||||||
finish();
|
finish();
|
||||||
onTaskFinishedCallback.run();
|
onTaskFinishedCallback.run();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,18 @@
|
|||||||
package app.organicmaps;
|
package app.organicmaps;
|
||||||
|
|
||||||
|
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
|
||||||
|
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
|
||||||
|
import static android.Manifest.permission.POST_NOTIFICATIONS;
|
||||||
|
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||||
|
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_ADD_PLACE_CODE;
|
||||||
|
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_HELP_CODE;
|
||||||
|
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_RECORD_TRACK_CODE;
|
||||||
|
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_SETTINGS_CODE;
|
||||||
|
import static app.organicmaps.sdk.location.LocationState.FOLLOW;
|
||||||
|
import static app.organicmaps.sdk.location.LocationState.FOLLOW_AND_ROTATE;
|
||||||
|
import static app.organicmaps.sdk.location.LocationState.LOCATION_TAG;
|
||||||
|
import static app.organicmaps.sdk.util.PowerManagment.POWER_MANAGEMENT_TAG;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
@@ -23,7 +36,6 @@ import android.view.Window;
|
|||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.activity.result.ActivityResult;
|
import androidx.activity.result.ActivityResult;
|
||||||
import androidx.activity.result.ActivityResultLauncher;
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
import androidx.activity.result.IntentSenderRequest;
|
import androidx.activity.result.IntentSenderRequest;
|
||||||
@@ -48,117 +60,92 @@ import app.organicmaps.backup.PeriodicBackupRunner;
|
|||||||
import app.organicmaps.base.BaseMwmFragmentActivity;
|
import app.organicmaps.base.BaseMwmFragmentActivity;
|
||||||
import app.organicmaps.base.OnBackPressListener;
|
import app.organicmaps.base.OnBackPressListener;
|
||||||
import app.organicmaps.bookmarks.BookmarkCategoriesActivity;
|
import app.organicmaps.bookmarks.BookmarkCategoriesActivity;
|
||||||
|
import app.organicmaps.downloader.DownloaderActivity;
|
||||||
|
import app.organicmaps.downloader.DownloaderFragment;
|
||||||
|
import app.organicmaps.downloader.OnmapDownloader;
|
||||||
|
import app.organicmaps.editor.EditorActivity;
|
||||||
|
import app.organicmaps.editor.EditorHostFragment;
|
||||||
|
import app.organicmaps.editor.FeatureCategoryActivity;
|
||||||
|
import app.organicmaps.editor.OsmLoginActivity;
|
||||||
|
import app.organicmaps.editor.ReportFragment;
|
||||||
|
import app.organicmaps.help.HelpActivity;
|
||||||
|
import app.organicmaps.intent.Factory;
|
||||||
|
import app.organicmaps.intent.IntentProcessor;
|
||||||
|
import app.organicmaps.leftbutton.LeftButton;
|
||||||
|
import app.organicmaps.leftbutton.LeftButtonsHolder;
|
||||||
|
import app.organicmaps.leftbutton.LeftToggleButton;
|
||||||
|
import app.organicmaps.location.TrackRecordingService;
|
||||||
|
import app.organicmaps.maplayer.MapButtonsController;
|
||||||
|
import app.organicmaps.maplayer.MapButtonsViewModel;
|
||||||
|
import app.organicmaps.maplayer.ToggleMapLayerFragment;
|
||||||
|
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;
|
||||||
|
import app.organicmaps.sdk.ChoosePositionMode;
|
||||||
import app.organicmaps.sdk.Framework;
|
import app.organicmaps.sdk.Framework;
|
||||||
import app.organicmaps.sdk.Map;
|
import app.organicmaps.sdk.Map;
|
||||||
import app.organicmaps.sdk.MapRenderingListener;
|
import app.organicmaps.sdk.MapRenderingListener;
|
||||||
|
import app.organicmaps.sdk.PlacePageActivationListener;
|
||||||
|
import app.organicmaps.sdk.Router;
|
||||||
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
|
||||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||||
import app.organicmaps.sdk.display.DisplayChangedListener;
|
import app.organicmaps.sdk.display.DisplayChangedListener;
|
||||||
import app.organicmaps.sdk.display.DisplayManager;
|
import app.organicmaps.sdk.display.DisplayManager;
|
||||||
import app.organicmaps.sdk.display.DisplayType;
|
import app.organicmaps.sdk.display.DisplayType;
|
||||||
import app.organicmaps.downloader.DownloaderActivity;
|
|
||||||
import app.organicmaps.downloader.DownloaderFragment;
|
|
||||||
import app.organicmaps.sdk.downloader.MapManager;
|
import app.organicmaps.sdk.downloader.MapManager;
|
||||||
import app.organicmaps.downloader.OnmapDownloader;
|
|
||||||
import app.organicmaps.sdk.downloader.UpdateInfo;
|
import app.organicmaps.sdk.downloader.UpdateInfo;
|
||||||
import app.organicmaps.sdk.editor.Editor;
|
import app.organicmaps.sdk.editor.Editor;
|
||||||
import app.organicmaps.editor.EditorActivity;
|
|
||||||
import app.organicmaps.editor.EditorHostFragment;
|
|
||||||
import app.organicmaps.editor.FeatureCategoryActivity;
|
|
||||||
import app.organicmaps.editor.OsmLoginActivity;
|
|
||||||
import app.organicmaps.sdk.editor.OsmOAuth;
|
import app.organicmaps.sdk.editor.OsmOAuth;
|
||||||
import app.organicmaps.editor.ReportFragment;
|
|
||||||
import app.organicmaps.help.HelpActivity;
|
|
||||||
import app.organicmaps.intent.Factory;
|
|
||||||
import app.organicmaps.intent.IntentProcessor;
|
|
||||||
import app.organicmaps.sdk.location.LocationHelper;
|
import app.organicmaps.sdk.location.LocationHelper;
|
||||||
import app.organicmaps.sdk.location.LocationListener;
|
import app.organicmaps.sdk.location.LocationListener;
|
||||||
import app.organicmaps.sdk.location.LocationState;
|
import app.organicmaps.sdk.location.LocationState;
|
||||||
import app.organicmaps.sdk.location.SensorListener;
|
import app.organicmaps.sdk.location.SensorListener;
|
||||||
import app.organicmaps.sdk.location.TrackRecorder;
|
import app.organicmaps.sdk.location.TrackRecorder;
|
||||||
import app.organicmaps.location.TrackRecordingService;
|
|
||||||
import app.organicmaps.maplayer.MapButtonsController;
|
|
||||||
import app.organicmaps.maplayer.MapButtonsViewModel;
|
|
||||||
import app.organicmaps.maplayer.ToggleMapLayerFragment;
|
|
||||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesState;
|
import app.organicmaps.sdk.maplayer.isolines.IsolinesState;
|
||||||
import app.organicmaps.routing.ManageRouteBottomSheet;
|
|
||||||
import app.organicmaps.routing.NavigationController;
|
|
||||||
import app.organicmaps.routing.NavigationService;
|
|
||||||
import app.organicmaps.sdk.routing.RouteMarkType;
|
import app.organicmaps.sdk.routing.RouteMarkType;
|
||||||
import app.organicmaps.routing.RoutingBottomMenuListener;
|
|
||||||
import app.organicmaps.routing.RoutingController;
|
|
||||||
import app.organicmaps.routing.RoutingErrorDialogFragment;
|
|
||||||
import app.organicmaps.sdk.routing.RoutingOptions;
|
import app.organicmaps.sdk.routing.RoutingOptions;
|
||||||
import app.organicmaps.routing.RoutingPlanFragment;
|
|
||||||
import app.organicmaps.routing.RoutingPlanInplaceController;
|
|
||||||
import app.organicmaps.sdk.ChoosePositionMode;
|
|
||||||
import app.organicmaps.sdk.PlacePageActivationListener;
|
|
||||||
import app.organicmaps.sdk.Router;
|
|
||||||
import app.organicmaps.search.FloatingSearchToolbarController;
|
|
||||||
import app.organicmaps.search.SearchActivity;
|
|
||||||
import app.organicmaps.sdk.search.SearchEngine;
|
import app.organicmaps.sdk.search.SearchEngine;
|
||||||
import app.organicmaps.search.SearchFragment;
|
|
||||||
import app.organicmaps.settings.DrivingOptionsActivity;
|
|
||||||
import app.organicmaps.sdk.settings.RoadType;
|
import app.organicmaps.sdk.settings.RoadType;
|
||||||
import app.organicmaps.settings.SettingsActivity;
|
|
||||||
import app.organicmaps.sdk.settings.UnitLocale;
|
import app.organicmaps.sdk.settings.UnitLocale;
|
||||||
import app.organicmaps.leftbutton.LeftButton;
|
|
||||||
import app.organicmaps.leftbutton.LeftButtonsHolder;
|
|
||||||
import app.organicmaps.leftbutton.LeftToggleButton;
|
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.LocationUtils;
|
import app.organicmaps.sdk.util.LocationUtils;
|
||||||
import app.organicmaps.sdk.util.PowerManagment;
|
import app.organicmaps.sdk.util.PowerManagment;
|
||||||
import app.organicmaps.util.SharingUtils;
|
|
||||||
import app.organicmaps.sdk.util.ThemeSwitcher;
|
import app.organicmaps.sdk.util.ThemeSwitcher;
|
||||||
import app.organicmaps.util.ThemeUtils;
|
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
|
import app.organicmaps.sdk.widget.placepage.PlacePageData;
|
||||||
|
import app.organicmaps.search.FloatingSearchToolbarController;
|
||||||
|
import app.organicmaps.search.SearchActivity;
|
||||||
|
import app.organicmaps.search.SearchFragment;
|
||||||
|
import app.organicmaps.settings.DrivingOptionsActivity;
|
||||||
|
import app.organicmaps.settings.SettingsActivity;
|
||||||
|
import app.organicmaps.util.SharingUtils;
|
||||||
|
import app.organicmaps.util.ThemeUtils;
|
||||||
import app.organicmaps.util.Utils;
|
import app.organicmaps.util.Utils;
|
||||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
|
||||||
import app.organicmaps.util.bottomsheet.MenuBottomSheetItem;
|
import app.organicmaps.util.bottomsheet.MenuBottomSheetItem;
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
|
||||||
import app.organicmaps.widget.StackedButtonsDialog;
|
import app.organicmaps.widget.StackedButtonsDialog;
|
||||||
import app.organicmaps.widget.menu.MainMenu;
|
import app.organicmaps.widget.menu.MainMenu;
|
||||||
import app.organicmaps.widget.placepage.PlacePageController;
|
import app.organicmaps.widget.placepage.PlacePageController;
|
||||||
import app.organicmaps.sdk.widget.placepage.PlacePageData;
|
|
||||||
import app.organicmaps.widget.placepage.PlacePageViewModel;
|
import app.organicmaps.widget.placepage.PlacePageViewModel;
|
||||||
|
|
||||||
import com.google.android.material.appbar.MaterialToolbar;
|
import com.google.android.material.appbar.MaterialToolbar;
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
|
|
||||||
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
|
|
||||||
import static android.Manifest.permission.POST_NOTIFICATIONS;
|
|
||||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
|
||||||
import static app.organicmaps.sdk.location.LocationState.FOLLOW;
|
|
||||||
import static app.organicmaps.sdk.location.LocationState.FOLLOW_AND_ROTATE;
|
|
||||||
import static app.organicmaps.sdk.location.LocationState.LOCATION_TAG;
|
|
||||||
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_ADD_PLACE_CODE;
|
|
||||||
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_HELP_CODE;
|
|
||||||
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_RECORD_TRACK_CODE;
|
|
||||||
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_SETTINGS_CODE;
|
|
||||||
import static app.organicmaps.sdk.util.PowerManagment.POWER_MANAGEMENT_TAG;
|
|
||||||
import static app.organicmaps.sdk.util.concurrency.UiThread.runLater;
|
|
||||||
|
|
||||||
|
|
||||||
public class MwmActivity extends BaseMwmFragmentActivity
|
public class MwmActivity extends BaseMwmFragmentActivity
|
||||||
implements PlacePageActivationListener,
|
implements PlacePageActivationListener, View.OnTouchListener, MapRenderingListener, RoutingController.Container,
|
||||||
View.OnTouchListener,
|
LocationListener, SensorListener, LocationState.ModeChangeListener,
|
||||||
MapRenderingListener,
|
RoutingPlanInplaceController.RoutingPlanListener, RoutingBottomMenuListener,
|
||||||
RoutingController.Container,
|
BookmarkManager.BookmarksLoadingListener, FloatingSearchToolbarController.SearchToolbarListener,
|
||||||
LocationListener,
|
|
||||||
SensorListener,
|
|
||||||
LocationState.ModeChangeListener,
|
|
||||||
RoutingPlanInplaceController.RoutingPlanListener,
|
|
||||||
RoutingBottomMenuListener,
|
|
||||||
BookmarkManager.BookmarksLoadingListener,
|
|
||||||
FloatingSearchToolbarController.SearchToolbarListener,
|
|
||||||
MenuBottomSheetFragment.MenuBottomSheetInterfaceWithHeader,
|
MenuBottomSheetFragment.MenuBottomSheetInterfaceWithHeader,
|
||||||
PlacePageController.PlacePageRouteSettingsListener,
|
PlacePageController.PlacePageRouteSettingsListener, MapButtonsController.MapButtonClickListener,
|
||||||
MapButtonsController.MapButtonClickListener,
|
|
||||||
DisplayChangedListener
|
DisplayChangedListener
|
||||||
{
|
{
|
||||||
private static final String TAG = MwmActivity.class.getSimpleName();
|
private static final String TAG = MwmActivity.class.getSimpleName();
|
||||||
@@ -171,15 +158,13 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
private static final String EXTRA_CONSUMED = "mwm.extra.intent.processed";
|
private static final String EXTRA_CONSUMED = "mwm.extra.intent.processed";
|
||||||
private boolean mPreciseLocationDialogShown = false;
|
private boolean mPreciseLocationDialogShown = false;
|
||||||
|
|
||||||
private static final String[] DOCKED_FRAGMENTS = { SearchFragment.class.getName(),
|
private static final String[] DOCKED_FRAGMENTS = {SearchFragment.class.getName(), DownloaderFragment.class.getName(),
|
||||||
DownloaderFragment.class.getName(),
|
|
||||||
RoutingPlanFragment.class.getName(),
|
RoutingPlanFragment.class.getName(),
|
||||||
EditorHostFragment.class.getName(),
|
EditorHostFragment.class.getName(), ReportFragment.class.getName()};
|
||||||
ReportFragment.class.getName() };
|
|
||||||
|
|
||||||
public final ActivityResultLauncher<Intent> startDrivingOptionsForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), activityResult ->
|
public final ActivityResultLauncher<Intent> startDrivingOptionsForResult =
|
||||||
{
|
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), activityResult -> {
|
||||||
if( activityResult.getResultCode() == Activity.RESULT_OK)
|
if (activityResult.getResultCode() == Activity.RESULT_OK)
|
||||||
rebuildLastRoute();
|
rebuildLastRoute();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -275,8 +260,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
public static Intent createShowMapIntent(@NonNull Context context, @Nullable String countryId)
|
public static Intent createShowMapIntent(@NonNull Context context, @Nullable String countryId)
|
||||||
{
|
{
|
||||||
return new Intent(context, DownloadResourcesLegacyActivity.class)
|
return new Intent(context, DownloadResourcesLegacyActivity.class).putExtra(EXTRA_COUNTRY_ID, countryId);
|
||||||
.putExtra(EXTRA_COUNTRY_ID, countryId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -363,14 +347,15 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
private void migrateOAuthCredentials()
|
private void migrateOAuthCredentials()
|
||||||
{
|
{
|
||||||
if (OsmOAuth.containsOAuth1Credentials(this))
|
if (OsmOAuth.containsOAuth1Credentials())
|
||||||
{
|
{
|
||||||
// Remove old OAuth v1 secrets
|
// Remove old OAuth v1 secrets
|
||||||
OsmOAuth.clearOAuth1Credentials(this);
|
OsmOAuth.clearOAuth1Credentials();
|
||||||
|
|
||||||
// Notify user to re-login
|
// Notify user to re-login
|
||||||
dismissAlertDialog();
|
dismissAlertDialog();
|
||||||
final DialogInterface.OnClickListener navigateToLoginHandler = (dialog, which) -> startActivity(new Intent(MwmActivity.this, OsmLoginActivity.class));
|
final DialogInterface.OnClickListener navigateToLoginHandler =
|
||||||
|
(dialog, which) -> startActivity(new Intent(MwmActivity.this, OsmLoginActivity.class));
|
||||||
|
|
||||||
final int marginBase = getResources().getDimensionPixelSize(R.dimen.margin_base);
|
final int marginBase = getResources().getDimensionPixelSize(R.dimen.margin_base);
|
||||||
final float textSize = getResources().getDimension(R.dimen.line_spacing_extra_1);
|
final float textSize = getResources().getDimension(R.dimen.line_spacing_extra_1);
|
||||||
@@ -398,8 +383,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
@Override
|
@Override
|
||||||
protected int getFragmentContentResId()
|
protected int getFragmentContentResId()
|
||||||
{
|
{
|
||||||
return (mIsTabletLayout ? R.id.fragment_container
|
return (mIsTabletLayout ? R.id.fragment_container : super.getFragmentContentResId());
|
||||||
: super.getFragmentContentResId());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -417,7 +401,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void replaceFragment(@NonNull Class<? extends Fragment> fragmentClass, @Nullable Bundle args, @Nullable Runnable completionListener)
|
public void replaceFragment(@NonNull Class<? extends Fragment> fragmentClass, @Nullable Bundle args,
|
||||||
|
@Nullable Runnable completionListener)
|
||||||
{
|
{
|
||||||
if (mPanelAnimator.isVisible() && getFragment(fragmentClass) != null)
|
if (mPanelAnimator.isVisible() && getFragment(fragmentClass) != null)
|
||||||
{
|
{
|
||||||
@@ -534,7 +519,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
final int newUiMode = newConfig.uiMode & Configuration.UI_MODE_TYPE_MASK;
|
final int newUiMode = newConfig.uiMode & Configuration.UI_MODE_TYPE_MASK;
|
||||||
final boolean newUiModeIsCarConnected = newUiMode == Configuration.UI_MODE_TYPE_CAR;
|
final boolean newUiModeIsCarConnected = newUiMode == Configuration.UI_MODE_TYPE_CAR;
|
||||||
final boolean newUiModeIsCarDisconnected = mLastUiMode == Configuration.UI_MODE_TYPE_CAR && newUiMode == Configuration.UI_MODE_TYPE_NORMAL;
|
final boolean newUiModeIsCarDisconnected =
|
||||||
|
mLastUiMode == Configuration.UI_MODE_TYPE_CAR && newUiMode == Configuration.UI_MODE_TYPE_NORMAL;
|
||||||
mLastUiMode = newUiMode;
|
mLastUiMode = newUiMode;
|
||||||
|
|
||||||
if (newUiModeIsCarConnected || newUiModeIsCarDisconnected)
|
if (newUiModeIsCarConnected || newUiModeIsCarDisconnected)
|
||||||
@@ -566,8 +552,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
mMapButtonsViewModel.getLayoutMode().observe(this, this::initNavigationButtons);
|
mMapButtonsViewModel.getLayoutMode().observe(this, this::initNavigationButtons);
|
||||||
|
|
||||||
mSearchController = new FloatingSearchToolbarController(this, this);
|
mSearchController = new FloatingSearchToolbarController(this, this);
|
||||||
mSearchController.getToolbar()
|
mSearchController.getToolbar().getViewTreeObserver();
|
||||||
.getViewTreeObserver();
|
|
||||||
|
|
||||||
// Note: You must call registerForActivityResult() before the fragment or activity is created.
|
// Note: You must call registerForActivityResult() before the fragment or activity is created.
|
||||||
mLocationPermissionRequest = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(),
|
mLocationPermissionRequest = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(),
|
||||||
@@ -576,15 +561,15 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
this::onLocationResolutionResult);
|
this::onLocationResolutionResult);
|
||||||
mPostNotificationPermissionRequest = registerForActivityResult(new ActivityResultContracts.RequestPermission(),
|
mPostNotificationPermissionRequest = registerForActivityResult(new ActivityResultContracts.RequestPermission(),
|
||||||
this::onPostNotificationPermissionResult);
|
this::onPostNotificationPermissionResult);
|
||||||
mPowerSaveSettings = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
|
mPowerSaveSettings =
|
||||||
this::onPowerSaveResult);
|
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), this::onPowerSaveResult);
|
||||||
|
|
||||||
mSettingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
|
mSettingsLauncher =
|
||||||
this::onSettingsResult);
|
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), this::onSettingsResult);
|
||||||
|
|
||||||
mShareLauncher = SharingUtils.RegisterLauncher(this);
|
mShareLauncher = SharingUtils.RegisterLauncher(this);
|
||||||
|
|
||||||
mDisplayManager = DisplayManager.from(this);
|
mDisplayManager = MwmApplication.from(this).getDisplayManager();
|
||||||
if (mDisplayManager.isCarDisplayUsed())
|
if (mDisplayManager.isCarDisplayUsed())
|
||||||
{
|
{
|
||||||
mRemoveDisplayListener = false;
|
mRemoveDisplayListener = false;
|
||||||
@@ -622,7 +607,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
Intent data = activityResult.getData();
|
Intent data = activityResult.getData();
|
||||||
if (data != null && data.hasExtra(MwmActivity.this.getString(R.string.pref_left_button)))
|
if (data != null && data.hasExtra(MwmActivity.this.getString(R.string.pref_left_button)))
|
||||||
{
|
{
|
||||||
MapButtonsController mMapButtonsController = (MapButtonsController) getSupportFragmentManager().findFragmentById(R.id.map_buttons);
|
MapButtonsController mMapButtonsController =
|
||||||
|
(MapButtonsController) getSupportFragmentManager().findFragmentById(R.id.map_buttons);
|
||||||
if (mMapButtonsController != null)
|
if (mMapButtonsController != null)
|
||||||
{
|
{
|
||||||
mMapButtonsController.reloadLeftButton(buttonsHolder.getActiveButton());
|
mMapButtonsController.reloadLeftButton(buttonsHolder.getActiveButton());
|
||||||
@@ -633,11 +619,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
private void refreshLightStatusBar()
|
private void refreshLightStatusBar()
|
||||||
{
|
{
|
||||||
UiUtils.setLightStatusBar(this, !(
|
UiUtils.setLightStatusBar(this, !(ThemeUtils.isNightTheme(this) || RoutingController.get().isPlanning()
|
||||||
ThemeUtils.isNightTheme(this)
|
|| ChoosePositionMode.get() != ChoosePositionMode.None));
|
||||||
|| RoutingController.get().isPlanning()
|
|
||||||
|| ChoosePositionMode.get() != ChoosePositionMode.None
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateViewsInsets()
|
private void updateViewsInsets()
|
||||||
@@ -645,13 +628,15 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
ViewCompat.setOnApplyWindowInsetsListener(mPointChooser, (view, windowInsets) -> {
|
ViewCompat.setOnApplyWindowInsetsListener(mPointChooser, (view, windowInsets) -> {
|
||||||
UiUtils.setViewInsetsPaddingBottom(mPointChooser, windowInsets);
|
UiUtils.setViewInsetsPaddingBottom(mPointChooser, windowInsets);
|
||||||
UiUtils.setViewInsetsPaddingNoBottom(mPointChooserToolbar, windowInsets);
|
UiUtils.setViewInsetsPaddingNoBottom(mPointChooserToolbar, windowInsets);
|
||||||
final int trackRecorderOffset = TrackRecorder.nativeIsTrackRecordingEnabled() ? UiUtils.dimen(this, R.dimen.map_button_size) : 0;
|
final int trackRecorderOffset =
|
||||||
|
TrackRecorder.nativeIsTrackRecordingEnabled() ? UiUtils.dimen(this, R.dimen.map_button_size) : 0;
|
||||||
mNavBarHeight = isFullscreen() ? 0 : windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom;
|
mNavBarHeight = isFullscreen() ? 0 : windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom;
|
||||||
// For the first loading, set compass top margin to status bar size
|
// For the first loading, set compass top margin to status bar size
|
||||||
// The top inset will be then be updated by the routing controller
|
// The top inset will be then be updated by the routing controller
|
||||||
if (mCurrentWindowInsets == null)
|
if (mCurrentWindowInsets == null)
|
||||||
{
|
{
|
||||||
updateCompassOffset(trackRecorderOffset + windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top, windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).right);
|
updateCompassOffset(trackRecorderOffset + windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top,
|
||||||
|
windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).right);
|
||||||
}
|
}
|
||||||
refreshLightStatusBar();
|
refreshLightStatusBar();
|
||||||
updateBottomWidgetsOffset(windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).left);
|
updateBottomWidgetsOffset(windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).left);
|
||||||
@@ -677,8 +662,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
removeCurrentFragment(false);
|
removeCurrentFragment(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
mNavigationController = new NavigationController(this, v -> onSettingsOptionSelected(), this::updateBottomWidgetsOffset);
|
mNavigationController =
|
||||||
//TrafficManager.INSTANCE.attach(mNavigationController);
|
new NavigationController(this, v -> onSettingsOptionSelected(), this::updateBottomWidgetsOffset);
|
||||||
|
// TrafficManager.INSTANCE.attach(mNavigationController);
|
||||||
|
|
||||||
initMainMenu();
|
initMainMenu();
|
||||||
initOnmapDownloader();
|
initOnmapDownloader();
|
||||||
@@ -694,9 +680,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
mPointChooserToolbar = mPointChooser.findViewById(R.id.toolbar_point_chooser);
|
mPointChooserToolbar = mPointChooser.findViewById(R.id.toolbar_point_chooser);
|
||||||
UiUtils.showHomeUpButton(mPointChooserToolbar);
|
UiUtils.showHomeUpButton(mPointChooserToolbar);
|
||||||
mPointChooserToolbar.setNavigationOnClickListener(v -> closePositionChooser());
|
mPointChooserToolbar.setNavigationOnClickListener(v -> closePositionChooser());
|
||||||
mPointChooser.findViewById(R.id.done).setOnClickListener(
|
mPointChooser.findViewById(R.id.done).setOnClickListener(v -> {
|
||||||
v ->
|
|
||||||
{
|
|
||||||
switch (ChoosePositionMode.get())
|
switch (ChoosePositionMode.get())
|
||||||
{
|
{
|
||||||
case Api:
|
case Api:
|
||||||
@@ -721,8 +705,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case None:
|
case None: throw new IllegalStateException("Unexpected Framework.nativeGetChoosePositionMode()");
|
||||||
throw new IllegalStateException("Unexpected Framework.nativeGetChoosePositionMode()");
|
|
||||||
}
|
}
|
||||||
closePositionChooser();
|
closePositionChooser();
|
||||||
});
|
});
|
||||||
@@ -750,7 +733,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Hides/shows UI while keeping state
|
/**
|
||||||
|
*Hides/shows UI while keeping state
|
||||||
* @param isUiHidden True to hide the UI
|
* @param isUiHidden True to hide the UI
|
||||||
**/
|
**/
|
||||||
public void hideOrShowUIWithoutClosingPlacePage(boolean isUiHidden)
|
public void hideOrShowUIWithoutClosingPlacePage(boolean isUiHidden)
|
||||||
@@ -783,6 +767,16 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
private void showPositionChooser(ChoosePositionMode mode, boolean isBusiness, boolean applyPosition)
|
private void showPositionChooser(ChoosePositionMode mode, boolean isBusiness, boolean applyPosition)
|
||||||
{
|
{
|
||||||
closeFloatingToolbarsAndPanels(false);
|
closeFloatingToolbarsAndPanels(false);
|
||||||
|
if (mMapFragment != null)
|
||||||
|
{
|
||||||
|
final View mapView = mMapFragment.getView();
|
||||||
|
if (mapView != null)
|
||||||
|
{
|
||||||
|
int width = mapView.getWidth();
|
||||||
|
int height = mapView.getHeight();
|
||||||
|
Framework.nativeSetVisibleRect(0, 0, width, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
UiUtils.show(mPointChooser);
|
UiUtils.show(mPointChooser);
|
||||||
mMapButtonsViewModel.setButtonsHidden(true);
|
mMapButtonsViewModel.setButtonsHidden(true);
|
||||||
ChoosePositionMode.set(mode, isBusiness, applyPosition);
|
ChoosePositionMode.set(mode, isBusiness, applyPosition);
|
||||||
@@ -795,6 +789,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
ChoosePositionMode mode = ChoosePositionMode.get();
|
ChoosePositionMode mode = ChoosePositionMode.get();
|
||||||
ChoosePositionMode.set(ChoosePositionMode.None, false, false);
|
ChoosePositionMode.set(ChoosePositionMode.None, false, false);
|
||||||
mMapButtonsViewModel.setButtonsHidden(false);
|
mMapButtonsViewModel.setButtonsHidden(false);
|
||||||
|
Framework.nativeDeactivatePopup();
|
||||||
refreshLightStatusBar();
|
refreshLightStatusBar();
|
||||||
if (mode == ChoosePositionMode.Api)
|
if (mode == ChoosePositionMode.Api)
|
||||||
finish();
|
finish();
|
||||||
@@ -811,8 +806,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
final FragmentFactory factory = manager.getFragmentFactory();
|
final FragmentFactory factory = manager.getFragmentFactory();
|
||||||
mMapFragment = (MapFragment) factory.instantiate(getClassLoader(), MapFragment.class.getName());
|
mMapFragment = (MapFragment) factory.instantiate(getClassLoader(), MapFragment.class.getName());
|
||||||
mMapFragment.setArguments(args);
|
mMapFragment.setArguments(args);
|
||||||
manager
|
manager.beginTransaction()
|
||||||
.beginTransaction()
|
|
||||||
.replace(R.id.map_fragment_container, mMapFragment, MapFragment.class.getName())
|
.replace(R.id.map_fragment_container, mMapFragment, MapFragment.class.getName())
|
||||||
.commit();
|
.commit();
|
||||||
}
|
}
|
||||||
@@ -833,8 +827,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
private void prepareNavigationButtons()
|
private void prepareNavigationButtons()
|
||||||
{
|
{
|
||||||
buttonsHolder = LeftButtonsHolder.getInstance(this);
|
buttonsHolder = LeftButtonsHolder.getInstance(this);
|
||||||
buttonsHolder.registerButton(new LeftButton()
|
buttonsHolder.registerButton(new LeftButton() {
|
||||||
{
|
|
||||||
@Override
|
@Override
|
||||||
public String getCode()
|
public String getCode()
|
||||||
{
|
{
|
||||||
@@ -860,8 +853,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
MwmActivity.this.startActivity(intent);
|
MwmActivity.this.startActivity(intent);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
buttonsHolder.registerButton(new LeftButton()
|
buttonsHolder.registerButton(new LeftButton() {
|
||||||
{
|
|
||||||
@Override
|
@Override
|
||||||
public String getCode()
|
public String getCode()
|
||||||
{
|
{
|
||||||
@@ -886,8 +878,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
onAddPlace();
|
onAddPlace();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
buttonsHolder.registerButton(new LeftButton()
|
buttonsHolder.registerButton(new LeftButton() {
|
||||||
{
|
|
||||||
@Override
|
@Override
|
||||||
public String getCode()
|
public String getCode()
|
||||||
{
|
{
|
||||||
@@ -913,8 +904,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
buttonsHolder.registerButton(new LeftToggleButton()
|
buttonsHolder.registerButton(new LeftToggleButton() {
|
||||||
{
|
|
||||||
private boolean isRecording = TrackRecorder.nativeIsTrackRecordingEnabled();
|
private boolean isRecording = TrackRecorder.nativeIsTrackRecordingEnabled();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -940,8 +930,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
{
|
{
|
||||||
imageView.setImageResource(R.drawable.ic_track_recording_off);
|
imageView.setImageResource(R.drawable.ic_track_recording_off);
|
||||||
|
|
||||||
int color = isRecording
|
int color = isRecording ? ContextCompat.getColor(MwmActivity.this, R.color.active_track_recording)
|
||||||
? ContextCompat.getColor(MwmActivity.this, R.color.active_track_recording)
|
|
||||||
: ThemeUtils.getColor(MwmActivity.this, R.attr.iconTint);
|
: ThemeUtils.getColor(MwmActivity.this, R.attr.iconTint);
|
||||||
|
|
||||||
ColorStateList colorStateList = ColorStateList.valueOf(color);
|
ColorStateList colorStateList = ColorStateList.valueOf(color);
|
||||||
@@ -965,8 +954,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
MapButtonsController mapButtonsController = new MapButtonsController();
|
MapButtonsController mapButtonsController = new MapButtonsController();
|
||||||
mapButtonsController.setLeftButton(buttonsHolder.getActiveButton());
|
mapButtonsController.setLeftButton(buttonsHolder.getActiveButton());
|
||||||
|
|
||||||
FragmentTransaction transaction = getSupportFragmentManager()
|
FragmentTransaction transaction =
|
||||||
.beginTransaction().replace(R.id.map_buttons, mapButtonsController);
|
getSupportFragmentManager().beginTransaction().replace(R.id.map_buttons, mapButtonsController);
|
||||||
transaction.commit();
|
transaction.commit();
|
||||||
mPreviousMapLayoutMode = layoutMode;
|
mPreviousMapLayoutMode = layoutMode;
|
||||||
}
|
}
|
||||||
@@ -1004,11 +993,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private boolean closeBottomSheet(String id)
|
private boolean closeBottomSheet(String id)
|
||||||
{
|
{
|
||||||
MenuBottomSheetFragment bottomSheet =
|
MenuBottomSheetFragment bottomSheet = (MenuBottomSheetFragment) getSupportFragmentManager().findFragmentByTag(id);
|
||||||
(MenuBottomSheetFragment) getSupportFragmentManager().findFragmentByTag(id);
|
|
||||||
if (bottomSheet == null || !bottomSheet.isAdded())
|
if (bottomSheet == null || !bottomSheet.isAdded())
|
||||||
return false;
|
return false;
|
||||||
bottomSheet.dismiss();
|
bottomSheet.dismiss();
|
||||||
@@ -1246,7 +1233,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
||||||
.setTitle(R.string.downloader_update_maps)
|
.setTitle(R.string.downloader_update_maps)
|
||||||
.setMessage(R.string.isolines_activation_error_dialog)
|
.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)
|
.setNegativeButton(R.string.cancel, null)
|
||||||
.setOnDismissListener(dialog -> mAlertDialog = null)
|
.setOnDismissListener(dialog -> mAlertDialog = null)
|
||||||
.show();
|
.show();
|
||||||
@@ -1259,20 +1247,17 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
super.onNewIntent(intent);
|
super.onNewIntent(intent);
|
||||||
if (isMapRendererActive())
|
if (isMapRendererActive())
|
||||||
processIntent();
|
processIntent();
|
||||||
if (intent.getAction() != null && intent.getAction()
|
if (intent.getAction() != null && intent.getAction().equals(TrackRecordingService.STOP_TRACK_RECORDING))
|
||||||
.equals(TrackRecordingService.STOP_TRACK_RECORDING))
|
|
||||||
{
|
{
|
||||||
//closes the bottom sheet in case it is opened to deal with updation of track recording status in bottom sheet.
|
// closes the bottom sheet in case it is opened to deal with updation of track recording status in bottom sheet.
|
||||||
closeBottomSheet(MAIN_MENU_ID);
|
closeBottomSheet(MAIN_MENU_ID);
|
||||||
showTrackSaveDialog();
|
showTrackSaveDialog();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private boolean isMapRendererActive()
|
private boolean isMapRendererActive()
|
||||||
{
|
{
|
||||||
return mMapFragment != null && Map.isEngineCreated()
|
return mMapFragment != null && Map.isEngineCreated() && mMapFragment.isContextCreated();
|
||||||
&& mMapFragment.isContextCreated();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@CallSuper
|
@CallSuper
|
||||||
@@ -1386,10 +1371,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
public void onBackPressed()
|
public void onBackPressed()
|
||||||
{
|
{
|
||||||
final RoutingController routingController = RoutingController.get();
|
final RoutingController routingController = RoutingController.get();
|
||||||
if (!closeBottomSheet(MAIN_MENU_ID) && !closeBottomSheet(LAYERS_MENU_ID) &&
|
if (!closeBottomSheet(MAIN_MENU_ID) && !closeBottomSheet(LAYERS_MENU_ID) && !collapseNavMenu() && !closePlacePage()
|
||||||
!collapseNavMenu() && !closePlacePage() && !closeSearchToolbar(true, true) &&
|
&& !closeSearchToolbar(true, true) && !closeSidePanel() && !closePositionChooser()
|
||||||
!closeSidePanel() && !closePositionChooser() &&
|
&& !routingController.resetToPlanningStateIfNavigating() && !routingController.cancel())
|
||||||
!routingController.resetToPlanningStateIfNavigating() && !routingController.cancel())
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -1421,9 +1405,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
if (fm.isDestroyed())
|
if (fm.isDestroyed())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fm.beginTransaction()
|
fm.beginTransaction().remove(fragment).commitAllowingStateLoss();
|
||||||
.remove(fragment)
|
|
||||||
.commitAllowingStateLoss();
|
|
||||||
fm.executePendingTransactions();
|
fm.executePendingTransactions();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1484,8 +1466,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
private void setFullscreen(boolean isFullscreen)
|
private void setFullscreen(boolean isFullscreen)
|
||||||
{
|
{
|
||||||
if (RoutingController.get().isNavigating()
|
if (RoutingController.get().isNavigating() || RoutingController.get().isBuilding()
|
||||||
|| RoutingController.get().isBuilding()
|
|
||||||
|| RoutingController.get().isPlanning())
|
|| RoutingController.get().isPlanning())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1496,13 +1477,15 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
private boolean isFullscreen()
|
private boolean isFullscreen()
|
||||||
{
|
{
|
||||||
// Buttons are hidden in position chooser mode but we are not in fullscreen
|
// Buttons are hidden in position chooser mode but we are not in fullscreen
|
||||||
return Boolean.TRUE.equals(mMapButtonsViewModel.getButtonsHidden().getValue()) &&
|
return Boolean.TRUE.equals(mMapButtonsViewModel.getButtonsHidden().getValue())
|
||||||
ChoosePositionMode.get() == ChoosePositionMode.None;
|
&& ChoosePositionMode.get() == ChoosePositionMode.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean dispatchGenericMotionEvent(MotionEvent event) {
|
public boolean dispatchGenericMotionEvent(MotionEvent event)
|
||||||
if (event.getActionMasked() == MotionEvent.ACTION_SCROLL) {
|
{
|
||||||
|
if (event.getActionMasked() == MotionEvent.ACTION_SCROLL)
|
||||||
|
{
|
||||||
int exponent = event.getAxisValue(MotionEvent.AXIS_VSCROLL) < 0 ? -1 : 1;
|
int exponent = event.getAxisValue(MotionEvent.AXIS_VSCROLL) < 0 ? -1 : 1;
|
||||||
Map.onScale(Math.pow(1.7f, exponent), event.getX(), event.getY(), true);
|
Map.onScale(Math.pow(1.7f, exponent), event.getX(), event.getY(), true);
|
||||||
return true;
|
return true;
|
||||||
@@ -1541,7 +1524,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
Map.onCompassUpdated(north, true);
|
Map.onCompassUpdated(north, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onMapBottomButtonsHeightChange(float height) {
|
public void onMapBottomButtonsHeightChange(float height)
|
||||||
|
{
|
||||||
updateBottomWidgetsOffset();
|
updateBottomWidgetsOffset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1608,8 +1592,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
mMainMenu.setState(MainMenu.State.MENU, isFullscreen());
|
mMainMenu.setState(MainMenu.State.MENU, isFullscreen());
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean showAddStartOrFinishFrame(@NonNull RoutingController controller,
|
private boolean showAddStartOrFinishFrame(@NonNull RoutingController controller, boolean showFrame)
|
||||||
boolean showFrame)
|
|
||||||
{
|
{
|
||||||
// S - start, F - finish, L - my position
|
// S - start, F - finish, L - my position
|
||||||
// -S-F-L -> Start
|
// -S-F-L -> Start
|
||||||
@@ -1684,7 +1667,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
{
|
{
|
||||||
// TODO This code section may be called when insets are not yet initialized
|
// TODO This code section may be called when insets are not yet initialized
|
||||||
// This is only a workaround to prevent crashes but a proper fix should be implemented
|
// This is only a workaround to prevent crashes but a proper fix should be implemented
|
||||||
if (mCurrentWindowInsets == null) {
|
if (mCurrentWindowInsets == null)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int offsetY = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top;
|
int offsetY = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top;
|
||||||
@@ -1880,8 +1864,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
@Override
|
@Override
|
||||||
public void onCommonBuildError(int lastResultCode, @NonNull String[] lastMissingMaps)
|
public void onCommonBuildError(int lastResultCode, @NonNull String[] lastMissingMaps)
|
||||||
{
|
{
|
||||||
RoutingErrorDialogFragment fragment = RoutingErrorDialogFragment.create(getSupportFragmentManager().getFragmentFactory(),
|
RoutingErrorDialogFragment fragment = RoutingErrorDialogFragment.create(
|
||||||
getApplicationContext(), lastResultCode, lastMissingMaps);
|
getSupportFragmentManager().getFragmentFactory(), getApplicationContext(), lastResultCode, lastMissingMaps);
|
||||||
fragment.show(getSupportFragmentManager(), RoutingErrorDialogFragment.class.getSimpleName());
|
fragment.show(getSupportFragmentManager(), RoutingErrorDialogFragment.class.getSimpleName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1889,10 +1873,12 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
public void onDrivingOptionsBuildError()
|
public void onDrivingOptionsBuildError()
|
||||||
{
|
{
|
||||||
dismissAlertDialog();
|
dismissAlertDialog();
|
||||||
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
mAlertDialog =
|
||||||
|
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
||||||
.setTitle(R.string.unable_to_calc_alert_title)
|
.setTitle(R.string.unable_to_calc_alert_title)
|
||||||
.setMessage(R.string.unable_to_calc_alert_subtitle)
|
.setMessage(R.string.unable_to_calc_alert_subtitle)
|
||||||
.setPositiveButton(R.string.settings, (dialog, which) -> DrivingOptionsActivity.start(this, startDrivingOptionsForResult))
|
.setPositiveButton(R.string.settings,
|
||||||
|
(dialog, which) -> DrivingOptionsActivity.start(this, startDrivingOptionsForResult))
|
||||||
.setNegativeButton(R.string.cancel, null)
|
.setNegativeButton(R.string.cancel, null)
|
||||||
.setOnDismissListener(dialog -> mAlertDialog = null)
|
.setOnDismissListener(dialog -> mAlertDialog = null)
|
||||||
.show();
|
.show();
|
||||||
@@ -1904,7 +1890,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
final StringBuilder builder = new StringBuilder();
|
final StringBuilder builder = new StringBuilder();
|
||||||
for (int resId : new int[]{R.string.dialog_routing_disclaimer_priority, R.string.dialog_routing_disclaimer_precision,
|
for (int resId :
|
||||||
|
new int[] {R.string.dialog_routing_disclaimer_priority, R.string.dialog_routing_disclaimer_precision,
|
||||||
R.string.dialog_routing_disclaimer_recommendations, R.string.dialog_routing_disclaimer_borders,
|
R.string.dialog_routing_disclaimer_recommendations, R.string.dialog_routing_disclaimer_borders,
|
||||||
R.string.dialog_routing_disclaimer_beware})
|
R.string.dialog_routing_disclaimer_beware})
|
||||||
builder.append(getString(resId)).append("\n\n");
|
builder.append(getString(resId)).append("\n\n");
|
||||||
@@ -1915,7 +1902,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
.setMessage(builder.toString())
|
.setMessage(builder.toString())
|
||||||
.setCancelable(false)
|
.setCancelable(false)
|
||||||
.setNegativeButton(R.string.decline, null)
|
.setNegativeButton(R.string.decline, null)
|
||||||
.setPositiveButton(R.string.accept, (dlg, which) -> {
|
.setPositiveButton(R.string.accept,
|
||||||
|
(dlg, which) -> {
|
||||||
Config.acceptRoutingDisclaimer();
|
Config.acceptRoutingDisclaimer();
|
||||||
onRoutingStart();
|
onRoutingStart();
|
||||||
})
|
})
|
||||||
@@ -1986,10 +1974,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
Logger.i(LOCATION_TAG, "Requesting ACCESS_FINE_LOCATION + ACCESS_FINE_LOCATION permissions");
|
Logger.i(LOCATION_TAG, "Requesting ACCESS_FINE_LOCATION + ACCESS_FINE_LOCATION permissions");
|
||||||
dismissLocationErrorDialog();
|
dismissLocationErrorDialog();
|
||||||
mLocationPermissionRequest.launch(new String[]{
|
mLocationPermissionRequest.launch(new String[] {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION});
|
||||||
ACCESS_COARSE_LOCATION,
|
|
||||||
ACCESS_FINE_LOCATION
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2000,10 +1985,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
// Try to optimistically request FINE permission for FOLLOW and FOLLOW_AND_ROTATE modes.
|
// Try to optimistically request FINE permission for FOLLOW and FOLLOW_AND_ROTATE modes.
|
||||||
Logger.i(LOCATION_TAG, "Requesting ACCESS_FINE_LOCATION permission for " + LocationState.nameOf(newMode));
|
Logger.i(LOCATION_TAG, "Requesting ACCESS_FINE_LOCATION permission for " + LocationState.nameOf(newMode));
|
||||||
dismissLocationErrorDialog();
|
dismissLocationErrorDialog();
|
||||||
mLocationPermissionRequest.launch(new String[]{
|
mLocationPermissionRequest.launch(new String[] {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION});
|
||||||
ACCESS_COARSE_LOCATION,
|
|
||||||
ACCESS_FINE_LOCATION
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2067,16 +2049,14 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
@UiThread
|
@UiThread
|
||||||
public void onCompassCalibrationRecommended()
|
public void onCompassCalibrationRecommended()
|
||||||
{
|
{
|
||||||
Toast.makeText(this, getString(R.string.compass_calibration_recommended),
|
Toast.makeText(this, getString(R.string.compass_calibration_recommended), Toast.LENGTH_LONG).show();
|
||||||
Toast.LENGTH_LONG).show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@UiThread
|
@UiThread
|
||||||
public void onCompassCalibrationRequired()
|
public void onCompassCalibrationRequired()
|
||||||
{
|
{
|
||||||
Toast.makeText(this, getString(R.string.compass_calibration_required),
|
Toast.makeText(this, getString(R.string.compass_calibration_required), Toast.LENGTH_LONG).show();
|
||||||
Toast.LENGTH_LONG).show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2084,8 +2064,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
*/
|
*/
|
||||||
public void requestPostNotificationsPermission()
|
public void requestPostNotificationsPermission()
|
||||||
{
|
{
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU ||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU
|
||||||
ActivityCompat.checkSelfPermission(this, POST_NOTIFICATIONS) == PERMISSION_GRANTED)
|
|| ActivityCompat.checkSelfPermission(this, POST_NOTIFICATIONS) == PERMISSION_GRANTED)
|
||||||
{
|
{
|
||||||
Logger.i(TAG, "Permissions POST_NOTIFICATIONS is granted");
|
Logger.i(TAG, "Permissions POST_NOTIFICATIONS is granted");
|
||||||
return;
|
return;
|
||||||
@@ -2139,7 +2119,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
if (!mPreciseLocationDialogShown)
|
if (!mPreciseLocationDialogShown)
|
||||||
{
|
{
|
||||||
mPreciseLocationDialogShown = true;
|
mPreciseLocationDialogShown = true;
|
||||||
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
final MaterialAlertDialogBuilder builder =
|
||||||
|
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
||||||
.setTitle("⚠ " + getString(R.string.limited_accuracy))
|
.setTitle("⚠ " + getString(R.string.limited_accuracy))
|
||||||
.setMessage(R.string.precise_location_is_disabled_long_text)
|
.setMessage(R.string.precise_location_is_disabled_long_text)
|
||||||
.setNegativeButton(R.string.close, (dialog, which) -> dialog.dismiss())
|
.setNegativeButton(R.string.close, (dialog, which) -> dialog.dismiss())
|
||||||
@@ -2349,11 +2330,13 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
}
|
}
|
||||||
|
|
||||||
dismissAlertDialog();
|
dismissAlertDialog();
|
||||||
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
final MaterialAlertDialogBuilder builder =
|
||||||
|
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
||||||
.setTitle(R.string.current_location_unknown_error_title)
|
.setTitle(R.string.current_location_unknown_error_title)
|
||||||
.setCancelable(true)
|
.setCancelable(true)
|
||||||
.setMessage(R.string.power_save_dialog_summary)
|
.setMessage(R.string.power_save_dialog_summary)
|
||||||
.setNegativeButton(R.string.not_now, (dialog, which) -> {
|
.setNegativeButton(R.string.not_now,
|
||||||
|
(dialog, which) -> {
|
||||||
Logger.d(POWER_MANAGEMENT_TAG, "The Power Save disclaimer was ignored");
|
Logger.d(POWER_MANAGEMENT_TAG, "The Power Save disclaimer was ignored");
|
||||||
mPowerSaveDisclaimerShown = true;
|
mPowerSaveDisclaimerShown = true;
|
||||||
})
|
})
|
||||||
@@ -2372,12 +2355,15 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
public void onBookmarksFileUnsupported(@NonNull Uri uri)
|
public void onBookmarksFileUnsupported(@NonNull Uri uri)
|
||||||
{
|
{
|
||||||
dismissAlertDialog();
|
dismissAlertDialog();
|
||||||
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
mAlertDialog =
|
||||||
|
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
||||||
.setTitle(R.string.load_kmz_title)
|
.setTitle(R.string.load_kmz_title)
|
||||||
.setMessage(getString(R.string.unknown_file_type, uri))
|
.setMessage(getString(R.string.unknown_file_type, uri))
|
||||||
.setPositiveButton(R.string.ok, null)
|
.setPositiveButton(R.string.ok, null)
|
||||||
.setNegativeButton(R.string.report_a_bug, (dialog, which) -> Utils.sendBugReport(mShareLauncher, this,
|
.setNegativeButton(R.string.report_a_bug,
|
||||||
getString(R.string.load_kmz_title), getString(R.string.unknown_file_type, uri)))
|
(dialog, which)
|
||||||
|
-> Utils.sendBugReport(mShareLauncher, this, getString(R.string.load_kmz_title),
|
||||||
|
getString(R.string.unknown_file_type, uri)))
|
||||||
.setOnDismissListener(dialog -> mAlertDialog = null)
|
.setOnDismissListener(dialog -> mAlertDialog = null)
|
||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
@@ -2386,12 +2372,15 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
public void onBookmarksFileDownloadFailed(@NonNull Uri uri, @NonNull String error)
|
public void onBookmarksFileDownloadFailed(@NonNull Uri uri, @NonNull String error)
|
||||||
{
|
{
|
||||||
dismissAlertDialog();
|
dismissAlertDialog();
|
||||||
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
mAlertDialog =
|
||||||
|
new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
|
||||||
.setTitle(R.string.load_kmz_title)
|
.setTitle(R.string.load_kmz_title)
|
||||||
.setMessage(getString(R.string.failed_to_open_file, uri, error))
|
.setMessage(getString(R.string.failed_to_open_file, uri, error))
|
||||||
.setPositiveButton(R.string.ok, null)
|
.setPositiveButton(R.string.ok, null)
|
||||||
.setNegativeButton(R.string.report_a_bug, (dialog, which) -> Utils.sendBugReport(mShareLauncher, this,
|
.setNegativeButton(R.string.report_a_bug,
|
||||||
getString(R.string.load_kmz_title), getString(R.string.failed_to_open_file, uri, error)))
|
(dialog, which)
|
||||||
|
-> Utils.sendBugReport(mShareLauncher, this, getString(R.string.load_kmz_title),
|
||||||
|
getString(R.string.failed_to_open_file, uri, error)))
|
||||||
.setOnDismissListener(dialog -> mAlertDialog = null)
|
.setOnDismissListener(dialog -> mAlertDialog = null)
|
||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
@@ -2439,12 +2428,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
{
|
{
|
||||||
switch (keyCode)
|
switch (keyCode)
|
||||||
{
|
{
|
||||||
case KeyEvent.KEYCODE_DPAD_DOWN:
|
case KeyEvent.KEYCODE_DPAD_DOWN: Map.zoomOut(); return true;
|
||||||
Map.zoomOut();
|
case KeyEvent.KEYCODE_DPAD_UP: Map.zoomIn(); return true;
|
||||||
return true;
|
|
||||||
case KeyEvent.KEYCODE_DPAD_UP:
|
|
||||||
Map.zoomIn();
|
|
||||||
return true;
|
|
||||||
case KeyEvent.KEYCODE_ESCAPE:
|
case KeyEvent.KEYCODE_ESCAPE:
|
||||||
final Intent currIntent = getIntent();
|
final Intent currIntent = getIntent();
|
||||||
final String backUrl = Framework.nativeGetParsedBackUrl();
|
final String backUrl = Framework.nativeGetParsedBackUrl();
|
||||||
@@ -2454,8 +2439,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return super.onKeyUp(keyCode, event);
|
return super.onKeyUp(keyCode, event);
|
||||||
default:
|
default: return super.onKeyUp(keyCode, event);
|
||||||
return super.onKeyUp(keyCode, event);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2498,7 +2482,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
// according to action of user. Calling it hack because we are avoiding
|
// according to action of user. Calling it hack because we are avoiding
|
||||||
// creation of new methods by using this variable.
|
// creation of new methods by using this variable.
|
||||||
mLocationPermissionRequestedForRecording = true;
|
mLocationPermissionRequestedForRecording = true;
|
||||||
mLocationPermissionRequest.launch(new String[] { ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION });
|
mLocationPermissionRequest.launch(new String[] {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2553,8 +2537,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
{
|
{
|
||||||
if (TrackRecorder.nativeIsTrackRecordingEmpty())
|
if (TrackRecorder.nativeIsTrackRecordingEmpty())
|
||||||
{
|
{
|
||||||
Toast.makeText(this, R.string.track_recording_toast_nothing_to_save, Toast.LENGTH_SHORT)
|
Toast.makeText(this, R.string.track_recording_toast_nothing_to_save, Toast.LENGTH_SHORT).show();
|
||||||
.show();
|
|
||||||
stopTrackRecording();
|
stopTrackRecording();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2565,11 +2548,13 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
.setCancelable(false)
|
.setCancelable(false)
|
||||||
// Negative/Positive/Neutral do not have their usual meaning here.
|
// Negative/Positive/Neutral do not have their usual meaning here.
|
||||||
.setNegativeButton(R.string.continue_recording, (dialog, which) -> mAlertDialog = null)
|
.setNegativeButton(R.string.continue_recording, (dialog, which) -> mAlertDialog = null)
|
||||||
.setNeutralButton(R.string.stop_without_saving, (dialog, which) -> {
|
.setNeutralButton(R.string.stop_without_saving,
|
||||||
|
(dialog, which) -> {
|
||||||
stopTrackRecording();
|
stopTrackRecording();
|
||||||
mAlertDialog = null;
|
mAlertDialog = null;
|
||||||
})
|
})
|
||||||
.setPositiveButton(R.string.save, (dialog, which) -> {
|
.setPositiveButton(R.string.save,
|
||||||
|
(dialog, which) -> {
|
||||||
saveAndStopTrackRecording();
|
saveAndStopTrackRecording();
|
||||||
mAlertDialog = null;
|
mAlertDialog = null;
|
||||||
})
|
})
|
||||||
@@ -2593,20 +2578,25 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
ArrayList<MenuBottomSheetItem> items = new ArrayList<>();
|
ArrayList<MenuBottomSheetItem> items = new ArrayList<>();
|
||||||
|
|
||||||
if (!BUTTON_ADD_PLACE_CODE.equals(activeLeftButton))
|
if (!BUTTON_ADD_PLACE_CODE.equals(activeLeftButton))
|
||||||
items.add(new MenuBottomSheetItem(R.string.placepage_add_place_button, R.drawable.ic_plus, this::onAddPlaceOptionSelected));
|
items.add(new MenuBottomSheetItem(R.string.placepage_add_place_button, R.drawable.ic_plus,
|
||||||
|
this::onAddPlaceOptionSelected));
|
||||||
|
|
||||||
items.add(new MenuBottomSheetItem(R.string.download_maps, R.drawable.ic_download, getDownloadMapsCounter(), this::onDownloadMapsOptionSelected));
|
items.add(new MenuBottomSheetItem(R.string.download_maps, R.drawable.ic_download, getDownloadMapsCounter(),
|
||||||
|
this::onDownloadMapsOptionSelected));
|
||||||
|
|
||||||
if (!Config.getDonateUrl(getApplicationContext()).isEmpty())
|
mDonatesUrl = Config.getDonateUrl(getApplicationContext());
|
||||||
|
if (!mDonatesUrl.isEmpty())
|
||||||
items.add(new MenuBottomSheetItem(R.string.donate, R.drawable.ic_donate, this::onDonateOptionSelected));
|
items.add(new MenuBottomSheetItem(R.string.donate, R.drawable.ic_donate, this::onDonateOptionSelected));
|
||||||
|
|
||||||
if (!BUTTON_SETTINGS_CODE.equals(activeLeftButton))
|
if (!BUTTON_SETTINGS_CODE.equals(activeLeftButton))
|
||||||
items.add(new MenuBottomSheetItem(R.string.settings, R.drawable.ic_settings, this::onSettingsOptionSelected));
|
items.add(new MenuBottomSheetItem(R.string.settings, R.drawable.ic_settings, this::onSettingsOptionSelected));
|
||||||
|
|
||||||
if (!BUTTON_RECORD_TRACK_CODE.equals(activeLeftButton))
|
if (!BUTTON_RECORD_TRACK_CODE.equals(activeLeftButton))
|
||||||
items.add(new MenuBottomSheetItem(R.string.start_track_recording, R.drawable.ic_track_recording_off, -1, this::onTrackRecordingOptionSelected));
|
items.add(new MenuBottomSheetItem(R.string.start_track_recording, R.drawable.ic_track_recording_off, -1,
|
||||||
|
this::onTrackRecordingOptionSelected));
|
||||||
|
|
||||||
items.add(new MenuBottomSheetItem(R.string.share_my_location, R.drawable.ic_share, this::onShareLocationOptionSelected));
|
items.add(new MenuBottomSheetItem(R.string.share_my_location, R.drawable.ic_share,
|
||||||
|
this::onShareLocationOptionSelected));
|
||||||
|
|
||||||
if (!BUTTON_HELP_CODE.equals(activeLeftButton))
|
if (!BUTTON_HELP_CODE.equals(activeLeftButton))
|
||||||
items.add(new MenuBottomSheetItem(R.string.about_help, R.drawable.ic_logo_monochrome, this::showHelp));
|
items.add(new MenuBottomSheetItem(R.string.about_help, R.drawable.ic_logo_monochrome, this::showHelp));
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import android.app.Application;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.UiThread;
|
import androidx.annotation.UiThread;
|
||||||
@@ -15,30 +14,26 @@ import androidx.lifecycle.DefaultLifecycleObserver;
|
|||||||
import androidx.lifecycle.LifecycleObserver;
|
import androidx.lifecycle.LifecycleObserver;
|
||||||
import androidx.lifecycle.LifecycleOwner;
|
import androidx.lifecycle.LifecycleOwner;
|
||||||
import androidx.lifecycle.ProcessLifecycleOwner;
|
import androidx.lifecycle.ProcessLifecycleOwner;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.lang.ref.WeakReference;
|
|
||||||
|
|
||||||
import app.organicmaps.background.OsmUploadWork;
|
import app.organicmaps.background.OsmUploadWork;
|
||||||
import app.organicmaps.downloader.Android7RootCertificateWorkaround;
|
|
||||||
import app.organicmaps.downloader.DownloaderNotifier;
|
import app.organicmaps.downloader.DownloaderNotifier;
|
||||||
import app.organicmaps.sdk.display.DisplayManager;
|
import app.organicmaps.location.TrackRecordingService;
|
||||||
|
import app.organicmaps.routing.NavigationService;
|
||||||
|
import app.organicmaps.routing.RoutingController;
|
||||||
import app.organicmaps.sdk.Map;
|
import app.organicmaps.sdk.Map;
|
||||||
|
import app.organicmaps.sdk.OrganicMaps;
|
||||||
|
import app.organicmaps.sdk.display.DisplayManager;
|
||||||
import app.organicmaps.sdk.location.LocationHelper;
|
import app.organicmaps.sdk.location.LocationHelper;
|
||||||
import app.organicmaps.sdk.location.LocationState;
|
import app.organicmaps.sdk.location.LocationState;
|
||||||
import app.organicmaps.sdk.location.SensorHelper;
|
import app.organicmaps.sdk.location.SensorHelper;
|
||||||
import app.organicmaps.sdk.location.TrackRecorder;
|
import app.organicmaps.sdk.location.TrackRecorder;
|
||||||
import app.organicmaps.location.TrackRecordingService;
|
|
||||||
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
|
||||||
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
import app.organicmaps.sdk.maplayer.subway.SubwayManager;
|
||||||
import app.organicmaps.routing.NavigationService;
|
|
||||||
import app.organicmaps.routing.RoutingController;
|
|
||||||
import app.organicmaps.sdk.OrganicMaps;
|
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.ConnectionState;
|
import app.organicmaps.sdk.util.ConnectionState;
|
||||||
import app.organicmaps.util.Utils;
|
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
import app.organicmaps.sdk.util.log.LogsManager;
|
import app.organicmaps.util.Utils;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
|
||||||
public class MwmApplication extends Application implements Application.ActivityLifecycleCallbacks
|
public class MwmApplication extends Application implements Application.ActivityLifecycleCallbacks
|
||||||
{
|
{
|
||||||
@@ -56,6 +51,10 @@ public class MwmApplication extends Application implements Application.ActivityL
|
|||||||
@Nullable
|
@Nullable
|
||||||
private WeakReference<Activity> mTopActivity;
|
private WeakReference<Activity> mTopActivity;
|
||||||
|
|
||||||
|
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||||
|
@NonNull
|
||||||
|
public static MwmApplication sInstance;
|
||||||
|
|
||||||
@UiThread
|
@UiThread
|
||||||
@Nullable
|
@Nullable
|
||||||
public Activity getTopActivity()
|
public Activity getTopActivity()
|
||||||
@@ -105,13 +104,10 @@ public class MwmApplication extends Application implements Application.ActivityL
|
|||||||
return (MwmApplication) context.getApplicationContext();
|
return (MwmApplication) context.getApplicationContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
|
||||||
public static MwmApplication sInstance;
|
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public static SharedPreferences prefs(@NonNull Context context)
|
public static SharedPreferences prefs(@NonNull Context context)
|
||||||
{
|
{
|
||||||
return context.getSharedPreferences(context.getString(R.string.pref_file_name), MODE_PRIVATE);
|
return from(context).getOrganicMaps().getPreferences();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -124,10 +120,6 @@ public class MwmApplication extends Application implements Application.ActivityL
|
|||||||
|
|
||||||
mOrganicMaps = new OrganicMaps(getApplicationContext());
|
mOrganicMaps = new OrganicMaps(getApplicationContext());
|
||||||
|
|
||||||
LogsManager.INSTANCE.initFileLogging(this);
|
|
||||||
|
|
||||||
Android7RootCertificateWorkaround.initializeIfNeeded(this);
|
|
||||||
|
|
||||||
ConnectionState.INSTANCE.initialize(this);
|
ConnectionState.INSTANCE.initialize(this);
|
||||||
|
|
||||||
DownloaderNotifier.createNotificationChannel(this);
|
DownloaderNotifier.createNotificationChannel(this);
|
||||||
@@ -146,8 +138,7 @@ public class MwmApplication extends Application implements Application.ActivityL
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private final LifecycleObserver mProcessLifecycleObserver = new DefaultLifecycleObserver()
|
private final LifecycleObserver mProcessLifecycleObserver = new DefaultLifecycleObserver() {
|
||||||
{
|
|
||||||
@Override
|
@Override
|
||||||
public void onStart(@NonNull LifecycleOwner owner)
|
public void onStart(@NonNull LifecycleOwner owner)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5,21 +5,19 @@ import android.animation.ValueAnimator;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.animation.AccelerateInterpolator;
|
import android.view.animation.AccelerateInterpolator;
|
||||||
|
|
||||||
import androidx.annotation.IntegerRes;
|
import androidx.annotation.IntegerRes;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
import org.chromium.base.ObserverList;
|
|
||||||
|
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
|
import org.chromium.base.ObserverList;
|
||||||
|
|
||||||
class PanelAnimator
|
class PanelAnimator
|
||||||
{
|
{
|
||||||
private final MwmActivity mActivity;
|
private final MwmActivity mActivity;
|
||||||
private final ObserverList<MwmActivity.LeftAnimationTrackListener> mAnimationTrackListeners = new ObserverList<>();
|
private final ObserverList<MwmActivity.LeftAnimationTrackListener> mAnimationTrackListeners = new ObserverList<>();
|
||||||
private final ObserverList.RewindableIterator<MwmActivity.LeftAnimationTrackListener> mAnimationTrackIterator = mAnimationTrackListeners.rewindableIterator();
|
private final ObserverList.RewindableIterator<MwmActivity.LeftAnimationTrackListener> mAnimationTrackIterator =
|
||||||
|
mAnimationTrackListeners.rewindableIterator();
|
||||||
private final View mPanel;
|
private final View mPanel;
|
||||||
private final int mWidth;
|
private final int mWidth;
|
||||||
@IntegerRes
|
@IntegerRes
|
||||||
@@ -50,7 +48,8 @@ class PanelAnimator
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** @param completionListener will be called before the fragment becomes actually visible */
|
/** @param completionListener will be called before the fragment becomes actually visible */
|
||||||
public void show(final Class<? extends Fragment> clazz, final Bundle args, @Nullable final Runnable completionListener)
|
public void show(final Class<? extends Fragment> clazz, final Bundle args,
|
||||||
|
@Nullable final Runnable completionListener)
|
||||||
{
|
{
|
||||||
if (isVisible())
|
if (isVisible())
|
||||||
{
|
{
|
||||||
@@ -78,8 +77,7 @@ class PanelAnimator
|
|||||||
|
|
||||||
ValueAnimator animator = ValueAnimator.ofFloat(-mWidth, 0.0f);
|
ValueAnimator animator = ValueAnimator.ofFloat(-mWidth, 0.0f);
|
||||||
animator.addUpdateListener(this::track);
|
animator.addUpdateListener(this::track);
|
||||||
animator.addListener(new UiUtils.SimpleAnimatorListener()
|
animator.addListener(new UiUtils.SimpleAnimatorListener() {
|
||||||
{
|
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationEnd(Animator animation)
|
public void onAnimationEnd(Animator animation)
|
||||||
{
|
{
|
||||||
@@ -109,8 +107,7 @@ class PanelAnimator
|
|||||||
|
|
||||||
ValueAnimator animator = ValueAnimator.ofFloat(0.0f, -mWidth);
|
ValueAnimator animator = ValueAnimator.ofFloat(0.0f, -mWidth);
|
||||||
animator.addUpdateListener(this::track);
|
animator.addUpdateListener(this::track);
|
||||||
animator.addListener(new UiUtils.SimpleAnimatorListener()
|
animator.addListener(new UiUtils.SimpleAnimatorListener() {
|
||||||
{
|
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationEnd(Animator animation)
|
public void onAnimationEnd(Animator animation)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import android.content.Intent;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import androidx.activity.result.ActivityResultLauncher;
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
import androidx.activity.result.contract.ActivityResultContracts;
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
import androidx.annotation.Keep;
|
import androidx.annotation.Keep;
|
||||||
@@ -21,20 +20,18 @@ import androidx.core.graphics.Insets;
|
|||||||
import androidx.core.view.OnApplyWindowInsetsListener;
|
import androidx.core.view.OnApplyWindowInsetsListener;
|
||||||
import androidx.core.view.ViewCompat;
|
import androidx.core.view.ViewCompat;
|
||||||
import androidx.core.view.WindowInsetsCompat;
|
import androidx.core.view.WindowInsetsCompat;
|
||||||
|
|
||||||
import app.organicmaps.sdk.display.DisplayManager;
|
|
||||||
import app.organicmaps.downloader.DownloaderActivity;
|
import app.organicmaps.downloader.DownloaderActivity;
|
||||||
import app.organicmaps.intent.Factory;
|
import app.organicmaps.intent.Factory;
|
||||||
|
import app.organicmaps.sdk.display.DisplayManager;
|
||||||
import app.organicmaps.sdk.location.LocationHelper;
|
import app.organicmaps.sdk.location.LocationHelper;
|
||||||
import app.organicmaps.sdk.util.Config;
|
import app.organicmaps.sdk.util.Config;
|
||||||
import app.organicmaps.sdk.util.LocationUtils;
|
import app.organicmaps.sdk.util.LocationUtils;
|
||||||
|
import app.organicmaps.sdk.util.concurrency.UiThread;
|
||||||
|
import app.organicmaps.sdk.util.log.Logger;
|
||||||
import app.organicmaps.util.SharingUtils;
|
import app.organicmaps.util.SharingUtils;
|
||||||
import app.organicmaps.util.ThemeUtils;
|
import app.organicmaps.util.ThemeUtils;
|
||||||
import app.organicmaps.util.Utils;
|
import app.organicmaps.util.Utils;
|
||||||
import app.organicmaps.sdk.util.concurrency.UiThread;
|
|
||||||
import app.organicmaps.sdk.util.log.Logger;
|
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@@ -93,7 +90,7 @@ public class SplashActivity extends AppCompatActivity
|
|||||||
});
|
});
|
||||||
mShareLauncher = SharingUtils.RegisterLauncher(this);
|
mShareLauncher = SharingUtils.RegisterLauncher(this);
|
||||||
|
|
||||||
if (DisplayManager.from(this).isCarDisplayUsed())
|
if (MwmApplication.from(this).getDisplayManager().isCarDisplayUsed())
|
||||||
{
|
{
|
||||||
startActivity(new Intent(this, MapPlaceholderActivity.class));
|
startActivity(new Intent(this, MapPlaceholderActivity.class));
|
||||||
finish();
|
finish();
|
||||||
@@ -109,10 +106,7 @@ public class SplashActivity extends AppCompatActivity
|
|||||||
if (!Config.isLocationRequested() && !LocationUtils.checkLocationPermission(this))
|
if (!Config.isLocationRequested() && !LocationUtils.checkLocationPermission(this))
|
||||||
{
|
{
|
||||||
Logger.d(TAG, "Requesting location permissions");
|
Logger.d(TAG, "Requesting location permissions");
|
||||||
mPermissionRequest.launch(new String[]{
|
mPermissionRequest.launch(new String[] {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION});
|
||||||
ACCESS_COARSE_LOCATION,
|
|
||||||
ACCESS_FINE_LOCATION
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,13 +138,7 @@ public class SplashActivity extends AppCompatActivity
|
|||||||
.setMessage(messageId)
|
.setMessage(messageId)
|
||||||
.setPositiveButton(
|
.setPositiveButton(
|
||||||
R.string.report_a_bug,
|
R.string.report_a_bug,
|
||||||
(dialog, which) -> Utils.sendBugReport(
|
(dialog, which) -> Utils.sendBugReport(mShareLauncher, this, "Fatal Error", Log.getStackTraceString(error)))
|
||||||
mShareLauncher,
|
|
||||||
this,
|
|
||||||
"Fatal Error",
|
|
||||||
Log.getStackTraceString(error)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.setCancelable(false)
|
.setCancelable(false)
|
||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
@@ -162,7 +150,8 @@ public class SplashActivity extends AppCompatActivity
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
asyncContinue = app.initOrganicMaps(this::processNavigation);
|
asyncContinue = app.initOrganicMaps(this::processNavigation);
|
||||||
} catch (IOException error)
|
}
|
||||||
|
catch (IOException error)
|
||||||
{
|
{
|
||||||
showFatalErrorDialog(R.string.dialog_error_storage_title, R.string.dialog_error_storage_message, error);
|
showFatalErrorDialog(R.string.dialog_error_storage_title, R.string.dialog_error_storage_message, error);
|
||||||
return;
|
return;
|
||||||
@@ -195,9 +184,12 @@ public class SplashActivity extends AppCompatActivity
|
|||||||
// https://github.com/organicmaps/organicmaps/issues/6944
|
// https://github.com/organicmaps/organicmaps/issues/6944
|
||||||
final Intent intent = Objects.requireNonNull(getIntent());
|
final Intent intent = Objects.requireNonNull(getIntent());
|
||||||
|
|
||||||
if (isManageSpaceActivity(intent)) {
|
if (isManageSpaceActivity(intent))
|
||||||
|
{
|
||||||
intent.setComponent(new ComponentName(this, DownloaderActivity.class));
|
intent.setComponent(new ComponentName(this, DownloaderActivity.class));
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
intent.setComponent(new ComponentName(this, DownloadResourcesLegacyActivity.class));
|
intent.setComponent(new ComponentName(this, DownloadResourcesLegacyActivity.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,11 +211,14 @@ public class SplashActivity extends AppCompatActivity
|
|||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isManageSpaceActivity(Intent intent) {
|
private boolean isManageSpaceActivity(Intent intent)
|
||||||
|
{
|
||||||
var component = intent.getComponent();
|
var component = intent.getComponent();
|
||||||
|
|
||||||
if (!Intent.ACTION_VIEW.equals(intent.getAction())) return false;
|
if (!Intent.ACTION_VIEW.equals(intent.getAction()))
|
||||||
if (component == null) return false;
|
return false;
|
||||||
|
if (component == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
var manageSpaceActivityName = BuildConfig.APPLICATION_ID + ".ManageSpaceActivity";
|
var manageSpaceActivityName = BuildConfig.APPLICATION_ID + ".ManageSpaceActivity";
|
||||||
|
|
||||||
|
|||||||
@@ -7,9 +7,7 @@ import android.net.Uri;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import android.webkit.WebViewClient;
|
import android.webkit.WebViewClient;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import app.organicmaps.base.OnBackPressListener;
|
import app.organicmaps.base.OnBackPressListener;
|
||||||
import app.organicmaps.sdk.util.UiUtils;
|
import app.organicmaps.sdk.util.UiUtils;
|
||||||
|
|
||||||
@@ -21,8 +19,7 @@ public abstract class WebContainerDelegate implements OnBackPressListener
|
|||||||
@SuppressLint("SetJavaScriptEnabled")
|
@SuppressLint("SetJavaScriptEnabled")
|
||||||
private void initWebView(String url)
|
private void initWebView(String url)
|
||||||
{
|
{
|
||||||
mWebView.setWebViewClient(new WebViewClient()
|
mWebView.setWebViewClient(new WebViewClient() {
|
||||||
{
|
|
||||||
@Override
|
@Override
|
||||||
public void onPageFinished(WebView view, String url)
|
public void onPageFinished(WebView view, String url)
|
||||||
{
|
{
|
||||||
@@ -37,7 +34,7 @@ public abstract class WebContainerDelegate implements OnBackPressListener
|
|||||||
{
|
{
|
||||||
MailTo parser = MailTo.parse(url);
|
MailTo parser = MailTo.parse(url);
|
||||||
doStartActivity(new Intent(Intent.ACTION_SEND)
|
doStartActivity(new Intent(Intent.ACTION_SEND)
|
||||||
.putExtra(Intent.EXTRA_EMAIL, new String[] { parser.getTo() })
|
.putExtra(Intent.EXTRA_EMAIL, new String[] {parser.getTo()})
|
||||||
.putExtra(Intent.EXTRA_TEXT, parser.getBody())
|
.putExtra(Intent.EXTRA_TEXT, parser.getBody())
|
||||||
.putExtra(Intent.EXTRA_SUBJECT, parser.getSubject())
|
.putExtra(Intent.EXTRA_SUBJECT, parser.getSubject())
|
||||||
.putExtra(Intent.EXTRA_CC, parser.getCc())
|
.putExtra(Intent.EXTRA_CC, parser.getCc())
|
||||||
@@ -46,8 +43,7 @@ public abstract class WebContainerDelegate implements OnBackPressListener
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
doStartActivity(new Intent(Intent.ACTION_VIEW)
|
doStartActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(url)));
|
||||||
.setData(Uri.parse(url)));
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,18 +4,23 @@ import android.content.Context;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.SimpleExpandableListAdapter;
|
import android.widget.SimpleExpandableListAdapter;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disables child selections, also fixes bug with SimpleExpandableListAdapter not switching expandedGroupLayout and collapsedGroupLayout correctly.
|
* Disables child selections, also fixes bug with SimpleExpandableListAdapter not switching expandedGroupLayout and
|
||||||
|
* collapsedGroupLayout correctly.
|
||||||
*/
|
*/
|
||||||
public class DisabledChildSimpleExpandableListAdapter extends SimpleExpandableListAdapter
|
public class DisabledChildSimpleExpandableListAdapter extends SimpleExpandableListAdapter
|
||||||
{
|
{
|
||||||
public DisabledChildSimpleExpandableListAdapter(Context context, List<? extends Map<String, ?>> groupData, int expandedGroupLayout, int collapsedGroupLayout, String[] groupFrom, int[] groupTo, List<? extends List<? extends Map<String, ?>>> childData, int childLayout, String[] childFrom, int[] childTo)
|
public DisabledChildSimpleExpandableListAdapter(Context context, List<? extends Map<String, ?>> groupData,
|
||||||
|
int expandedGroupLayout, int collapsedGroupLayout, String[] groupFrom,
|
||||||
|
int[] groupTo,
|
||||||
|
List<? extends List<? extends Map<String, ?>>> childData,
|
||||||
|
int childLayout, String[] childFrom, int[] childTo)
|
||||||
{
|
{
|
||||||
super(context, groupData, expandedGroupLayout, collapsedGroupLayout, groupFrom, groupTo, childData, childLayout, childFrom, childTo);
|
super(context, groupData, expandedGroupLayout, collapsedGroupLayout, groupFrom, groupTo, childData, childLayout,
|
||||||
|
childFrom, childTo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -29,8 +34,7 @@ public class DisabledChildSimpleExpandableListAdapter extends SimpleExpandableLi
|
|||||||
* See http://stackoverflow.com/questions/19520037/simpleexpandablelistadapter-and-expandedgrouplayout for details
|
* See http://stackoverflow.com/questions/19520037/simpleexpandablelistadapter-and-expandedgrouplayout for details
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
|
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)
|
||||||
ViewGroup parent)
|
|
||||||
{
|
{
|
||||||
return super.getGroupView(groupPosition, isExpanded, null, parent);
|
return super.getGroupView(groupPosition, isExpanded, null, parent);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package app.organicmaps.adapter;
|
package app.organicmaps.adapter;
|
||||||
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
public interface OnItemClickListener<T>
|
public interface OnItemClickListener<T>
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
package app.organicmaps.background;
|
package app.organicmaps.background;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.work.Constraints;
|
import androidx.work.Constraints;
|
||||||
|
import androidx.work.ExistingWorkPolicy;
|
||||||
import androidx.work.NetworkType;
|
import androidx.work.NetworkType;
|
||||||
import androidx.work.OneTimeWorkRequest;
|
import androidx.work.OneTimeWorkRequest;
|
||||||
import androidx.work.WorkManager;
|
import androidx.work.WorkManager;
|
||||||
import androidx.work.WorkRequest;
|
|
||||||
import androidx.work.Worker;
|
import androidx.work.Worker;
|
||||||
import androidx.work.WorkerParameters;
|
import androidx.work.WorkerParameters;
|
||||||
import app.organicmaps.MwmApplication;
|
import app.organicmaps.MwmApplication;
|
||||||
@@ -17,7 +16,6 @@ import app.organicmaps.sdk.util.log.Logger;
|
|||||||
|
|
||||||
public class OsmUploadWork extends Worker
|
public class OsmUploadWork extends Worker
|
||||||
{
|
{
|
||||||
|
|
||||||
private static final String TAG = OsmUploadWork.class.getSimpleName();
|
private static final String TAG = OsmUploadWork.class.getSimpleName();
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final WorkerParameters mWorkerParameters;
|
private final WorkerParameters mWorkerParameters;
|
||||||
@@ -34,11 +32,11 @@ public class OsmUploadWork extends Worker
|
|||||||
*/
|
*/
|
||||||
public static void startActionUploadOsmChanges(@NonNull Context context)
|
public static void startActionUploadOsmChanges(@NonNull Context context)
|
||||||
{
|
{
|
||||||
if (Editor.nativeHasSomethingToUpload() && OsmOAuth.isAuthorized(context))
|
if (Editor.nativeHasSomethingToUpload() && OsmOAuth.isAuthorized())
|
||||||
{
|
{
|
||||||
final Constraints c = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
|
final Constraints c = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
|
||||||
final WorkRequest wr = new OneTimeWorkRequest.Builder(OsmUploadWork.class).setConstraints(c).build();
|
final OneTimeWorkRequest wr = new OneTimeWorkRequest.Builder(OsmUploadWork.class).setConstraints(c).build();
|
||||||
WorkManager.getInstance(context).enqueue(wr);
|
WorkManager.getInstance(context).beginUniqueWork("UploadOsmChanges", ExistingWorkPolicy.KEEP, wr).enqueue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,13 +44,12 @@ public class OsmUploadWork extends Worker
|
|||||||
@Override
|
@Override
|
||||||
public Result doWork()
|
public Result doWork()
|
||||||
{
|
{
|
||||||
final MwmApplication app = MwmApplication.from(mContext);
|
if (!MwmApplication.from(mContext).getOrganicMaps().arePlatformAndCoreInitialized())
|
||||||
if (!app.getOrganicMaps().arePlatformAndCoreInitialized())
|
|
||||||
{
|
{
|
||||||
Logger.w(TAG, "Application is not initialized, ignoring " + mWorkerParameters);
|
Logger.w(TAG, "Application is not initialized, ignoring " + mWorkerParameters);
|
||||||
return Result.failure();
|
return Result.failure();
|
||||||
}
|
}
|
||||||
Editor.uploadChanges(mContext);
|
Editor.uploadChanges();
|
||||||
return Result.success();
|
return Result.success();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||