From cd913fb49598647bcd5329954383bb68328adbd0 Mon Sep 17 00:00:00 2001 From: "Nikki S." Date: Fri, 17 Jan 2025 00:38:37 +0300 Subject: [PATCH 1/2] Update README.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index f1a652a..e260b74 100644 --- a/README.md +++ b/README.md @@ -21,3 +21,11 @@ Europe: - Sameday Bulgaria - Sameday Hungary - Sameday Romania + +Russia and CIS: +- 5post +- CDEK +- Russian Post (Почта России) + +Asia: +- AliExpress Shipping (Cainiao) From a7ce8e7307557c8d2f085b69364f8b36df5848fb Mon Sep 17 00:00:00 2001 From: "Nikki S." Date: Fri, 17 Jan 2025 04:48:09 +0300 Subject: [PATCH 2/2] feat: Add Cainiao support and Russian translations --- .idea/misc.xml | 3 +- .../api/CainiaoDeliveryService.kt | 83 +++++++++++++++++++ .../java/dev/itsvic/parceltracker/api/Core.kt | 5 ++ app/src/main/res/values-ru/strings.xml | 58 +++++++++++++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/dev/itsvic/parceltracker/api/CainiaoDeliveryService.kt create mode 100644 app/src/main/res/values-ru/strings.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index b2c751a..a4f09e2 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,7 @@ + - + diff --git a/app/src/main/java/dev/itsvic/parceltracker/api/CainiaoDeliveryService.kt b/app/src/main/java/dev/itsvic/parceltracker/api/CainiaoDeliveryService.kt new file mode 100644 index 0000000..184e250 --- /dev/null +++ b/app/src/main/java/dev/itsvic/parceltracker/api/CainiaoDeliveryService.kt @@ -0,0 +1,83 @@ +package dev.itsvic.parceltracker.api + +import com.squareup.moshi.JsonClass +import dev.itsvic.parceltracker.R +import retrofit2.Retrofit +import retrofit2.http.GET +import retrofit2.http.Query +import java.time.Instant +import java.time.LocalDateTime +import java.util.TimeZone + +object CainiaoDeliveryService : DeliveryService { + override val nameResource: Int = R.string.service_cainiao + + override suspend fun getParcel(trackingId: String, postalCode: String?): Parcel { + val resp = service.getParcelDetails(trackingId) + val parcel = resp.module.first() + + if (parcel.detailList.isEmpty()) + throw ParcelNonExistentException() + + val history = parcel.detailList.map { + val (location, desc) = locationRegex.find(it.standerdDesc)!!.destructured + + ParcelHistoryItem( + desc, + LocalDateTime.ofInstant( + Instant.ofEpochMilli(it.time), + TimeZone.getDefault().toZoneId() + ), + if (location != "") location + else "" + ) + } + + val status = when (val statusCode = parcel.detailList.first().actionCode) { + "PU_PICKUP_SUCCESS" -> Status.Preadvice + "SC_INBOUND_SUCCESS" -> Status.InWarehouse + "CW_INBOUND" -> Status.InWarehouse + "SC_OUTBOUND_SUCCESS" -> Status.InTransit + "LH_HO_IN_SUCCESS" -> Status.InTransit + "???" -> Status.Delivered + else -> logUnknownStatus("Cainiao", statusCode) + } + + return Parcel(trackingId, history, status) + } + + private val retrofit = Retrofit.Builder() + .baseUrl("https://global.cainiao.com/global/") + .client(api_client) + .addConverterFactory(api_factory) + .build() + + private val service = retrofit.create(API::class.java) + + private interface API { + @GET("detail.json") + suspend fun getParcelDetails( + @Query("mailNos") trackingId: String + ): ParcelResponse + } + + private val locationRegex = Regex("(?:^\\[(.*)\\]\\s+)?(.*)\$") + + @JsonClass(generateAdapter = true) + internal data class ParcelResponse( + val module: List + ) + + @JsonClass(generateAdapter = true) + internal data class CainiaoParcel( + val status: String, + val detailList: List + ) + + @JsonClass(generateAdapter = true) + internal data class ParcelEvent( + val time: Long, + val standerdDesc: String, // I can't get over standErdDesc, send help + val actionCode: String + ) +} diff --git a/app/src/main/java/dev/itsvic/parceltracker/api/Core.kt b/app/src/main/java/dev/itsvic/parceltracker/api/Core.kt index a9eb995..3b52714 100644 --- a/app/src/main/java/dev/itsvic/parceltracker/api/Core.kt +++ b/app/src/main/java/dev/itsvic/parceltracker/api/Core.kt @@ -27,6 +27,9 @@ enum class Service { SAMEDAY_BG, SAMEDAY_HU, SAMEDAY_RO, + + // Asia + CAINIAO, } val serviceOptions = @@ -47,6 +50,8 @@ fun getDeliveryService(service: Service): DeliveryService? { Service.SAMEDAY_HU -> SamedayHungaryDeliveryService Service.SAMEDAY_RO -> SamedayRomaniaDeliveryService + Service.CAINIAO -> CainiaoDeliveryService + Service.EXAMPLE -> ExampleDeliveryService else -> null } diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml new file mode 100644 index 0000000..855d175 --- /dev/null +++ b/app/src/main/res/values-ru/strings.xml @@ -0,0 +1,58 @@ + + + Ещё не отправлено + В пути + Прибыло в сортировочный центр + Прибыло на таможню + Отправлено + Не удалось доставить + Доставлено + Ожидает получения + Получено + Неизвестный код статуса + + Неопределено + Пример Почты + Польская Почта + + Добавить посылку + Назад + Название + Трек-номер + Сервис доставки + Указать индекс + Индекс + Добавить посылку + Некоторые посылки требуют почтовый индекс для получения полной информации. + + У вас нет посылок. + + Текущий статус + История посылки + Имя не должно быть пустым. + Трек-номер не должен быть пустым. + Вы должны выбрать сервис. + Индекс Имя не должен быть пустым. + Ошибка сети + Ваше устройство может быть не подключено к Интернету, проблемы на стороне сервиса доставки, или вы ввели неверную информацию. + Настройки + Отображает образцы посылок для демонстрационных целей. Не влияет на пользовательские данные. + Эта посылка ещё не существует на серверах сервиса доставки. Убедитесь, что её данные верны. + Больше опций + Удалить + Демо-режим + Действие не разрешено в демо-режиме. + Экспериментальные опции + Нет данных + События посылки + Уведомления о текущем статусе посылки + Обновлять только на безлимитных сетях + Если включено, то Parcel будет обновлять данные о посылках только на безлимитных сетях, как, например, ваша домашняя сеть Wi-Fi. + Изменить посылку + Сохранить + Изменить + DPD Великобритания + Sameday Венгрия + Sameday Румыния + Sameday Болгария + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3ff920c..442b962 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -56,6 +56,7 @@ Save Edit DPD UK + Cainiao (AliExpress) Packeta Sameday Hungary Sameday Romania