Сравнить коммиты

..
26 Коммитов
Автор SHA1 Сообщение Дата
viktor 8adbc0f83c docs: подробный README (разбор проекта при переносе в Gitea)
Старый README сохранён как README.upstream.md.
2026-08-20 04:18:35 +09:00
Anton Tananaev cd48c75257 Non nullable fields 2023-04-05 22:46:58 -07:00
Anton Tananaev 4eacf30897 Fix formatting 2023-04-05 22:41:05 -07:00
Anton Tananaev 88cc37e96e Update hidden icon 2023-02-10 16:07:44 -08:00
Anton Tananaev b80fde0b6d Update icons and colors 2023-02-10 16:02:44 -08:00
Anton Tananaev f734d0256f Update project files 2023-02-10 15:31:45 -08:00
Anton Tananaev 1dcc26b47b Fix dependencies 2023-01-25 07:36:55 -08:00
Anton Tananaev 5580f0b6bf Update project files 2023-01-25 07:28:33 -08:00
Anton Tananaev ddf1f0fbe0 Match shortcut intents 2023-01-09 09:31:19 -08:00
Anton Tananaev 235e58d3e2 Fix translation issues 2022-10-21 08:50:43 -07:00
Anton Tananaev 9cdb10db14 Update localization 2022-10-21 08:49:00 -07:00
Anton Tananaev 745a8523ef Update project 2022-10-21 08:17:05 -07:00
Anton Tananaev a2b2c215da Handle GPS rollover (fix #414) 2022-10-21 07:38:43 -07:00
Anton Tananaev 6d1c7b47e1 Fix Google flavor 2022-08-15 18:12:27 -07:00
Anton Tananaev 10bc96caf9 Fix typo 2022-08-14 17:38:34 -07:00
Anton Tananaev 0873aa7302 Add charging status 2022-08-14 17:28:44 -07:00
Anton Tananaev 37d3584f77 Handle deprecation 2022-08-14 17:02:22 -07:00
Anton Tananaev 404886f80e Update project files 2022-08-14 16:57:14 -07:00
Anton Tananaev a68b489681 Merge pull request #434 from aguerraVikua/master
Upgrade dependencies
2022-07-28 15:38:56 -07:00
Antonio Guerra 04e5b01cc7 ⬆️Upgrade dependencies 2022-07-19 21:31:48 -04:00
Anton Tananaev 5f059645a1 Update project 2022-05-29 10:50:11 -07:00
Anton Tananaev 8b985526dd Update version number 2022-01-30 10:18:36 -08:00
Anton Tananaev 5e8ea134e0 Attempt at fixing crashes 2022-01-30 10:18:09 -08:00
Anton Tananaev ec85edd56f Update version number 2021-11-04 19:21:19 -07:00
Anton Tananaev c5ab10919e Update dependencies 2021-11-04 19:20:08 -07:00
Anton Tananaev 3e8ba9a603 Fix Android 11 location permissions 2021-11-04 19:18:09 -07:00
107 изменённых файлов: 657 добавлений и 196 удалений
+74 -17
Просмотреть файл
@@ -1,27 +1,84 @@
# [Traccar Client for Android](https://www.traccar.org/client) # traccar-client-android (форк)
[![Get it on Google Play](http://www.tananaev.com/badges/google-play.svg)](https://play.google.com/store/apps/details?id=org.traccar.client) [![Get it on F-Droid](http://www.tananaev.com/badges/f-droid.svg)](https://f-droid.org/repository/browse/?fdid=org.traccar.client) Android-приложение Traccar Client — GPS-трекер, который снимает координаты устройства и отправляет их на сервер Traccar по протоколу OsmAnd (HTTP GET с параметрами). Работает фоновой службой, накапливает точки в локальной SQLite-очереди и досылает их при появлении сети.
## Overview Форк сделан как резервная копия официального репозитория [traccar/traccar-client-android](https://github.com/traccar/traccar-client-android) (автор — Anton Tananaev) в самохостовом Gitea: приложение используется вместе со своим сервером Traccar, и наличие независимой копии исходников гарантирует возможность пересобрать APK даже без доступа к GitHub.
Traccar Client is an Android GPS tracking application. It can work with Traccar open source server software. Документация оригинала (ссылки на Google Play/F-Droid, команда, лицензия Apache 2.0) сохранена в [README.upstream.md](README.upstream.md).
## Team ## Отличия от оригинала
- Anton Tananaev ([anton@traccar.org](mailto:anton@traccar.org)) Изменений нет. Все 438 коммитов принадлежат авторам оригинала (386 + 19 — Anton Tananaev, остальные — внешние контрибьюторы через pull request'ы). Собственных правок владельца форка в истории нет. Форк взят как резервная копия.
## License ## Стек
Apache License, Version 2.0 - Kotlin 1.8.0, Android SDK (compileSdk/targetSdk 33, minSdk 16)
- Gradle 7.5.1 + Android Gradle Plugin 7.4.1
- AndroidX: `core-ktx` 1.9.0, `preference-ktx` 1.2.0, `multidex` 2.0.1, Material Components 1.6.1
- `com.github.judemanutd:autostarter` 1.1.0 и `dev.doubledot.doki` — обход агрессивного энергосбережения вендоров (DKMA)
- Flavor `google`: Firebase BOM 28.2.1 (Analytics, Crashlytics), Play Services Location 21.0.1, Play Core
- SQLite (`SQLiteOpenHelper`) — буфер непереданных позиций
- Тесты: JUnit 4.13.2, Robolectric 4.7.3
- Локализация: Transifex (48 каталогов `values-*`)
Licensed under the Apache License, Version 2.0 (the "License"); ## Структура
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 | Путь | Назначение |
|---|---|
| `app/src/main/java/org/traccar/client/MainActivity.kt`, `MainFragment.kt` | Экран настроек (PreferenceFragment), запуск/остановка трекинга, запрос разрешений на геолокацию и отключение энергосбережения |
| `app/src/main/java/org/traccar/client/TrackingService.kt`, `TrackingController.kt` | Foreground-служба и логика цикла: получить позицию → записать в БД → отправить → удалить |
| `app/src/main/java/org/traccar/client/PositionProvider.kt`, `AndroidPositionProvider.kt` | Источник координат на системном `LocationManager` |
| `app/src/{regular,google,hidden}/java/.../PositionProviderFactory.kt` | Выбор источника позиций по flavor: системный или Google Fused Location |
| `app/src/main/java/org/traccar/client/ProtocolFormatter.kt` | Формирование URL запроса к серверу (протокол OsmAnd) |
| `app/src/main/java/org/traccar/client/RequestManager.kt`, `NetworkManager.kt` | HTTP-отправка и отслеживание состояния сети |
| `app/src/main/java/org/traccar/client/DatabaseHelper.kt` | SQLite-очередь позиций |
| `app/src/main/java/org/traccar/client/AutostartReceiver.kt`, `BatteryOptimizationHelper.kt`, `WakefulBroadcastReceiver.kt` | Автозапуск после перезагрузки, wake lock, борьба с убийством процесса |
| `app/src/main/java/org/traccar/client/ShortcutActivity.kt`, `DialLaunchReceiver.kt` | Ярлыки старт/стоп и запуск по набору кода в звонилке |
| `app/src/main/java/org/traccar/client/StatusActivity.kt` | Журнал событий приложения |
| `app/src/main/res/xml/preferences.xml` | Описание всех пользовательских настроек |
| `app/src/main/res/xml/network_security_config.xml` | Разрешён HTTP-трафик, доверие пользовательским CA (для HTTPS-прокси) |
| `app/src/test/java/...` | Unit-тесты форматтера URL, БД и отправки запросов |
| `translate.py` | Выгрузка переводов из Transifex (проект `traccar`, ресурс `client`) в `res/values-*` |
| `.github/` | Только CONTRIBUTING, FUNDING и шаблоны issue. CI-workflow в репозитории нет |
Unless required by applicable law or agreed to in writing, software ## Как собрать/запустить
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ```bash
See the License for the specific language governing permissions and ./gradlew assembleRegularDebug # сборка без сервисов Google
limitations under the License. ./gradlew assembleRegularRelease
./gradlew assembleGoogleRelease # вариант с Firebase и Fused Location
./gradlew assembleHiddenRelease # скрытый вариант (applicationId org.traccar.client.hidden)
./gradlew test # unit-тесты (JUnit + Robolectric)
```
Три product flavor'а: `regular` (по умолчанию), `google`, `hidden`. Для сборки `google`-варианта задача `copyJson` копирует `google-services.json` из внешнего каталога `../../environment/google-services/traccar-client-android.json` — этого каталога в репозитории нет, для своей сборки нужен собственный файл Firebase либо использование flavor `regular`.
Обновление переводов: `./translate.py -t <transifex_token>` (требуется пакет `transifex-python`).
## Конфигурация
Настройки задаются в самом приложении и хранятся в SharedPreferences (`app/src/main/res/xml/preferences.xml`):
| Ключ | Назначение |
|---|---|
| `status` | Переключатель «служба запущена» |
| `id` | Идентификатор устройства; генерируется автоматически при первом запуске, должен совпадать с идентификатором в Traccar |
| `url` | Адрес сервера, куда шлются позиции (http:// или https://) |
| `accuracy` | Точность: high / medium / low |
| `interval` | Период опроса, секунды (по умолчанию 300) |
| `distance` | Минимальное смещение для отправки, метры (0 — выключено) |
| `angle` | Минимальное изменение курса, градусы (0 — выключено) |
| `buffer` | Буферизация точек при отсутствии сети |
| `wakelock` | Удержание процессора |
Сборочные параметры: `applicationId org.traccar.client` (у flavor `hidden``org.traccar.client.hidden`), `versionCode 81`, `versionName 7.0`, `gradle.properties` содержит только `android.useAndroidX=true`.
Секретов в репозитории нет: ключи Firebase и токен Transifex в коде отсутствуют и подставляются извне.
## Состояние
Рабочий, но копия устаревшая: 438 коммитов, последний — 05.04.2023 (Anton Tananaev, «Non nullable fields»), версия приложения 7.0 (versionCode 81). Оригинальный проект с тех пор развивается дальше, форк с ним не синхронизировали. Собственных коммитов владельца форка нет, поэтому дата последней своей правки отсутствует.
## Что не доделано
Меток TODO/FIXME и заглушек в коде нет — это релизная версия официального приложения. Применительно к самому форку не хватает только синхронизации с upstream: копия отстаёт от оригинала более чем на три года.
+27
Просмотреть файл
@@ -0,0 +1,27 @@
# [Traccar Client for Android](https://www.traccar.org/client)
[![Get it on Google Play](http://www.tananaev.com/badges/google-play.svg)](https://play.google.com/store/apps/details?id=org.traccar.client) [![Get it on F-Droid](http://www.tananaev.com/badges/f-droid.svg)](https://f-droid.org/repository/browse/?fdid=org.traccar.client)
## Overview
Traccar Client is an Android GPS tracking application. It can work with Traccar open source server software.
## Team
- Anton Tananaev ([anton@traccar.org](mailto:anton@traccar.org))
## License
Apache License, Version 2.0
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+17 -21
Просмотреть файл
@@ -2,29 +2,23 @@ apply plugin: 'com.android.application'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
android { android {
compileSdkVersion 31 compileSdkVersion 33
defaultConfig { defaultConfig {
applicationId 'org.traccar.client' applicationId 'org.traccar.client'
buildConfigField 'boolean', 'HIDDEN_APP', 'false' buildConfigField 'boolean', 'HIDDEN_APP', 'false'
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 31 targetSdkVersion 33
versionCode 75 versionCode 81
versionName '6.14' versionName '7.0'
multiDexEnabled true multiDexEnabled true
} }
namespace 'org.traccar.client'
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
packagingOptions { packagingOptions {
exclude 'META-INF/DEPENDENCIES' resources {
} excludes += ['META-INF/DEPENDENCIES']
}
lintOptions {
checkReleaseBuilds false
} }
flavorDimensions 'default' flavorDimensions 'default'
@@ -44,27 +38,29 @@ android {
includeAndroidResources = true includeAndroidResources = true
} }
} }
lint {
checkReleaseBuilds false
}
} }
dependencies { dependencies {
implementation 'com.google.android.material:material:1.5.0-alpha04' implementation 'com.google.android.material:material:1.6.1' // wait for preference-ktx update
implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.preference:preference-ktx:1.1.1' implementation 'androidx.preference:preference-ktx:1.2.0'
implementation 'androidx.test:core-ktx:1.4.0' implementation 'androidx.core:core-ktx:1.9.0'
implementation 'androidx.core:core-ktx:1.6.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.github.judemanutd:autostarter:1.1.0' implementation 'com.github.judemanutd:autostarter:1.1.0'
implementation('dev.doubledot.doki:library:0.0.1@aar') { implementation('dev.doubledot.doki:library:0.0.1@aar') {
transitive = true transitive = true
} }
testImplementation 'junit:junit:4.13.2' testImplementation 'junit:junit:4.13.2'
testImplementation 'org.robolectric:robolectric:4.6.1' testImplementation 'org.robolectric:robolectric:4.7.3'
googleImplementation platform('com.google.firebase:firebase-bom:28.2.1') googleImplementation platform('com.google.firebase:firebase-bom:28.2.1')
googleImplementation 'com.google.firebase:firebase-core' googleImplementation 'com.google.firebase:firebase-core'
googleImplementation 'com.google.firebase:firebase-analytics' googleImplementation 'com.google.firebase:firebase-analytics'
googleImplementation 'com.google.firebase:firebase-crashlytics' googleImplementation 'com.google.firebase:firebase-crashlytics'
googleImplementation 'com.google.android.gms:play-services-location:18.0.0' googleImplementation 'com.google.android.gms:play-services-location:21.0.1'
googleImplementation 'com.google.android.play:core:1.10.2' googleImplementation 'com.google.android.play:core:1.10.3'
} }
if (getGradle().getStartParameter().getTaskRequests().toString().contains('Google')) { if (getGradle().getStartParameter().getTaskRequests().toString().contains('Google')) {
+2 -2
Просмотреть файл
@@ -30,7 +30,7 @@ class GooglePositionProvider(context: Context, listener: PositionListener) : Pos
@Suppress("DEPRECATION", "MissingPermission") @Suppress("DEPRECATION", "MissingPermission")
override fun startUpdates() { override fun startUpdates() {
val locationRequest = LocationRequest() val locationRequest = LocationRequest()
locationRequest.priority = getPriority(preferences.getString(MainFragment.KEY_ACCURACY,"medium")) locationRequest.priority = getPriority(preferences.getString(MainFragment.KEY_ACCURACY, "medium"))
locationRequest.interval = if (distance > 0 || angle > 0) MINIMUM_INTERVAL else interval locationRequest.interval = if (distance > 0 || angle > 0) MINIMUM_INTERVAL else interval
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper()) fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
} }
@@ -43,7 +43,7 @@ class GooglePositionProvider(context: Context, listener: PositionListener) : Pos
override fun requestSingleLocation() { override fun requestSingleLocation() {
fusedLocationClient.lastLocation.addOnSuccessListener { location -> fusedLocationClient.lastLocation.addOnSuccessListener { location ->
if (location != null) { if (location != null) {
listener.onPositionUpdate(Position(deviceId, location, getBatteryLevel(context))) listener.onPositionUpdate(Position(deviceId, location, getBatteryStatus(context)))
} }
} }
} }
+15
Просмотреть файл
@@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333">
<group android:scaleX="0.58"
android:scaleY="0.58"
android:translateX="5.04"
android:translateY="5.04">
<path
android:fillColor="@android:color/white"
android:pathData="M19.14,12.94c0.04,-0.3 0.06,-0.61 0.06,-0.94c0,-0.32 -0.02,-0.64 -0.07,-0.94l2.03,-1.58c0.18,-0.14 0.23,-0.41 0.12,-0.61l-1.92,-3.32c-0.12,-0.22 -0.37,-0.29 -0.59,-0.22l-2.39,0.96c-0.5,-0.38 -1.03,-0.7 -1.62,-0.94L14.4,2.81c-0.04,-0.24 -0.24,-0.41 -0.48,-0.41h-3.84c-0.24,0 -0.43,0.17 -0.47,0.41L9.25,5.35C8.66,5.59 8.12,5.92 7.63,6.29L5.24,5.33c-0.22,-0.08 -0.47,0 -0.59,0.22L2.74,8.87C2.62,9.08 2.66,9.34 2.86,9.48l2.03,1.58C4.84,11.36 4.8,11.69 4.8,12s0.02,0.64 0.07,0.94l-2.03,1.58c-0.18,0.14 -0.23,0.41 -0.12,0.61l1.92,3.32c0.12,0.22 0.37,0.29 0.59,0.22l2.39,-0.96c0.5,0.38 1.03,0.7 1.62,0.94l0.36,2.54c0.05,0.24 0.24,0.41 0.48,0.41h3.84c0.24,0 0.44,-0.17 0.47,-0.41l0.36,-2.54c0.59,-0.24 1.13,-0.56 1.62,-0.94l2.39,0.96c0.22,0.08 0.47,0 0.59,-0.22l1.92,-3.32c0.12,-0.22 0.07,-0.47 -0.12,-0.61L19.14,12.94zM12,15.6c-1.98,0 -3.6,-1.62 -3.6,-3.6s1.62,-3.6 3.6,-3.6s3.6,1.62 3.6,3.6S13.98,15.6 12,15.6z"/>
</group>
</vector>
+3 -2
Просмотреть файл
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/light"/> <background android:drawable="@android:color/white"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/> <foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon> </adaptive-icon>
-5
Просмотреть файл
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/light"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.3 KiB

После

Ширина:  |  Высота:  |  Размер: 3.5 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 2.0 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 2.1 KiB

После

Ширина:  |  Высота:  |  Размер: 2.2 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.2 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 4.7 KiB

После

Ширина:  |  Высота:  |  Размер: 5.1 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 2.5 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 7.6 KiB

После

Ширина:  |  Высота:  |  Размер: 8.2 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 4.7 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 11 KiB

После

Ширина:  |  Высота:  |  Размер: 12 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 4.4 KiB

+6 -4
Просмотреть файл
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest <manifest
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools">
package="org.traccar.client">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
@@ -26,7 +26,7 @@
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:name=".MainApplication" android:name=".MainApplication"
tools:ignore="GoogleAppIndexingWarning"> tools:ignore="GoogleAppIndexingWarning,UnusedAttribute">
<meta-data <meta-data
android:name="google_analytics_adid_collection_enabled" android:name="google_analytics_adid_collection_enabled"
@@ -59,7 +59,9 @@
android:exported="true" android:exported="true"
android:label="@string/menu_shortcuts"> android:label="@string/menu_shortcuts">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.VIEW" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.CREATE_SHORTCUT" /> <action android:name="android.intent.action.CREATE_SHORTCUT" />
</intent-filter> </intent-filter>
</activity> </activity>
Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 21 KiB

Двоичные данные
Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 26 KiB

+2 -2
Просмотреть файл
@@ -47,11 +47,11 @@ class AndroidPositionProvider(context: Context, listener: PositionListener) : Po
try { try {
val location = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER) val location = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER)
if (location != null) { if (location != null) {
listener.onPositionUpdate(Position(deviceId, location, getBatteryLevel(context))) listener.onPositionUpdate(Position(deviceId, location, getBatteryStatus(context)))
} else { } else {
locationManager.requestSingleUpdate(provider, object : LocationListener { locationManager.requestSingleUpdate(provider, object : LocationListener {
override fun onLocationChanged(location: Location) { override fun onLocationChanged(location: Location) {
listener.onPositionUpdate(Position(deviceId, location, getBatteryLevel(context))) listener.onPositionUpdate(Position(deviceId, location, getBatteryStatus(context)))
} }
override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {} override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {}
+6 -2
Просмотреть файл
@@ -66,7 +66,7 @@ class BatteryOptimizationHelper {
} }
} }
fun requestException(context: Context) { fun requestException(context: Context): Boolean {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
if (!sharedPreferences.getBoolean(KEY_EXCEPTION_REQUESTED, false)) { if (!sharedPreferences.getBoolean(KEY_EXCEPTION_REQUESTED, false)) {
@@ -80,15 +80,19 @@ class BatteryOptimizationHelper {
requestVendorException(context) requestVendorException(context)
} }
} }
return true
} }
} else if (!sharedPreferences.getBoolean(KEY_AUTOSTART_REQUESTED, false)) { } else if (!sharedPreferences.getBoolean(KEY_AUTOSTART_REQUESTED, false)) {
sharedPreferences.edit().putBoolean(KEY_AUTOSTART_REQUESTED, true).apply() sharedPreferences.edit().putBoolean(KEY_AUTOSTART_REQUESTED, true).apply()
try { try {
AutoStartPermissionHelper.getInstance().getAutoStartPermission(context) if (AutoStartPermissionHelper.getInstance().getAutoStartPermission(context)) {
return true
}
} catch (e: SecurityException) { } catch (e: SecurityException) {
} }
} }
} }
return false
} }
companion object { companion object {
+21
Просмотреть файл
@@ -0,0 +1,21 @@
/*
* Copyright 2022 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.traccar.client
data class BatteryStatus(
val level: Double = 0.0,
val charging: Boolean = false,
)
+7 -2
Просмотреть файл
@@ -1,5 +1,5 @@
/* /*
* Copyright 2015 - 2021 Anton Tananaev (anton@traccar.org) * Copyright 2015 - 2022 Anton Tananaev (anton@traccar.org)
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
@file:Suppress("DEPRECATION", "StaticFieldLeak") @file:Suppress("DEPRECATION", "StaticFieldLeak")
package org.traccar.client package org.traccar.client
import android.annotation.SuppressLint
import android.content.ContentValues import android.content.ContentValues
import android.content.Context import android.content.Context
import android.database.SQLException import android.database.SQLException
@@ -65,6 +66,7 @@ class DatabaseHelper(context: Context?) : SQLiteOpenHelper(context, DATABASE_NAM
"course REAL," + "course REAL," +
"accuracy REAL," + "accuracy REAL," +
"battery REAL," + "battery REAL," +
"charging INTEGER," +
"mock INTEGER)" "mock INTEGER)"
) )
} }
@@ -90,6 +92,7 @@ class DatabaseHelper(context: Context?) : SQLiteOpenHelper(context, DATABASE_NAM
values.put("course", position.course) values.put("course", position.course)
values.put("accuracy", position.accuracy) values.put("accuracy", position.accuracy)
values.put("battery", position.battery) values.put("battery", position.battery)
values.put("charging", if (position.charging) 1 else 0)
values.put("mock", if (position.mock) 1 else 0) values.put("mock", if (position.mock) 1 else 0)
db.insertOrThrow("position", null, values) db.insertOrThrow("position", null, values)
} }
@@ -102,6 +105,7 @@ class DatabaseHelper(context: Context?) : SQLiteOpenHelper(context, DATABASE_NAM
}.execute() }.execute()
} }
@SuppressLint("Range")
fun selectPosition(): Position? { fun selectPosition(): Position? {
db.rawQuery("SELECT * FROM position ORDER BY id LIMIT 1", null).use { cursor -> db.rawQuery("SELECT * FROM position ORDER BY id LIMIT 1", null).use { cursor ->
if (cursor.count > 0) { if (cursor.count > 0) {
@@ -117,6 +121,7 @@ class DatabaseHelper(context: Context?) : SQLiteOpenHelper(context, DATABASE_NAM
course = cursor.getDouble(cursor.getColumnIndex("course")), course = cursor.getDouble(cursor.getColumnIndex("course")),
accuracy = cursor.getDouble(cursor.getColumnIndex("accuracy")), accuracy = cursor.getDouble(cursor.getColumnIndex("accuracy")),
battery = cursor.getDouble(cursor.getColumnIndex("battery")), battery = cursor.getDouble(cursor.getColumnIndex("battery")),
charging = cursor.getInt(cursor.getColumnIndex("charging")) > 0,
mock = cursor.getInt(cursor.getColumnIndex("mock")) > 0, mock = cursor.getInt(cursor.getColumnIndex("mock")) > 0,
) )
} }
@@ -147,7 +152,7 @@ class DatabaseHelper(context: Context?) : SQLiteOpenHelper(context, DATABASE_NAM
} }
companion object { companion object {
const val DATABASE_VERSION = 3 const val DATABASE_VERSION = 4
const val DATABASE_NAME = "traccar.db" const val DATABASE_NAME = "traccar.db"
} }
+48 -15
Просмотреть файл
@@ -1,5 +1,5 @@
/* /*
* Copyright 2012 - 2021 Anton Tananaev (anton@traccar.org) * Copyright 2012 - 2022 Anton Tananaev (anton@traccar.org)
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -54,6 +54,7 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
private lateinit var sharedPreferences: SharedPreferences private lateinit var sharedPreferences: SharedPreferences
private lateinit var alarmManager: AlarmManager private lateinit var alarmManager: AlarmManager
private lateinit var alarmIntent: PendingIntent private lateinit var alarmIntent: PendingIntent
private var requestingPermissions: Boolean = false
@SuppressLint("UnspecifiedImmutableFlag") @SuppressLint("UnspecifiedImmutableFlag")
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
@@ -61,7 +62,7 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
removeLauncherIcon() removeLauncherIcon()
} }
setHasOptionsMenu(true) setHasOptionsMenu(true)
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())
setPreferencesFromResource(R.xml.preferences, rootKey) setPreferencesFromResource(R.xml.preferences, rootKey)
initPreferences() initPreferences()
@@ -95,9 +96,9 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
originalIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND) originalIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
PendingIntent.FLAG_MUTABLE PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
} else { } else {
0 PendingIntent.FLAG_UPDATE_CURRENT
} }
alarmIntent = PendingIntent.getBroadcast(activity, 0, originalIntent, flags) alarmIntent = PendingIntent.getBroadcast(activity, 0, originalIntent, flags)
@@ -125,6 +126,7 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
} }
} }
@Suppress("DEPRECATION")
override fun onDisplayPreferenceDialog(preference: Preference) { override fun onDisplayPreferenceDialog(preference: Preference) {
if (listOf(KEY_INTERVAL, KEY_DISTANCE, KEY_ANGLE).contains(preference.key)) { if (listOf(KEY_INTERVAL, KEY_DISTANCE, KEY_ANGLE).contains(preference.key)) {
val f: EditTextPreferenceDialogFragmentCompat = val f: EditTextPreferenceDialogFragmentCompat =
@@ -154,6 +156,13 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
} }
} }
override fun onStart() {
super.onStart()
if (requestingPermissions) {
requestingPermissions = BatteryOptimizationHelper().requestException(requireContext())
}
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
sharedPreferences.registerOnSharedPreferenceChangeListener(this) sharedPreferences.registerOnSharedPreferenceChangeListener(this)
@@ -205,7 +214,7 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
} }
private fun initPreferences() { private fun initPreferences() {
PreferenceManager.setDefaultValues(activity, R.xml.preferences, false) PreferenceManager.setDefaultValues(requireActivity(), R.xml.preferences, false)
if (!sharedPreferences.contains(KEY_DEVICE)) { if (!sharedPreferences.contains(KEY_DEVICE)) {
val id = (Random().nextInt(900000) + 100000).toString() val id = (Random().nextInt(900000) + 100000).toString()
sharedPreferences.edit().putString(KEY_DEVICE, id).apply() sharedPreferences.edit().putString(KEY_DEVICE, id).apply()
@@ -214,6 +223,19 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
findPreference<Preference>(KEY_DEVICE)?.summary = sharedPreferences.getString(KEY_DEVICE, null) findPreference<Preference>(KEY_DEVICE)?.summary = sharedPreferences.getString(KEY_DEVICE, null)
} }
private fun showBackgroundLocationDialog(context: Context, onSuccess: () -> Unit) {
val builder = AlertDialog.Builder(context)
val option = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
context.packageManager.backgroundPermissionOptionLabel
} else {
context.getString(R.string.request_background_option)
}
builder.setMessage(context.getString(R.string.request_background, option))
builder.setPositiveButton(android.R.string.ok) { _, _ -> onSuccess() }
builder.setNegativeButton(android.R.string.cancel, null)
builder.show()
}
private fun startTrackingService(checkPermission: Boolean, initialPermission: Boolean) { private fun startTrackingService(checkPermission: Boolean, initialPermission: Boolean) {
var permission = initialPermission var permission = initialPermission
if (checkPermission) { if (checkPermission) {
@@ -224,10 +246,7 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
permission = requiredPermissions.isEmpty() permission = requiredPermissions.isEmpty()
if (!permission) { if (!permission) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions( requestPermissions(requiredPermissions.toTypedArray(), PERMISSIONS_REQUEST_LOCATION)
requiredPermissions.toTypedArray(),
PERMISSIONS_REQUEST_LOCATION
)
} }
return return
} }
@@ -235,11 +254,22 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
if (permission) { if (permission) {
setPreferencesEnabled(false) setPreferencesEnabled(false)
ContextCompat.startForegroundService(requireContext(), Intent(activity, TrackingService::class.java)) ContextCompat.startForegroundService(requireContext(), Intent(activity, TrackingService::class.java))
alarmManager.setInexactRepeating( if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
AlarmManager.ELAPSED_REALTIME_WAKEUP, alarmManager.setInexactRepeating(
ALARM_MANAGER_INTERVAL.toLong(), ALARM_MANAGER_INTERVAL.toLong(), alarmIntent AlarmManager.ELAPSED_REALTIME_WAKEUP,
) ALARM_MANAGER_INTERVAL.toLong(), ALARM_MANAGER_INTERVAL.toLong(), alarmIntent
BatteryOptimizationHelper().requestException(requireContext()) )
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
&& ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_BACKGROUND_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestingPermissions = true
showBackgroundLocationDialog(requireContext()) {
requestPermissions(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), PERMISSIONS_REQUEST_BACKGROUND_LOCATION)
}
} else {
requestingPermissions = BatteryOptimizationHelper().requestException(requireContext())
}
} else { } else {
sharedPreferences.edit().putBoolean(KEY_STATUS, false).apply() sharedPreferences.edit().putBoolean(KEY_STATUS, false).apply()
val preference = findPreference<TwoStatePreference>(KEY_STATUS) val preference = findPreference<TwoStatePreference>(KEY_STATUS)
@@ -248,7 +278,9 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
} }
private fun stopTrackingService() { private fun stopTrackingService() {
alarmManager.cancel(alarmIntent) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
alarmManager.cancel(alarmIntent)
}
requireActivity().stopService(Intent(activity, TrackingService::class.java)) requireActivity().stopService(Intent(activity, TrackingService::class.java))
setPreferencesEnabled(true) setPreferencesEnabled(true)
} }
@@ -292,6 +324,7 @@ class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListene
const val KEY_BUFFER = "buffer" const val KEY_BUFFER = "buffer"
const val KEY_WAKELOCK = "wakelock" const val KEY_WAKELOCK = "wakelock"
private const val PERMISSIONS_REQUEST_LOCATION = 2 private const val PERMISSIONS_REQUEST_LOCATION = 2
private const val PERMISSIONS_REQUEST_BACKGROUND_LOCATION = 3
} }
} }
+26 -6
Просмотреть файл
@@ -1,5 +1,5 @@
/* /*
* Copyright 2015 - 2021 Anton Tananaev (anton@traccar.org) * Copyright 2015 - 2022 Anton Tananaev (anton@traccar.org)
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -31,19 +31,39 @@ data class Position(
val course: Double = 0.0, val course: Double = 0.0,
val accuracy: Double = 0.0, val accuracy: Double = 0.0,
val battery: Double = 0.0, val battery: Double = 0.0,
val charging: Boolean = false,
val mock: Boolean = false, val mock: Boolean = false,
) { ) {
constructor(deviceId: String, location: Location, battery: Double) : this( constructor(deviceId: String, location: Location, battery: BatteryStatus) : this(
deviceId = deviceId, deviceId = deviceId,
time = Date(location.time), time = Date(location.time.correctRollover()),
latitude = location.latitude, latitude = location.latitude,
longitude = location.longitude, longitude = location.longitude,
altitude = location.altitude, altitude = location.altitude,
speed = location.speed * 1.943844, // speed in knots speed = location.speed * 1.943844, // speed in knots
course = location.bearing.toDouble(), course = location.bearing.toDouble(),
accuracy = if (location.provider != null && location.provider != LocationManager.GPS_PROVIDER) location.accuracy.toDouble() else 0.0, accuracy = if (location.provider != null && location.provider != LocationManager.GPS_PROVIDER) {
battery = battery, location.accuracy.toDouble()
mock = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) location.isFromMockProvider else false, } else {
0.0
},
battery = battery.level,
charging = battery.charging,
mock = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
location.isMock
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
@Suppress("DEPRECATION")
location.isFromMockProvider
} else {
false
},
) )
} }
private const val rolloverDate = 1554508800000L // April 6, 2019
private const val rolloverOffset = 619315200000L // 1024 weeks
private fun Long.correctRollover(): Long {
return if (this < rolloverDate) this + rolloverOffset else this
}
+13 -8
Просмотреть файл
@@ -1,5 +1,5 @@
/* /*
* Copyright 2013 - 2021 Anton Tananaev (anton@traccar.org) * Copyright 2013 - 2022 Anton Tananaev (anton@traccar.org)
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -47,27 +47,32 @@ abstract class PositionProvider(
abstract fun requestSingleLocation() abstract fun requestSingleLocation()
protected fun processLocation(location: Location?) { protected fun processLocation(location: Location?) {
val lastLocation = this.lastLocation
if (location != null && if (location != null &&
(lastLocation == null || location.time - lastLocation!!.time >= interval || distance > 0 (lastLocation == null || location.time - lastLocation.time >= interval || distance > 0
&& location.distanceTo(lastLocation) >= distance || angle > 0 && location.distanceTo(lastLocation) >= distance || angle > 0
&& abs(location.bearing - lastLocation!!.bearing) >= angle) && abs(location.bearing - lastLocation.bearing) >= angle)
) { ) {
Log.i(TAG, "location new") Log.i(TAG, "location new")
lastLocation = location this.lastLocation = location
listener.onPositionUpdate(Position(deviceId, location, getBatteryLevel(context))) listener.onPositionUpdate(Position(deviceId, location, getBatteryStatus(context)))
} else { } else {
Log.i(TAG, if (location != null) "location ignored" else "location nil") Log.i(TAG, if (location != null) "location ignored" else "location nil")
} }
} }
protected fun getBatteryLevel(context: Context): Double { protected fun getBatteryStatus(context: Context): BatteryStatus {
val batteryIntent = context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED)) val batteryIntent = context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
if (batteryIntent != null) { if (batteryIntent != null) {
val level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0) val level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0)
val scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1) val scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1)
return level * 100.0 / scale val status = batteryIntent.getIntExtra(BatteryManager.EXTRA_STATUS, -1)
return BatteryStatus(
level = level * 100.0 / scale,
charging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL,
)
} }
return 0.0 return BatteryStatus()
} }
companion object { companion object {
+3
Просмотреть файл
@@ -31,6 +31,9 @@ object ProtocolFormatter {
.appendQueryParameter("altitude", position.altitude.toString()) .appendQueryParameter("altitude", position.altitude.toString())
.appendQueryParameter("accuracy", position.accuracy.toString()) .appendQueryParameter("accuracy", position.accuracy.toString())
.appendQueryParameter("batt", position.battery.toString()) .appendQueryParameter("batt", position.battery.toString())
if (position.charging) {
builder.appendQueryParameter("charge", position.charging.toString())
}
if (position.mock) { if (position.mock) {
builder.appendQueryParameter("mock", position.mock.toString()) builder.appendQueryParameter("mock", position.mock.toString())
} }
+2 -3
Просмотреть файл
@@ -57,11 +57,10 @@ class TrackingService : Service() {
@SuppressLint("WakelockTimeout") @SuppressLint("WakelockTimeout")
override fun onCreate() { override fun onCreate() {
startForeground(NOTIFICATION_ID, createNotification(this))
Log.i(TAG, "service create") Log.i(TAG, "service create")
sendBroadcast(Intent(ACTION_STARTED)) sendBroadcast(Intent(ACTION_STARTED))
StatusActivity.addMessage(getString(R.string.status_service_create)) StatusActivity.addMessage(getString(R.string.status_service_create))
startForeground(NOTIFICATION_ID, createNotification(this))
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(MainFragment.KEY_WAKELOCK, true)) { if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(MainFragment.KEY_WAKELOCK, true)) {
@@ -89,10 +88,10 @@ class TrackingService : Service() {
} }
override fun onDestroy() { override fun onDestroy() {
stopForeground(true)
Log.i(TAG, "service destroy") Log.i(TAG, "service destroy")
sendBroadcast(Intent(ACTION_STOPPED)) sendBroadcast(Intent(ACTION_STOPPED))
StatusActivity.addMessage(getString(R.string.status_service_destroy)) StatusActivity.addMessage(getString(R.string.status_service_destroy))
stopForeground(true)
if (wakeLock?.isHeld == true) { if (wakeLock?.isHeld == true) {
wakeLock?.release() wakeLock?.release()
} }
+15
Просмотреть файл
@@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="64"
android:viewportHeight="64">
<group android:scaleX="0.71"
android:scaleY="0.71"
android:translateX="9.28"
android:translateY="9.28">
<path
android:pathData="m32.459,10.617c-3.783,-0.085 -7.636,0.834 -11.152,2.865 -10.228,5.906 -13.731,18.983 -7.826,29.211 5.906,10.228 18.983,13.731 29.211,7.826 10.228,-5.906 13.733,-18.983 7.828,-29.211 -3.875,-6.712 -10.839,-10.529 -18.061,-10.691zM40.778,19.38c1.737,1.331 3.242,2.997 4.404,5.01 1.162,2.013 1.854,4.15 2.137,6.319l-3.804,0.547c-0.223,-1.679 -0.73,-3.405 -1.629,-4.964 -0.9,-1.559 -2.139,-2.86 -3.482,-3.892zM36.188,25.461c0.948,0.734 1.766,1.632 2.402,2.734 0.636,1.102 1.003,2.258 1.165,3.446l-3.803,0.549c-0.101,-0.699 -0.284,-1.445 -0.658,-2.093 -0.374,-0.648 -0.928,-1.179 -1.483,-1.615l2.377,-3.019zM21.601,29.215 L25.407,35.806 29.213,42.398a7.611,7.611 0,0 1,-7.612 0,7.611 7.611,0 0,1 -3.806,-6.592 7.611,7.611 0,0 1,3.806 -6.591zM30.306,31.049a1.903,1.903 0,0 1,1.693 0.951,1.903 1.903,0 0,1 -0.697,2.599 1.903,1.903 0,0 1,-2.599 -0.695,1.903 1.903,0 0,1 0.697,-2.601 1.903,1.903 0,0 1,0.906 -0.254z"
android:strokeWidth=".84379"
android:fillColor="#2e7d32"/>
</group>
</vector>
+15
Просмотреть файл
@@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#2E7D32">
<group android:scaleX="0.58"
android:scaleY="0.58"
android:translateX="5.04"
android:translateY="5.04">
<path
android:fillColor="@android:color/white"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-2h2v2zM13,13h-2L11,7h2v6z"/>
</group>
</vector>
+15
Просмотреть файл
@@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#2E7D32">
<group android:scaleX="0.58"
android:scaleY="0.58"
android:translateX="5.04"
android:translateY="5.04">
<path
android:fillColor="@android:color/white"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM9.5,16.5v-9l7,4.5L9.5,16.5z"/>
</group>
</vector>
+15
Просмотреть файл
@@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#2E7D32">
<group android:scaleX="0.58"
android:scaleY="0.58"
android:translateX="5.04"
android:translateY="5.04">
<path
android:fillColor="@android:color/white"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM11,16H9V8h2V16zM15,16h-2V8h2V16z"/>
</group>
</vector>
+3 -2
Просмотреть файл
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/primary"/> <background android:drawable="@android:color/white"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/> <foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon> </adaptive-icon>
-5
Просмотреть файл
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/primary"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
+3 -2
Просмотреть файл
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/light"/> <background android:drawable="@android:color/white"/>
<foreground android:drawable="@mipmap/ic_sos_foreground"/> <foreground android:drawable="@drawable/ic_sos_foreground"/>
<monochrome android:drawable="@drawable/ic_sos_foreground"/>
</adaptive-icon> </adaptive-icon>
-5
Просмотреть файл
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/light"/>
<foreground android:drawable="@mipmap/ic_sos_foreground"/>
</adaptive-icon>
+3 -2
Просмотреть файл
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/light"/> <background android:drawable="@android:color/white"/>
<foreground android:drawable="@mipmap/ic_start_foreground"/> <foreground android:drawable="@drawable/ic_start_foreground"/>
<monochrome android:drawable="@drawable/ic_start_foreground"/>
</adaptive-icon> </adaptive-icon>
-5
Просмотреть файл
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/light"/>
<foreground android:drawable="@mipmap/ic_start_foreground"/>
</adaptive-icon>
+3 -2
Просмотреть файл
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/light"/> <background android:drawable="@android:color/white"/>
<foreground android:drawable="@mipmap/ic_stop_foreground"/> <foreground android:drawable="@drawable/ic_stop_foreground"/>
<monochrome android:drawable="@drawable/ic_stop_foreground"/>
</adaptive-icon> </adaptive-icon>
-5
Просмотреть файл
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/light"/>
<foreground android:drawable="@mipmap/ic_stop_foreground"/>
</adaptive-icon>
Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 4.2 KiB

После

Ширина:  |  Высота:  |  Размер: 4.0 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.0 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.1 KiB

После

Ширина:  |  Высота:  |  Размер: 3.6 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.5 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.2 KiB

После

Ширина:  |  Высота:  |  Размер: 3.7 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.7 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.1 KiB

После

Ширина:  |  Высота:  |  Размер: 3.6 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.6 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 2.5 KiB

После

Ширина:  |  Высота:  |  Размер: 2.4 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.7 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.9 KiB

После

Ширина:  |  Высота:  |  Размер: 1.9 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 930 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 2.0 KiB

После

Ширина:  |  Высота:  |  Размер: 2.0 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.0 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 2.0 KiB

После

Ширина:  |  Высота:  |  Размер: 1.9 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 943 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 5.9 KiB

После

Ширина:  |  Высота:  |  Размер: 5.7 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.8 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 4.5 KiB

После

Ширина:  |  Высота:  |  Размер: 5.1 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 2.1 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 4.6 KiB

После

Ширина:  |  Высота:  |  Размер: 5.3 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 2.4 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 4.5 KiB

После

Ширина:  |  Высота:  |  Размер: 5.1 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 2.1 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 9.4 KiB

После

Ширина:  |  Высота:  |  Размер: 9.3 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 7.4 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 7.3 KiB

После

Ширина:  |  Высота:  |  Размер: 8.2 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 4.0 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 7.6 KiB

После

Ширина:  |  Высота:  |  Размер: 8.5 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 4.6 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 7.3 KiB

После

Ширина:  |  Высота:  |  Размер: 8.2 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 4.0 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 13 KiB

После

Ширина:  |  Высота:  |  Размер: 13 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 8.8 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 11 KiB

После

Ширина:  |  Высота:  |  Размер: 12 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 5.4 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 11 KiB

После

Ширина:  |  Высота:  |  Размер: 12 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 6.2 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 11 KiB

После

Ширина:  |  Высота:  |  Размер: 12 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 5.4 KiB

+53
Просмотреть файл
@@ -0,0 +1,53 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="app_name">Traccar Client</string>
<string name="app_logo">Traccar</string>
<string name="shortcut_start">Inicia servei</string>
<string name="shortcut_stop">Atura servei</string>
<string name="shortcut_sos">Envia SOS</string>
<string name="channel_default">Canal principal</string>
<string name="settings_id_title">Id dispositiu</string>
<string name="settings_url_title">URL Servidor</string>
<string name="settings_url_summary">URL del servidor de seguiment</string>
<string name="settings_interval_title">Interval</string>
<string name="settings_interval_summary">Interval d\'enviament en segons</string>
<string name="settings_distance_title">Distància</string>
<string name="settings_distance_summary">Distància en metres per informar</string>
<string name="settings_angle_title">Angle</string>
<string name="settings_angle_summary">Graus de diferència per informar</string>
<string name="settings_status_title">Estat del servei</string>
<string name="settings_status_off">Aturat</string>
<string name="settings_status_on">Inciat</string>
<string name="settings_status_off_summary">Servei aturat</string>
<string name="settings_status_on_summary">Servei iniciat</string>
<string name="settings_buffer">Buffer</string>
<string name="settings_buffer_off_summary">Buffer desactivat</string>
<string name="settings_buffer_on_summary">Buffer activat</string>
<string name="settings_wakelock">Bloca despertar</string>
<string name="settings_wakelock_off_summary">Bloca despertar desactivat</string>
<string name="settings_wakelock_on_summary">Bloca despertar activat</string>
<string name="settings_accuracy_title">Precisió</string>
<string name="settings_accuracy_summary">Precisió</string>
<string name="settings_accuracy_high">Precisió alta</string>
<string name="settings_accuracy_medium">Precisió mitjana</string>
<string name="settings_accuracy_low">Precisió baixa</string>
<string name="settings_foreground_title">Primer pla</string>
<string name="settings_foreground_summary">En primer pla</string>
<string name="menu_status">Estat</string>
<string name="menu_info">Informació</string>
<string name="menu_shortcuts">Dreceres</string>
<string name="menu_clear">Netejar</string>
<string name="status_service_create">Servei iniciat</string>
<string name="status_service_destroy">Servei aturat</string>
<string name="status_send_success">Enviat correctament</string>
<string name="status_send_fail">Error a l\'enviar</string>
<string name="status_location_update">Actualització de localització</string>
<string name="status_network_online">Xarxa en línia</string>
<string name="status_network_offline">Xarxa fora de línia</string>
<string name="hidden_app_name">Configuració del dispositiu</string>
<string name="hidden_alert">Aplicació ocultada. Per obrir-la de nou escriviu 8722227 (TRACCAR).</string>
<string name="error_msg_invalid_url">Adreça URL incorrecte</string>
<string name="request_exception">Per obtenir contínuament les dades de localització, desactivi la optimització de la bateria per aquesta aplicació</string>
<string name="request_background">Per obtenir contínuament les dades de localització, activi el permís \"%s\".</string>
<string name="request_background_option">Permetre tot el temps</string>
</resources>
+4
Просмотреть файл
@@ -34,6 +34,7 @@
<string name="settings_foreground_title">Popředí služba</string> <string name="settings_foreground_title">Popředí služba</string>
<string name="settings_foreground_summary">Zvýšit prioritu služba</string> <string name="settings_foreground_summary">Zvýšit prioritu služba</string>
<string name="menu_status">Stav</string> <string name="menu_status">Stav</string>
<string name="menu_info">Informace</string>
<string name="menu_shortcuts">Přidat zástupce</string> <string name="menu_shortcuts">Přidat zástupce</string>
<string name="menu_clear">Vyčistit</string> <string name="menu_clear">Vyčistit</string>
<string name="status_service_create">Služba spuštěna</string> <string name="status_service_create">Služba spuštěna</string>
@@ -46,4 +47,7 @@
<string name="hidden_app_name">Nastavení zařízení</string> <string name="hidden_app_name">Nastavení zařízení</string>
<string name="hidden_alert">Aplikace byla skryta. Pro znovuotevření vytočte 8722227 (TRACCAR)</string> <string name="hidden_alert">Aplikace byla skryta. Pro znovuotevření vytočte 8722227 (TRACCAR)</string>
<string name="error_msg_invalid_url">Prosím vložte platnou http:// nebo https:// URL</string> <string name="error_msg_invalid_url">Prosím vložte platnou http:// nebo https:// URL</string>
<string name="request_exception">Chcete-li průběžně shromažďovat údaje o poloze, vypněte optimalizaci baterie pro aplikaci.</string>
<string name="request_background">Chcete-li průběžně shromažďovat údaje o poloze, zapněte \"%s\" oprávnění.</string>
<string name="request_background_option">Povolit po celou dobu</string>
</resources> </resources>
+4
Просмотреть файл
@@ -34,6 +34,7 @@
<string name="settings_foreground_title">Υπηρεσία προσκηνίου</string> <string name="settings_foreground_title">Υπηρεσία προσκηνίου</string>
<string name="settings_foreground_summary">Αύξηση προτεραιότητας της υπηρεσίας</string> <string name="settings_foreground_summary">Αύξηση προτεραιότητας της υπηρεσίας</string>
<string name="menu_status">Κατάσταση</string> <string name="menu_status">Κατάσταση</string>
<string name="menu_info">Πληροφορίες</string>
<string name="menu_shortcuts">Προσθήκη συντόμευσης</string> <string name="menu_shortcuts">Προσθήκη συντόμευσης</string>
<string name="menu_clear">Καθαρισμός</string> <string name="menu_clear">Καθαρισμός</string>
<string name="status_service_create">Η υπηρεσία εκκινήθηκε</string> <string name="status_service_create">Η υπηρεσία εκκινήθηκε</string>
@@ -46,4 +47,7 @@
<string name="hidden_app_name">Ρυθμίσεις συσκευής</string> <string name="hidden_app_name">Ρυθμίσεις συσκευής</string>
<string name="hidden_alert">Η εφαρμογή αποκρύφτηκε. Για να προβληθεί καλέστε 8722227 (TRACCAR)</string> <string name="hidden_alert">Η εφαρμογή αποκρύφτηκε. Για να προβληθεί καλέστε 8722227 (TRACCAR)</string>
<string name="error_msg_invalid_url">Παρακαλώ εισάγετε μία έγκυρη http:// ή https:// διεύθυνση</string> <string name="error_msg_invalid_url">Παρακαλώ εισάγετε μία έγκυρη http:// ή https:// διεύθυνση</string>
<string name="request_exception">Για να συλλέγετε συνεχώς δεδομένα τοποθεσίας απενεργοποιήστε την βελτιστοποίηση μπαταρίας για την εφαρμογή.</string>
<string name="request_background">Για να συλλέγετε συνεχώς δεδομένα τοποθεσίας ενεργοποιήστε την επιλογή \"%s\".</string>
<string name="request_background_option">Να επιτρέπεται όλη την ώρα</string>
</resources> </resources>
+7 -3
Просмотреть файл
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?> <?xml version='1.0' encoding='UTF-8'?>
<resources> <resources>
<string name="app_name">Cliente Traccar</string> <string name="app_name">Traccar Client</string>
<string name="app_logo">Traccar</string> <string name="app_logo">Traccar</string>
<string name="shortcut_start">Iniciar servicio</string> <string name="shortcut_start">Iniciar servicio</string>
<string name="shortcut_stop">Detener servicio</string> <string name="shortcut_stop">Detener servicio</string>
@@ -34,16 +34,20 @@
<string name="settings_foreground_title">Servicio en primer plano</string> <string name="settings_foreground_title">Servicio en primer plano</string>
<string name="settings_foreground_summary">Aumentar prioridad del servicio</string> <string name="settings_foreground_summary">Aumentar prioridad del servicio</string>
<string name="menu_status">Estado</string> <string name="menu_status">Estado</string>
<string name="menu_info">Info</string>
<string name="menu_shortcuts">Añadir acceso directo</string> <string name="menu_shortcuts">Añadir acceso directo</string>
<string name="menu_clear">Limpiar</string> <string name="menu_clear">Limpiar</string>
<string name="status_service_create">Servicio iniciado</string> <string name="status_service_create">Servicio iniciado</string>
<string name="status_service_destroy">Servicio detenido</string> <string name="status_service_destroy">Servicio detenido</string>
<string name="status_send_success">Enviado correctamente</string> <string name="status_send_success">Enviado correctamente</string>
<string name="status_send_fail">Falló el envío</string> <string name="status_send_fail">Fallo en el envío</string>
<string name="status_location_update">Actualización de localización</string> <string name="status_location_update">Actualización de localización</string>
<string name="status_network_online">Red en línea</string> <string name="status_network_online">Red en línea</string>
<string name="status_network_offline">Red fuera de línea</string> <string name="status_network_offline">Red fuera de línea</string>
<string name="hidden_app_name">Ajustes del dispositivo</string> <string name="hidden_app_name">Ajustes del dispositivo</string>
<string name="hidden_alert">La aplicación se ha ocultado. Para abrirla de nuevo por favor marque 8722227 (TRACCAR).</string> <string name="hidden_alert">La aplicación se ha ocultado. Para abrirla de nuevo por favor marque 8722227 (TRACCAR).</string>
<string name="error_msg_invalid_url">Por favor. Introduzca una URL válida http:// ó https:// </string> <string name="error_msg_invalid_url">Por favor, introduzca una URL válida http:// ó https:// </string>
<string name="request_exception">Para recoger continuamente los datos de localización, desactiva la optimización de la batería de la aplicación.</string>
<string name="request_background">Para recoger continuamente los datos de localización, por favor, activa el permiso \"%s\".</string>
<string name="request_background_option">Permitir todo el tiempo</string>
</resources> </resources>
+7
Просмотреть файл
@@ -23,6 +23,9 @@
<string name="settings_buffer">Offline-puskurointi</string> <string name="settings_buffer">Offline-puskurointi</string>
<string name="settings_buffer_off_summary">Puskurointi pois päältä</string> <string name="settings_buffer_off_summary">Puskurointi pois päältä</string>
<string name="settings_buffer_on_summary">Puskurointi päälle</string> <string name="settings_buffer_on_summary">Puskurointi päälle</string>
<string name="settings_wakelock">Lepotilalukko</string>
<string name="settings_wakelock_off_summary">Lepotilalukko pois päältä</string>
<string name="settings_wakelock_on_summary">Lepotilalukko päällä</string>
<string name="settings_accuracy_title">Sijainnin tarkkuus</string> <string name="settings_accuracy_title">Sijainnin tarkkuus</string>
<string name="settings_accuracy_summary">Haluttu sijainnin tarkkuus</string> <string name="settings_accuracy_summary">Haluttu sijainnin tarkkuus</string>
<string name="settings_accuracy_high">Korkea</string> <string name="settings_accuracy_high">Korkea</string>
@@ -31,6 +34,7 @@
<string name="settings_foreground_title">Edustapalvelu</string> <string name="settings_foreground_title">Edustapalvelu</string>
<string name="settings_foreground_summary">Lisää palvelun prioriteettia</string> <string name="settings_foreground_summary">Lisää palvelun prioriteettia</string>
<string name="menu_status">Tila</string> <string name="menu_status">Tila</string>
<string name="menu_info">Tiedot</string>
<string name="menu_shortcuts">Lisää pikakuvakkeet</string> <string name="menu_shortcuts">Lisää pikakuvakkeet</string>
<string name="menu_clear">Tyhjennä</string> <string name="menu_clear">Tyhjennä</string>
<string name="status_service_create">Palvelu käynnistynyt</string> <string name="status_service_create">Palvelu käynnistynyt</string>
@@ -43,4 +47,7 @@
<string name="hidden_app_name">Laitteen asetukset</string> <string name="hidden_app_name">Laitteen asetukset</string>
<string name="hidden_alert">Sovellus on piilotettu. Näppäile 8722227 (TRACCAR) avataksesi sovelluksen uudelleen.</string> <string name="hidden_alert">Sovellus on piilotettu. Näppäile 8722227 (TRACCAR) avataksesi sovelluksen uudelleen.</string>
<string name="error_msg_invalid_url">Syötä kelvollinen http:// tai https:// URL-osoite</string> <string name="error_msg_invalid_url">Syötä kelvollinen http:// tai https:// URL-osoite</string>
<string name="request_exception">Kerätäksesi jatkuvasti sijaintitietoa, poista akun optimointi käytöstä tältä sovellukselta.</string>
<string name="request_background">Kerätäksesi jatkuvasti sijaintitietoa, salli \"%s\" käyttöoikeus.</string>
<string name="request_background_option">Salli kokoajan</string>
</resources> </resources>
+6
Просмотреть файл
@@ -20,6 +20,12 @@
<string name="settings_status_on">Arrêter</string> <string name="settings_status_on">Arrêter</string>
<string name="settings_status_off_summary">Arrêté</string> <string name="settings_status_off_summary">Arrêté</string>
<string name="settings_status_on_summary">En marche</string> <string name="settings_status_on_summary">En marche</string>
<string name="settings_buffer">Mise en tampon hors ligne</string>
<string name="settings_buffer_off_summary">Mise en tampon désactivée</string>
<string name="settings_buffer_on_summary">Mise en tampon activée</string>
<string name="settings_wakelock">Wake lock</string>
<string name="settings_wakelock_off_summary">Wake lock off</string>
<string name="settings_wakelock_on_summary">Wake lock on</string>
<string name="settings_accuracy_title">Precision de la localisation</string> <string name="settings_accuracy_title">Precision de la localisation</string>
<string name="settings_accuracy_summary">Précision de localisation désirée</string> <string name="settings_accuracy_summary">Précision de localisation désirée</string>
<string name="settings_accuracy_high">Haut</string> <string name="settings_accuracy_high">Haut</string>
+13
Просмотреть файл
@@ -20,6 +20,12 @@
<string name="settings_status_on">Megállítás</string> <string name="settings_status_on">Megállítás</string>
<string name="settings_status_off_summary">Szolgáltatás megállítva</string> <string name="settings_status_off_summary">Szolgáltatás megállítva</string>
<string name="settings_status_on_summary">Szolgáltatás elindítva</string> <string name="settings_status_on_summary">Szolgáltatás elindítva</string>
<string name="settings_buffer">Offline pufferelés</string>
<string name="settings_buffer_off_summary">Pufferelés ki</string>
<string name="settings_buffer_on_summary">Pufferelés be</string>
<string name="settings_wakelock">Ébresztési zár</string>
<string name="settings_wakelock_off_summary">Ébresztési zár ki</string>
<string name="settings_wakelock_on_summary">Ébresztési zár be</string>
<string name="settings_accuracy_title">Pozíció pontossága</string> <string name="settings_accuracy_title">Pozíció pontossága</string>
<string name="settings_accuracy_summary">Kívánt pozíció pontosság</string> <string name="settings_accuracy_summary">Kívánt pozíció pontosság</string>
<string name="settings_accuracy_high">Magas</string> <string name="settings_accuracy_high">Magas</string>
@@ -28,6 +34,7 @@
<string name="settings_foreground_title">Előtér szolgáltatás</string> <string name="settings_foreground_title">Előtér szolgáltatás</string>
<string name="settings_foreground_summary">Szolgáltatás prioritásának emelése</string> <string name="settings_foreground_summary">Szolgáltatás prioritásának emelése</string>
<string name="menu_status">Státusz</string> <string name="menu_status">Státusz</string>
<string name="menu_info">Infó</string>
<string name="menu_shortcuts">Parancsikon hozzáadása</string> <string name="menu_shortcuts">Parancsikon hozzáadása</string>
<string name="menu_clear">Töröl</string> <string name="menu_clear">Töröl</string>
<string name="status_service_create">Szolgáltatás elindítva</string> <string name="status_service_create">Szolgáltatás elindítva</string>
@@ -40,4 +47,10 @@
<string name="hidden_app_name">Eszköz beállítások</string> <string name="hidden_app_name">Eszköz beállítások</string>
<string name="hidden_alert">Ez az applikáció el lett rejtve. Megnyitásához kérjük hívja a 8722227 (TRACCAR) telefonszámot.</string> <string name="hidden_alert">Ez az applikáció el lett rejtve. Megnyitásához kérjük hívja a 8722227 (TRACCAR) telefonszámot.</string>
<string name="error_msg_invalid_url">Adjon meg egy érvényes URL-t (http:// vagy https://)</string> <string name="error_msg_invalid_url">Adjon meg egy érvényes URL-t (http:// vagy https://)</string>
<string name="request_exception">A folyamatos helyadatok
gyűjtéséhez kapcsolja ki
az alkalmazás akkumulátor
optimazilását.</string>
<string name="request_background">A folyamatos helyadat gyűjtéshez engedélyezze a \"%s\" jogosultságot.</string>
<string name="request_background_option">Mindig engedélyezve</string>
</resources> </resources>
+10
Просмотреть файл
@@ -20,6 +20,12 @@
<string name="settings_status_on">Stop</string> <string name="settings_status_on">Stop</string>
<string name="settings_status_off_summary">Servizio arrestato</string> <string name="settings_status_off_summary">Servizio arrestato</string>
<string name="settings_status_on_summary">Servizio avviato</string> <string name="settings_status_on_summary">Servizio avviato</string>
<string name="settings_buffer">Buffering offline</string>
<string name="settings_buffer_off_summary">Buffering spento</string>
<string name="settings_buffer_on_summary">Buffering acceso</string>
<string name="settings_wakelock">Wake lock</string>
<string name="settings_wakelock_off_summary">Wake lock spento</string>
<string name="settings_wakelock_on_summary">Wake lock acceso</string>
<string name="settings_accuracy_title">Accuratezza posizione</string> <string name="settings_accuracy_title">Accuratezza posizione</string>
<string name="settings_accuracy_summary">Precisione desiderata per la posizione</string> <string name="settings_accuracy_summary">Precisione desiderata per la posizione</string>
<string name="settings_accuracy_high">Alta</string> <string name="settings_accuracy_high">Alta</string>
@@ -28,6 +34,7 @@
<string name="settings_foreground_title">Servizio in primo piano</string> <string name="settings_foreground_title">Servizio in primo piano</string>
<string name="settings_foreground_summary">Aumenta la priorità del servizio</string> <string name="settings_foreground_summary">Aumenta la priorità del servizio</string>
<string name="menu_status">Stato</string> <string name="menu_status">Stato</string>
<string name="menu_info">Informazioni</string>
<string name="menu_shortcuts">Aggiungi combinazione rapida</string> <string name="menu_shortcuts">Aggiungi combinazione rapida</string>
<string name="menu_clear">Pulisci</string> <string name="menu_clear">Pulisci</string>
<string name="status_service_create">Servizio avviato</string> <string name="status_service_create">Servizio avviato</string>
@@ -40,4 +47,7 @@
<string name="hidden_app_name">Impostazioni dispositivo</string> <string name="hidden_app_name">Impostazioni dispositivo</string>
<string name="hidden_alert">La app è stata nascosta. Per aprirla nuovamente digita 8722227 (TRACCAR).</string> <string name="hidden_alert">La app è stata nascosta. Per aprirla nuovamente digita 8722227 (TRACCAR).</string>
<string name="error_msg_invalid_url">Per favore inserisci un URL valido http:// o https://</string> <string name="error_msg_invalid_url">Per favore inserisci un URL valido http:// o https://</string>
<string name="request_exception">Per abilitare la raccolta continua delle posizioni, disabilita le ottimizzazioni batteria per questa applicazione</string>
<string name="request_background">Per abilitare la raccolta delle posizione, abilita il permesso \"%s\"</string>
<string name="request_background_option">Contenti per tutto il tempo</string>
</resources> </resources>
+49
Просмотреть файл
@@ -0,0 +1,49 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="app_name">Traccar კლიენტი</string>
<string name="app_logo">Traccar</string>
<string name="shortcut_start">სერვისის სტარტი</string>
<string name="shortcut_stop">სერვისის დასტოპება</string>
<string name="shortcut_sos">SOS სიგნალის გაგზავნა</string>
<string name="channel_default">ძირითადი არხი</string>
<string name="settings_id_title">მოწყობილობის იდენტიფიკატორი</string>
<string name="settings_url_title">სერვერის მისამართი URL</string>
<string name="settings_url_summary">ტრეკინგ სერვერის მისამართი URL</string>
<string name="settings_interval_title">სიხშირე</string>
<string name="settings_interval_summary">რეპორტებს შორის ინტერვალი წამებში</string>
<string name="settings_distance_title">დისტანცია</string>
<string name="settings_distance_summary">რეპორტებს შორის ინტერვალი მეტრებში</string>
<string name="settings_angle_title">მიმართულება</string>
<string name="settings_angle_summary">მიმართულების რეპორტი გრადუსებში</string>
<string name="settings_status_title">სერვისი სტატუსი</string>
<string name="settings_status_off">სტარტი</string>
<string name="settings_status_on">შეჩერება</string>
<string name="settings_status_off_summary">სერვისი შეჩერებულია</string>
<string name="settings_status_on_summary">სერვისი გაშვებულია</string>
<string name="settings_buffer">ოფლაინ ბუფერიზაცია</string>
<string name="settings_buffer_off_summary">ბუფერიზაცია გამორთულია</string>
<string name="settings_buffer_on_summary">ბუფერიზაცია ჩართულია</string>
<string name="settings_wakelock">გაღვიძების ბლოკირება</string>
<string name="settings_wakelock_off_summary">გაღვიძების ბლოკირება გამორთულია</string>
<string name="settings_wakelock_on_summary">გაღვიძების ბლოკირება ჩართულია</string>
<string name="settings_accuracy_title">მდებარეობის სიზუსტე</string>
<string name="settings_accuracy_summary">მდებარეობის სასურველი სიზუსტე</string>
<string name="settings_accuracy_high">მაღალი</string>
<string name="settings_accuracy_medium">საშუალო</string>
<string name="settings_accuracy_low">დაბალი</string>
<string name="settings_foreground_title">ფონური სერვისი</string>
<string name="settings_foreground_summary">სერვისის პრიორიტეტის გაზრდა</string>
<string name="menu_status">სტატუსი</string>
<string name="menu_shortcuts">შორტკატის დამატება</string>
<string name="menu_clear">გასუფთავება</string>
<string name="status_service_create">სერვისი გაშვებულია</string>
<string name="status_service_destroy">სერვისი შეჩერებულია</string>
<string name="status_send_success">წარმატებით გაიგზავნა</string>
<string name="status_send_fail">გაგზავნა ვერ მოხერხდა</string>
<string name="status_location_update">მდებარეობა განახლდა</string>
<string name="status_network_online">ქსელი კავშირშია</string>
<string name="status_network_offline">ქსელი გამორთულია</string>
<string name="hidden_app_name">მოწყობილობის პარამეტრები</string>
<string name="hidden_alert">პროგრამა დამალულია. მის გასახსნელად გთხოვთ აკრიფოთ 8722227 (TRACCAR).</string>
<string name="error_msg_invalid_url">გთხოვთ, შეიყვანოთ სწორი http: // ან https: // URL</string>
</resources>
+2
Просмотреть файл
@@ -34,6 +34,7 @@
<string name="settings_foreground_title">Zināšanu servis</string> <string name="settings_foreground_title">Zināšanu servis</string>
<string name="settings_foreground_summary">Paaugstināt servisa prioritāti</string> <string name="settings_foreground_summary">Paaugstināt servisa prioritāti</string>
<string name="menu_status">Statuss</string> <string name="menu_status">Statuss</string>
<string name="menu_info">Informācija</string>
<string name="menu_shortcuts">Pievienot saīsnes</string> <string name="menu_shortcuts">Pievienot saīsnes</string>
<string name="menu_clear">Notīrīt</string> <string name="menu_clear">Notīrīt</string>
<string name="status_service_create">Serviss uzsākts</string> <string name="status_service_create">Serviss uzsākts</string>
@@ -46,4 +47,5 @@
<string name="hidden_app_name">Ierīces iestatījumi</string> <string name="hidden_app_name">Ierīces iestatījumi</string>
<string name="hidden_alert">Lietotne ir paslēpta. Zvaniet 8722227 (TRACCAR), lai to atkal parādītu.</string> <string name="hidden_alert">Lietotne ir paslēpta. Zvaniet 8722227 (TRACCAR), lai to atkal parādītu.</string>
<string name="error_msg_invalid_url">Lūdzu ievadiet derīgu http:// vai https:// URL</string> <string name="error_msg_invalid_url">Lūdzu ievadiet derīgu http:// vai https:// URL</string>
<string name="request_background_option">Visu laiku atļauts</string>
</resources> </resources>
-9
Просмотреть файл
@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="primary">#2E7D32</color>
<color name="primary_dark">#1B5E20</color>
<color name="accent">#81C784</color>
<color name="light">#FAFAFA</color>
</resources>
+4
Просмотреть файл
@@ -34,6 +34,7 @@
<string name="settings_foreground_title">Voorgrond service</string> <string name="settings_foreground_title">Voorgrond service</string>
<string name="settings_foreground_summary">Verhoog voorrang voor service</string> <string name="settings_foreground_summary">Verhoog voorrang voor service</string>
<string name="menu_status">Status</string> <string name="menu_status">Status</string>
<string name="menu_info">Info</string>
<string name="menu_shortcuts">Voeg snelkoppelingen toe</string> <string name="menu_shortcuts">Voeg snelkoppelingen toe</string>
<string name="menu_clear">Wis</string> <string name="menu_clear">Wis</string>
<string name="status_service_create">Service gestart</string> <string name="status_service_create">Service gestart</string>
@@ -46,4 +47,7 @@
<string name="hidden_app_name">Toestel instellingen</string> <string name="hidden_app_name">Toestel instellingen</string>
<string name="hidden_alert">De app is verborgen. Om hem opnieuw te openen bel je naar 8722227 (TRACCAR).</string> <string name="hidden_alert">De app is verborgen. Om hem opnieuw te openen bel je naar 8722227 (TRACCAR).</string>
<string name="error_msg_invalid_url">Voer alstublieft een geldige http:// of https:// URL in</string> <string name="error_msg_invalid_url">Voer alstublieft een geldige http:// of https:// URL in</string>
<string name="request_exception">Om continu locatiegegevens te kunnen verzamelen is het noodzakelijk dat accuoptimalisatie voor deze app is uitgeschakeld.</string>
<string name="request_background">Geef de \"1%s\" permissie om continu locatieinformatie bij te houden.</string>
<string name="request_background_option">Altijd toestaan</string>
</resources> </resources>
+4
Просмотреть файл
@@ -34,6 +34,7 @@
<string name="settings_foreground_title">Usługa pierwszoplanowa</string> <string name="settings_foreground_title">Usługa pierwszoplanowa</string>
<string name="settings_foreground_summary">Zwiększ priorytet usługi</string> <string name="settings_foreground_summary">Zwiększ priorytet usługi</string>
<string name="menu_status">Status</string> <string name="menu_status">Status</string>
<string name="menu_info">Info</string>
<string name="menu_shortcuts">Dodaj skróty</string> <string name="menu_shortcuts">Dodaj skróty</string>
<string name="menu_clear">Wyczyść</string> <string name="menu_clear">Wyczyść</string>
<string name="status_service_create">Usługa uruchomiona</string> <string name="status_service_create">Usługa uruchomiona</string>
@@ -46,4 +47,7 @@
<string name="hidden_app_name">Ustawienia urządzenia</string> <string name="hidden_app_name">Ustawienia urządzenia</string>
<string name="hidden_alert">Aplikacja została ukryta. By ją otworzyć, zadzwoń pod 8722227 (TRACCAR).</string> <string name="hidden_alert">Aplikacja została ukryta. By ją otworzyć, zadzwoń pod 8722227 (TRACCAR).</string>
<string name="error_msg_invalid_url">Wprowadź poprawny adres http:// lub https:// URL</string> <string name="error_msg_invalid_url">Wprowadź poprawny adres http:// lub https:// URL</string>
<string name="request_exception">Do stałego zbierania danych o lokalizacji, należy wyłączyć optymalizację baterii w aplikacji.</string>
<string name="request_background">Włącz zezwolenie \"%s\", aby ciągle zbierać dane o lokalizacji.</string>
<string name="request_background_option">Pozwól cały czas</string>
</resources> </resources>
+4
Просмотреть файл
@@ -34,6 +34,7 @@
<string name="settings_foreground_title">Serviço em primeiro plano</string> <string name="settings_foreground_title">Serviço em primeiro plano</string>
<string name="settings_foreground_summary">Aumentar a prioridade do serviço</string> <string name="settings_foreground_summary">Aumentar a prioridade do serviço</string>
<string name="menu_status">Estado</string> <string name="menu_status">Estado</string>
<string name="menu_info">Informação</string>
<string name="menu_shortcuts">Adicionar atalhos</string> <string name="menu_shortcuts">Adicionar atalhos</string>
<string name="menu_clear">Limpar</string> <string name="menu_clear">Limpar</string>
<string name="status_service_create">Serviço iniciado</string> <string name="status_service_create">Serviço iniciado</string>
@@ -46,4 +47,7 @@
<string name="hidden_app_name">Configurações do Dispositivo</string> <string name="hidden_app_name">Configurações do Dispositivo</string>
<string name="hidden_alert">O aplicativo foi escondido. Para abrir novamente por favor digite 8722227 (TRACCAR).</string> <string name="hidden_alert">O aplicativo foi escondido. Para abrir novamente por favor digite 8722227 (TRACCAR).</string>
<string name="error_msg_invalid_url">Digite uma URL http: // ou https: // válida</string> <string name="error_msg_invalid_url">Digite uma URL http: // ou https: // válida</string>
<string name="request_exception">Para coletar dados de localização continuamente por favor desabilite a economia de bateria para o aplicativo.</string>
<string name="request_background">Para coletar dados de localização continuamente por favor habilite a permissão \"%s\".</string>
<string name="request_background_option">Permitir sempre</string>
</resources> </resources>
+6
Просмотреть файл
@@ -20,6 +20,12 @@
<string name="settings_status_on">Стоп</string> <string name="settings_status_on">Стоп</string>
<string name="settings_status_off_summary">Сервис остановлен</string> <string name="settings_status_off_summary">Сервис остановлен</string>
<string name="settings_status_on_summary">Сервис запущен</string> <string name="settings_status_on_summary">Сервис запущен</string>
<string name="settings_buffer">Оффлайн буферизация</string>
<string name="settings_buffer_off_summary">Буферизация выключена</string>
<string name="settings_buffer_on_summary">Буферизация включена</string>
<string name="settings_wakelock">Блокировка пробуждения</string>
<string name="settings_wakelock_off_summary">Блокировка выключена</string>
<string name="settings_wakelock_on_summary">Блокировка включена</string>
<string name="settings_accuracy_title">Точность местоположения</string> <string name="settings_accuracy_title">Точность местоположения</string>
<string name="settings_accuracy_summary">Точность местоположения</string> <string name="settings_accuracy_summary">Точность местоположения</string>
<string name="settings_accuracy_high">Высокая</string> <string name="settings_accuracy_high">Высокая</string>
+21 -13
Просмотреть файл
@@ -1,20 +1,28 @@
<?xml version='1.0' encoding='UTF-8'?> <?xml version='1.0' encoding='UTF-8'?>
<resources> <resources>
<string name="app_name">Traccar Client</string> <string name="app_name">ට්‍රැකකාර් අනුග්‍රාහකය</string>
<string name="app_logo">Traccar</string> <string name="app_logo">ට්‍රැකකාර්</string>
<string name="settings_id_title">උපකරණ හඳුන්වනය</string> <string name="shortcut_start">සේවාව නවතන්න</string>
<string name="shortcut_stop">සේවාව නවතන්න</string>
<string name="settings_id_title">උපාංගයේ හඳුන්වනය</string>
<string name="settings_url_title">සේවාදායකයේ ඒ.ස.නි.</string>
<string name="settings_url_summary">ලුහුබැඳීමේ සේවාදායකයේ ඒ.ස.නි.</string>
<string name="settings_interval_title">සංඛ්‍යාතය</string> <string name="settings_interval_title">සංඛ්‍යාතය</string>
<string name="settings_status_title">සේවා තත්වය</string> <string name="settings_status_title">සේවාවේ තත්වය</string>
<string name="settings_status_off">ඇරැඹීම</string> <string name="settings_status_off">අරඹන්න</string>
<string name="settings_status_on">වතීම</string> <string name="settings_status_on">නවත්වන්න</string>
<string name="settings_status_off_summary">සේවාව අක්‍රීයයි</string> <string name="settings_status_off_summary">සේවාව නවතා ඇත</string>
<string name="settings_status_on_summary">සේවාව ක්‍රියාත්මකයි</string> <string name="settings_status_on_summary">සේවාව ධාවනය වෙමින්</string>
<string name="settings_foreground_title">Foreground service</string> <string name="settings_foreground_title">පෙරබිම් සේවාව</string>
<string name="settings_foreground_summary">Increase service priority</string> <string name="settings_foreground_summary">සේවාවේ ප්‍රමුඛත්වය වැඩිකරන්න</string>
<string name="menu_status">තත්වය</string> <string name="menu_status">තත්වය</string>
<string name="menu_shortcuts">කෙටි මං එකතු කරන්න</string> <string name="menu_info">තොරතුරු</string>
<string name="menu_shortcuts">කෙටිමං එකතු කරන්න</string>
<string name="menu_clear">හිස් කරන්න</string> <string name="menu_clear">හිස් කරන්න</string>
<string name="status_send_fail">යැවිය නොහැකිය</string> <string name="status_service_create">සේවාව ඇරඹිණි</string>
<string name="status_location_update">Location update</string> <string name="status_service_destroy">සේවාව නැවතිණි</string>
<string name="status_send_success">සාර්ථකව යැවිණි</string>
<string name="status_send_fail">යැවීමට අසමත් විය</string>
<string name="status_location_update">ස්ථානය යාවත්කාලය</string>
<string name="hidden_app_name">උපකරණ සැකසුම්</string> <string name="hidden_app_name">උපකරණ සැකසුම්</string>
</resources> </resources>
+4
Просмотреть файл
@@ -34,6 +34,7 @@
<string name="settings_foreground_title">Prvi plan servis</string> <string name="settings_foreground_title">Prvi plan servis</string>
<string name="settings_foreground_summary">Povecanje usluga prioritet</string> <string name="settings_foreground_summary">Povecanje usluga prioritet</string>
<string name="menu_status">Status</string> <string name="menu_status">Status</string>
<string name="menu_info">Info</string>
<string name="menu_shortcuts">Dodaj prečice</string> <string name="menu_shortcuts">Dodaj prečice</string>
<string name="menu_clear">Očisti</string> <string name="menu_clear">Očisti</string>
<string name="status_service_create">Servis pokrenut</string> <string name="status_service_create">Servis pokrenut</string>
@@ -46,4 +47,7 @@
<string name="hidden_app_name">Podešavanja uređaja</string> <string name="hidden_app_name">Podešavanja uređaja</string>
<string name="hidden_alert">Aplikacija je skrivena. Da je otvorite kucajte 8722227 (TRACCAR).</string> <string name="hidden_alert">Aplikacija je skrivena. Da je otvorite kucajte 8722227 (TRACCAR).</string>
<string name="error_msg_invalid_url">Molimo unesite pravilnu http:// ili https:// adresu</string> <string name="error_msg_invalid_url">Molimo unesite pravilnu http:// ili https:// adresu</string>
<string name="request_exception">Da biste kontinuirano prikupljali podatke o lokaciji, isključite optimizaciju baterije za aplikaciju.</string>
<string name="request_background">Da biste kontinuirano prikupljali podatke o lokaciji, omogućite %s dozvolu.</string>
<string name="request_background_option">Dozvoljeno svo vreme</string>
</resources> </resources>
+53
Просмотреть файл
@@ -0,0 +1,53 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="app_name">Traccarklient</string>
<string name="app_logo">Traccar</string>
<string name="shortcut_start">Starta tjänsten</string>
<string name="shortcut_stop">Stoppa tjänsten</string>
<string name="shortcut_sos">Skicka SOS</string>
<string name="channel_default">Primärkanal</string>
<string name="settings_id_title">Enhets-ID</string>
<string name="settings_url_title">URL till servern</string>
<string name="settings_url_summary">URL till trackservern</string>
<string name="settings_interval_title">Frekvens</string>
<string name="settings_interval_summary">Uppdateringsintervall i sekunder</string>
<string name="settings_distance_title">Avstånd</string>
<string name="settings_distance_summary">Uppdateringsavstånd i meter</string>
<string name="settings_angle_title">Vinkel</string>
<string name="settings_angle_summary">Uppdateringsvinkel i grader</string>
<string name="settings_status_title">Tjänstens status</string>
<string name="settings_status_off">Starta</string>
<string name="settings_status_on">Stoppa</string>
<string name="settings_status_off_summary">Tjänsten har stoppats</string>
<string name="settings_status_on_summary">Tjänsten är igång</string>
<string name="settings_buffer">Buffring offline</string>
<string name="settings_buffer_off_summary">Buffring av</string>
<string name="settings_buffer_on_summary">Buffring på</string>
<string name="settings_wakelock">Förhindra viloläge</string>
<string name="settings_wakelock_off_summary">Förhindra viloläge av</string>
<string name="settings_wakelock_on_summary">Förhindra viloläge på</string>
<string name="settings_accuracy_title">Positionsnoggranhet</string>
<string name="settings_accuracy_summary">Önskad positionsnoggrannhet</string>
<string name="settings_accuracy_high">Hög</string>
<string name="settings_accuracy_medium">Medel</string>
<string name="settings_accuracy_low">Låg</string>
<string name="settings_foreground_title">Tjänsten i förgrunden</string>
<string name="settings_foreground_summary">Öka tjänstens prioritet</string>
<string name="menu_status">Status</string>
<string name="menu_info">Info</string>
<string name="menu_shortcuts">Lägg till länkar</string>
<string name="menu_clear">Rensa</string>
<string name="status_service_create">Tjänsten har startats</string>
<string name="status_service_destroy">Tjänsten har stoppats</string>
<string name="status_send_success">Skickat OK</string>
<string name="status_send_fail">Sändning misslyckades</string>
<string name="status_location_update">Positionsuppdatering</string>
<string name="status_network_online">Nätverk online</string>
<string name="status_network_offline">Nätverk offline</string>
<string name="hidden_app_name">Inställningar</string>
<string name="hidden_alert">App:en är gömd. För att öppna den igen, vänligen ring 8722227 (TRACCAR).</string>
<string name="error_msg_invalid_url">Vänligen fyll i en giltig http://- eller https://-URL</string>
<string name="request_exception">För att kontinuerligt samla in platsdata, stäng av batterioptimeringen för appen.</string>
<string name="request_background">För att kontinuerligt samla in platsdata vänligen aktivera \"%s\" behörighet.</string>
<string name="request_background_option">Tillåt hela tiden</string>
</resources>
+26 -16
Просмотреть файл
@@ -7,37 +7,47 @@
<string name="shortcut_sos">ส่ง SOS</string> <string name="shortcut_sos">ส่ง SOS</string>
<string name="channel_default">ช่องหลัก</string> <string name="channel_default">ช่องหลัก</string>
<string name="settings_id_title">หมายเลขอุปกรณ์</string> <string name="settings_id_title">หมายเลขอุปกรณ์</string>
<string name="settings_url_title">ท๊่อยู่ URL เซิร์ฟเวอร์</string> <string name="settings_url_title">URL เซิร์ฟเวอร์</string>
<string name="settings_url_summary">ท๊่อยู่ URL เซิร์ฟเวอร์ติดตาม</string> <string name="settings_url_summary">URL เซิร์ฟเวอร์ติดตาม</string>
<string name="settings_interval_title">ช่วงเวลาส่งข้อมูล</string> <string name="settings_interval_title">ความถี่</string>
<string name="settings_interval_summary">รายงานทุกช่วงเวลาวินาที</string> <string name="settings_interval_summary">รายงานทุกช่วงเวลาวินาที</string>
<string name="settings_distance_title">ระยะทาง</string> <string name="settings_distance_title">ระยะทาง</string>
<string name="settings_distance_summary">การรายงานระยะทางเมตร</string> <string name="settings_distance_summary">การรายงานระยะทางแบบเมตร</string>
<string name="settings_angle_title">มุม</string> <string name="settings_angle_title">มุม</string>
<string name="settings_angle_summary">รายงานในมุมองศา</string> <string name="settings_angle_summary">รายงานในมุมองศา</string>
<string name="settings_status_title">สถานะเซร์ฟเวอร์</string> <string name="settings_status_title">สถานะเซร์วิส</string>
<string name="settings_status_off">เริ่มต้น</string> <string name="settings_status_off">เริ่มต้น</string>
<string name="settings_status_on">สิ้นสุด</string> <string name="settings_status_on">สิ้นสุด</string>
<string name="settings_status_off_summary">ริ่มทำงาน</string> <string name="settings_status_off_summary">ซอร์วิสหยุดทำงานแล้ว</string>
<string name="settings_status_on_summary">หยุดทำงาน</string> <string name="settings_status_on_summary">เซอร์วิสทำงานอยู่</string>
<string name="settings_accuracy_title">ตำแหน่ง-ความแม่นยำ</string> <string name="settings_buffer">บัฟเฟอร์แบบออฟไลน์</string>
<string name="settings_accuracy_summary">ตำแหน่ง-ต้องการความแม่นยำ</string> <string name="settings_buffer_off_summary">ปิดบัฟเฟอร์</string>
<string name="settings_accuracy_high">สูงมาก</string> <string name="settings_buffer_on_summary">เปิดบัฟเฟอร์</string>
<string name="settings_wakelock">ล็อกการปลุก</string>
<string name="settings_wakelock_off_summary">ปิดล็อกการปลุก</string>
<string name="settings_wakelock_on_summary">เปิดล็อกการปลุก</string>
<string name="settings_accuracy_title">ความแม่นยำของตำแหน่ง</string>
<string name="settings_accuracy_summary">ต้องการความแม่นยำของตำแหน่ง-</string>
<string name="settings_accuracy_high">สูง</string>
<string name="settings_accuracy_medium">ปานกลาง</string> <string name="settings_accuracy_medium">ปานกลาง</string>
<string name="settings_accuracy_low">ต่ำ</string> <string name="settings_accuracy_low">ต่ำ</string>
<string name="settings_foreground_title">ทำงานเบื้องหน้า</string> <string name="settings_foreground_title">ทำงานเบื้องหน้า</string>
<string name="settings_foreground_summary">เพิ่มความลำดับสำคัญการทำงาน</string> <string name="settings_foreground_summary">เพิ่มความลำดับสำคัญการทำงาน</string>
<string name="menu_status">สถานะ</string> <string name="menu_status">สถานะ</string>
<string name="menu_info">ข้อมูล</string>
<string name="menu_shortcuts">เพิ่มชอร์ตคัท</string> <string name="menu_shortcuts">เพิ่มชอร์ตคัท</string>
<string name="menu_clear">ล้างข้อมูล</string> <string name="menu_clear">ล้างข้อมูล</string>
<string name="status_service_create">บริการเริ่มต้นแล้ว</string> <string name="status_service_create">เซอร์วิสเริ่มทำงานแล้ว</string>
<string name="status_service_destroy">หยุดให้บริการแล้ว</string> <string name="status_service_destroy">เซอร์วิสหยุดทำงานแล้ว</string>
<string name="status_send_success">ส่งข้อมูลเรียบร้อย</string> <string name="status_send_success">ส่งข้อมูลเรียบร้อย</string>
<string name="status_send_fail">ส่งข้อมูลล้มเหลว</string> <string name="status_send_fail">ส่งข้อมูลล้มเหลว</string>
<string name="status_location_update">ปรับปรุงตำแหน่ง</string> <string name="status_location_update">ปรับปรุงตำแหน่ง</string>
<string name="status_network_online">น็ต-ออนไลน์</string> <string name="status_network_online">ครือข่ายออนไลน์</string>
<string name="status_network_offline">น็ต-ออฟไลน์</string> <string name="status_network_offline">ครือข่ายออฟไลน์</string>
<string name="hidden_app_name">ตั้งค่าอุปกรณ์</string> <string name="hidden_app_name">ตั้งค่าอุปกรณ์</string>
<string name="hidden_alert">The app has been hidden. To open it again please dial 8722227 (TRACCAR).</string> <string name="hidden_alert">แอพถูกซ่อน หากต้องการเปิดอีกครั้ง โปรดโทร 8722227 (TRACCAR)</string>
<string name="error_msg_invalid_url">โปรดใส่ค่า http:// or https:// URL ที่ถูกต้อง</string> <string name="error_msg_invalid_url">โปรดใส่ค่า http:// หรือ https:// URL ที่ถูกต้อง</string>
<string name="request_exception">หากต้องการรวบรวมข้อมูลตำแหน่งอย่างต่อเนื่อง โปรดปิดการเพิ่มประสิทธิภาพแบตเตอรี่สำหรับแอป</string>
<string name="request_background">หากต้องการรวบรวมข้อมูลตำแหน่งอย่างต่อเนื่อง โปรดเปิดใช้การอนุญาต \"%s\"</string>
<string name="request_background_option">อนุญาตตลอดเวลา</string>
</resources> </resources>

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше