Сравнить коммиты
| Автор | SHA1 | Дата | |
|---|---|---|---|
|
|
8adbc0f83c | ||
|
|
cd48c75257 | ||
|
|
4eacf30897 | ||
|
|
88cc37e96e | ||
|
|
b80fde0b6d | ||
|
|
f734d0256f |
@@ -1,27 +1,84 @@
|
||||
# [Traccar Client for Android](https://www.traccar.org/client)
|
||||
# traccar-client-android (форк)
|
||||
|
||||
[](https://play.google.com/store/apps/details?id=org.traccar.client) [](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.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
## Как собрать/запустить
|
||||
|
||||
```bash
|
||||
./gradlew assembleRegularDebug # сборка без сервисов Google
|
||||
./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: копия отстаёт от оригинала более чем на три года.
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
# [Traccar Client for Android](https://www.traccar.org/client)
|
||||
|
||||
[](https://play.google.com/store/apps/details?id=org.traccar.client) [](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.
|
||||
@@ -9,8 +9,8 @@ android {
|
||||
buildConfigField 'boolean', 'HIDDEN_APP', 'false'
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 33
|
||||
versionCode 80
|
||||
versionName '6.19'
|
||||
versionCode 81
|
||||
versionName '7.0'
|
||||
multiDexEnabled true
|
||||
}
|
||||
namespace 'org.traccar.client'
|
||||
|
||||
@@ -30,7 +30,7 @@ class GooglePositionProvider(context: Context, listener: PositionListener) : Pos
|
||||
@Suppress("DEPRECATION", "MissingPermission")
|
||||
override fun startUpdates() {
|
||||
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
|
||||
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
@@ -1,5 +1,6 @@
|
||||
<?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"/>
|
||||
<background android:drawable="@android:color/white"/>
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||
<monochrome android:drawable="@drawable/ic_launcher_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -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 |
|
После Ширина: | Высота: | Размер: 21 KiB |
|
До Ширина: | Высота: | Размер: 26 KiB |
@@ -49,9 +49,9 @@ abstract class PositionProvider(
|
||||
protected fun processLocation(location: Location?) {
|
||||
val lastLocation = this.lastLocation
|
||||
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
|
||||
&& abs(location.bearing - lastLocation!!.bearing) >= angle)
|
||||
&& abs(location.bearing - lastLocation.bearing) >= angle)
|
||||
) {
|
||||
Log.i(TAG, "location new")
|
||||
this.lastLocation = location
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -1,5 +1,6 @@
|
||||
<?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"/>
|
||||
<background android:drawable="@android:color/white"/>
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||
<monochrome android:drawable="@drawable/ic_launcher_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -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>
|
||||
@@ -1,5 +1,6 @@
|
||||
<?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"/>
|
||||
<background android:drawable="@android:color/white"/>
|
||||
<foreground android:drawable="@drawable/ic_sos_foreground"/>
|
||||
<monochrome android:drawable="@drawable/ic_sos_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -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>
|
||||
@@ -1,5 +1,6 @@
|
||||
<?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"/>
|
||||
<background android:drawable="@android:color/white"/>
|
||||
<foreground android:drawable="@drawable/ic_start_foreground"/>
|
||||
<monochrome android:drawable="@drawable/ic_start_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -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>
|
||||
@@ -1,5 +1,6 @@
|
||||
<?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"/>
|
||||
<background android:drawable="@android:color/white"/>
|
||||
<foreground android:drawable="@drawable/ic_stop_foreground"/>
|
||||
<monochrome android:drawable="@drawable/ic_stop_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -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 |
@@ -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>
|
||||
@@ -1,9 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<color name="primary">#43A047</color>
|
||||
<color name="primary_dark">#2E7D32</color>
|
||||
<color name="accent">#388E3C</color>
|
||||
<color name="light">#FFFFFF</color>
|
||||
<color name="primary">#2e7d32</color>
|
||||
<color name="primary_dark">#005005</color>
|
||||
<color name="accent">#1a237e</color>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.7.20'
|
||||
ext.kotlin_version = '1.8.0'
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.3.1'
|
||||
classpath 'com.android.tools.build:gradle:7.4.1'
|
||||
classpath 'com.google.gms:google-services:4.3.15'
|
||||
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2'
|
||||
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.4'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
}
|
||||
}
|
||||
|
||||