Потребительский SDK для Android: примечания к выпуску

В этом разделе содержатся примечания к выпуску Consumer SDK для Android.

2.3.0 (2 августа 2024 г.)

Изменения API

  • Добавьте поддержку стиля облачных карт , которая позволит вам создавать персонализированную дорожную карту для ваших пользователей без необходимости обновлять код ваших приложений каждый раз, когда вы меняете стиль карты. Дополнительную информацию см. в разделе Оформление карты с помощью стилей облачных карт .

  • Добавьте метод getServerTimeMillis() в VehicleLocation , чтобы определить время получения обновления местоположения Fleet Engine.

2.2.0 (7 мая 2024 г.)

Изменения API

  • Добавлен API поддержки для интеграции Jetpack Compose. Это экспериментальная функция. Для получения подробной информации об интеграции с Jetpack Compose обратитесь к своему представителю.

2.1.0 (17 января 2024 г.)

Исправления ошибок

  • Устраняет сбой, возникающий, когда SDK инициализируется более одного раза в течение жизненного цикла приложения.

Изменения API

  • Представляет метод для получения экземпляра GoogleMap , созданного SDK ( ConsumerGoogleMap.getGoogleMap() ).
  • Представляет API для получения экземпляров Marker , созданных SDK для представления транспортного средства ( ConsumerController.getConsumerMarker() ).
  • Представляет API для получения клиентских прогнозируемых обновлений времени и расстояния во время совместного использования путешествий ( ProjectedRouteEta ).

1.99.2 (3 ноября 2023 г.)

  • Устраняет сбой, возникающий при инициализации SDK из удаленного процесса, отдельного от приложения.

  • Устраняет сбой, возникающий при выполнении анимации камеры, когда для заполнения недостаточно вертикального или горизонтального пространства. Это происходит только в последней версии рендерера карт.

  • Исправлена ​​ошибка, из-за которой первый этап маршрута «Впереди назад» обрезался, когда второй этап проходит по той же дороге.

Проблемы

  • ConsumerApi.initialize() выдает исключение, если он вызывается, когда экземпляр API уже существует. Чтобы обойти эту проблему, сначала вызовите ConsumerApi.getInstance() и оцените возвращенную Task , чтобы определить, существует ли уже экземпляр API.

2.0.0 (15 сентября 2023 г.)

Объявление: критические изменения

  • Минимальные требования к уровню API изменены с 21 на 23.

  • Обновлены требования к версии Maps SDK с версии 17.0.0 до версии 18.1.0.

  • Минимальные требования к версии стандартной библиотеки Kotlin обновлены с версии 1.6.10 до версии 1.9.0.

  • Обновите версии зависимостей сервисов Google Play.

    • Минимальные требования к версии базовой библиотеки play-services обновлены с версии 18.0.1 до версии 18.2.0.

    • Минимальные требования к версии библиотеки play-services-base обновлены с версии 18.0.0 до версии 18.2.0.

    • Минимальные требования к версии библиотеки play-services-location обновлены с версии 17.0.0 до версии 21.0.1.

    • Минимальные требования к версии библиотеки play-services-tasks обновлены с версии 18.0.1 до версии 18.0.2.

  • Добавляет библиотеку androidx.room:room-runtime с минимальным требованием к версии v2.5.2.

  • Обновите следующие версии зависимостей

    • Минимальные требования к версии библиотеки android-maps-utils обновлены с версии 0.4.2 до версии 3.5.2.

    • Минимальные требования к версии com.google.android.datatransport:transport-backend-cct обновлены с версии 3.0.0 до версии 3.1.9.

    • Минимальные требования к версии com.google.android.datatransport:transport-runtime обновлены с версии 3.0.1 до версии 3.1.9.

    • Минимальные требования к версии androidx.lifecycle:lifecycle-extensions обновлены с версии 2.0.0 до версии 2.2.0.

    • Минимальные требования к версии androidx.lifecycle:lifecycle-common-java8 обновлены с версии 2.0.0 до версии 2.6.1.

    • Минимальные требования к версии androidx.appcompat:appcompat обновлены с v1.0.0 до v1.6.1.

    • Минимальные требования к версии androidx.fragment:fragment обновлены с v1.0.0 до v1.6.1.

  • Удаляет следующие ранее устаревшие API: ConsumerTrip , ConsumerTripCallback , ConsumerTripManager , ConsumerTripOptions . На смену им пришли TripModel , TripModelCallback , TripModelManager и TripModelOptions .

  • Приложения, использующие Consumer SDK, теперь должны иметь targetSdkVersion API 31 или более поздней версии, compileSdkVersion API 33 или более поздней версии.

  • Приложения, использующие Consumer SDK, теперь должны включать поддержку библиотеки Java 8. См. https://developer.android.com/studio/write/java8-support для получения инструкций по обновлению.

  • Приложения, использующие Proguard или Dexguard, должны перейти на R8. См. https://developer.android.com/build/shrink-code для получения дополнительной информации.

  • Приложения, использующие Consumer SDK, должны включать обессеривание. Инструкции см. на странице https://developer.android.com/studio/write/java8-support#library-desugaring.

  • Метод ConsumerApi.initialize() теперь генерирует исключение, если он вызывается, когда уже создан экземпляр API. Task , возвращаемая ConsumerApi.getInstance() должна использоваться для определения наличия заранее созданного экземпляра API.

Объявление: прекращение поддержки API

  • Устаревшие классы аннотаций Trip.TripStatus и Trip.TripType , вместо них добавляются классы аннотаций TripInfo.TripStatus и TripInfo.TripType .

    • В рамках этого изменения TripModelCallback#onTripStatusUpdated(TripInfo tripInfo, @Trip.TripStatus int status) устарел, а вместо него добавлен TripModelCallback#onTripStatusUpdate(TripInfo tripInfo, @TripInfo.TripStatus int status) .

    • В рамках этого изменения TripInfo#getTripStatus() устарел, вместо него добавлен TripInfo#getCurrentTripStatus() .

    • В рамках этого изменения TripInfo#getTripType() устарел, вместо него добавлен TripInfo#getCurrentTripType() .

  • Устаревший класс Trip .

Другие изменения и исправления ошибок

  • Поддерживает запрос последней версии средства визуализации Maps SDK. Подробности см. в разделе «Новый рендерер карт» .

  • Обеспечивает поддержку диапазона Maps SDK от версий v18.1.0 (включительно) до v19.0.0 (эксклюзивно).

  • Исправляет ошибку «превышен срок» для внутренней связи между SDK и серверной частью Google.

  • Устранена проблема с рендерингом на экране небольшого размера и в режиме «картинка в картинке».

Руководство по миграции

1.99.1 (31 августа 2023 г.)

Исправления ошибок

  • Устраняет сбой, возникающий при уничтожении активности или фрагмента хоста SDK.

  • Устраняет сбой, возникающий, когда размеры MapView равны 0 (высота или ширина).

  • Исправлен сбой, возникающий при проецировании местоположения автомобиля на полилинию маршрута.

Улучшения

  • Предотвращает сбой SDK, когда ведущее приложение загружено неопубликовано, а визуальные ресурсы по умолчанию отсутствуют.

1.99.0 (22 июня 2023 г.)

Исправления ошибок

  • Устранена проблема с рендерингом на экранах небольшого размера и в режиме «картинка в картинке».

  • Устраняет мерцание автомобиля во время совместного путешествия.

1.2.1 (7 июня 2023 г.)

Исправления ошибок

  • Исправлена ​​ошибка, из-за которой автомобиль мерцал во время совместного путешествия.

1.2.0 (21 ноября 2022 г.)

Исправления ошибок

  • Исправлена ​​ошибка, из-за которой в обратном вызове onTripActiveRouteTrafficUpdated сообщался пустой трафик.

Новые возможности

  • «Полилинии с учетом трафика» теперь общедоступны.

1.1.2 (27 октября 2022 г.)

Исправления ошибок

  • Устранена ошибка, приводившая к исчезновению полилинии маршрута после запуска JourneySharingSession более одного раза для TripModel .

Объявление: прекращение поддержки Android 5 (25 июля 2022 г.)

Для нашей версии SDK v1.1.1 мы предоставляем дополнительный год поддержки приложений, работающих на Android 5, для уровней API 21 и 22.

Что это значит:

  • Потребительский SDK, работающий в ваших приложениях Android, будет поддерживать как минимум Android 5 (уровень API 21) до 30 июня 2023 года.

  • После 30 июня 2023 г. мы будем поддерживать только Android API уровня 23 и выше. Другими словами, после этой даты мы прекратим поддержку Android API уровней 21 и 22 во всех версиях SDK. Это означает, что ошибки, связанные с Android 21 или 22, в любой версии SDK (включая 4.x) не будут исправлены, и мы не гарантируем корректную работу SDK.

v1.1.1 (25 июля 2022 г.)

Изменение зависимости

  • Понижает минимальный поддерживаемый уровень Android API до 21.

v1.1.0 (28 апреля 2022 г.)

  • Внутренние улучшения.

v1.0.19 (17 марта 2022 г.)

Исправления ошибок

  • Исправлена ​​утечка памяти в классе ConsumerApi .

v1.0.14 (30 ноября 2021 г.)

Минимальный поддерживаемый уровень Android API теперь равен 23.

Изменения API

  • Изменения в классах ConsumerTrip и ConsumerTripManager .

    • Исправлены имена некоторых методов, чтобы сделать их значение более понятным и привести в соответствие с платформой iOS.
  • Изменения в ConsumerTripCallback , ConsumerTrip и TripInfo .

    • Изменены имена некоторых классов, чтобы обеспечить равенство с iOS. Введены TripModel , TirpModelManager и TripModelOptions , чтобы объявить устаревшими ConsumerTrip , ConsumerTripManager и ConsumerTripOptions .

    • Подчищены имена некоторых методов. Пересмотрены или добавлены комментарии JavaDoc к методам для более четкой передачи смысла.

    • Улучшена обработка ошибок.

Настройка стиля

  • Устаревшие устаревшие оболочки

    • MarkerStyleOptions и PolylineStyleOptions устарели и заменены MarkerOptions и PolylineOptions , которые используются совместно с Maps SDK.

Мониторинг сбоев

  • Добавлено обнаружение и журналирование сбоев.

    • Было сделано дополнение, позволяющее отказаться от этой функции. Это было сделано в рамках более масштабных усилий по мониторингу сбоев в масштабах всего региона.

Изменения аутентификации

  • Удалите ненужные методы из интерфейсов аутентификации.
    • Удален параметр ServiceType .

v0.9.28 (18 мая 2021 г.)

Изменения API

  • Обновлены все методы ConsumerTripCallback для использования TripInfo в качестве параметра.
  • Добавлен ConsumerTrip.isRefreshing() , который указывает, активно ли ConsumerTrip обновляет себя свежей информацией о поездке из Fleet Engine.
  • Добавлен ConsumerTripCallback.onTripRemainingRouteDistanceUpdated() .
  • Добавлен ConsumerTripCallback.onTripRemainingRouteUpdated() .
  • Замените типы возвращаемых данных Guava ( ImmutableSet , ImmutableList ) эквивалентными классами java.util .
  • Изменения имени пакета:

    • com.google.android.libraries.ridesharing.common.AuthTokenContext -> com.google.android.libraries.ridesharing.consumer.auth.AuthTokenContext
    • com.google.android.libraries.ridesharing.common.AuthTokenFactory -> com.google.android.libraries.ridesharing.consumer.auth.AuthTokenFactory
    • com.google.android.libraries.ridesharing.common.FleetEngineServiceType -> com.google.android.libraries.ridesharing.consumer.auth.FleetEngineServiceType - com.google.android.libraries.ridesharing.common.model.Trip

                                  ->
                                                                  com.google.android.libraries.ridesharing.consumer.model.Trip
      
                                  -   com.google.android.libraries.ridesharing.common.model.Vehicle
      
                                                          ->
                                      com.google.android.libraries.ridesharing.consumer.model.Vehicle
      

Изменения реализации

  • Исправлена ​​ситуация гонки, из-за которой SDK мог аварийно завершить работу из-за взаимодействия с картой до того, как она была готова.
  • SDK больше не содержит незашифрованную копию io.grpc .
  • Исправлена ​​ошибка с мерцанием полилиний трафика на некоторых устройствах. Сегменты трафика теперь будут иметь закругленные концы.

v0.9.15 (7 октября 2020 г.)

Изменения API

  • В этом выпуске представлены полилинии с учетом трафика . - Добавлены TripInfo.getActiveRouteTraffic() и TripInfo.getRemainingRouteTraffic() .
    • Добавлены ConsumerTripCallback.onTripActiveRouteTrafficUpdated() и ConsumerTripCallback.onTripRemainingRouteTrafficUpdated() чтобы указать, когда изменился трафик.
    • Добавлены PolylineStyleOptions для настройки трафика ( setTrafficEnabled() , setTrafficColorNoData() , setTrafficColorNormal() , setTrafficColorSlow() , setTrafficColorTrafficJam() ).
    • Открытый PolylineStyleOptions.TRAFFIC_Z_INDEX_ADDITION .
    • Добавлен TripWaypoint.getTrafficData() .
    • Добавлен тип данных TrafficData .
    • Добавлен ConsumerController.hideAllSessions() . ConsumerController.showSession() больше не принимает значение null в качестве аргумента.

v0.9.9 (15 июля 2020 г.)

Изменения API

  • Это серьезное изменение, которое представляет модульную архитектуру с более четкой взаимосвязью между уровнем только данных (например, ConsumerTripManager ) и уровнем пользовательского интерфейса (например, JourneySharingSession ). Информацию о переходе на новую архитектуру см. в Руководстве по миграции на модульность . — Объект ConsumerTrip теперь получается из ConsumerTripManager.getTrip() .
    • ConsumerTrip.unregisterCallback был переименован в ConsumerTrip.unregisterTripCallback .
    • ConsumerTrip.isCallbackRegistered был переименован в ConsumerTrip.isTripCallbackRegistered .
    • Добавлены ConsumerTrip.setConsumerTripOptions() и ConsumerTrip.getConsumerTripOptions() .
    • Удален ConsumerTrip.setAutoRefreshInterval() .
  • Удалены API, не связанные с обменом данными о поездках.
    • Удалена карта плотности транспорта.
    • Убрано состояние предварительного просмотра поездки.
    • Убрано состояние выбора пикапа.
    • Убрано состояние выбора выпадающего списка.
    • Удалены следующие типы маркеров: SELECTED_PICKUP_POINT , SUGGESTED_PICKUP_POINT , HIGHLIGHTED_PICKUP_POINT и SELECTED_DROPOFF_POINT .
  • OnConsumerMarkerClickCallback и ConsumerMapReadyCallback изменены с интерфейсов на абстрактные классы.
  • Добавлены ConsumerController.getCameraUpdate() , ConsumerController.isAutoCameraEnabled() и ConsumerController.enableAutoCamera() .
  • Удалены пользовательский FAB и связанные с ним методы ( ConsumerController.isMyLocationFabEnabled и ConsumerController.setMyLocationFabEnabled ).

Изменения реализации

  • ConsumerTripCallback , независимо от того, зарегистрирован ли он с LifecycleOwner или без него, больше не отменяет автоматическую регистрацию в TripStatus.COMPLETE или TripStatus.CANCELED .
  • AutoCamera теперь включена по умолчанию и никогда не включается и не отключается самостоятельно. Ранее AutoCamera автоматически повторно включалась в TripStatus.ARRIVED_AT_PICKUP и отключалась, когда пользователь взаимодействовал с картой во время совместного использования поездки.
  • Следующие улучшения были внесены в анимацию транспортных средств для совместного использования:
    • Анимация совместного путешествия теперь учитывает ситуацию, когда транспортное средство может законно вернуться по уже пройденному маршруту.
    • Транспортное средство теперь будет анимироваться по прямой линии вместо интерполяции маршрута между точками, когда алгоритмически это будет определено как подходящее.
  • Разрешения FINE_LOCATION больше не требуются.

Другие изменения

  • Обновлены следующие версии зависимостей:
    • com.google.android.datatransport:transport-api:2.2.0
    • com.google.android.datatransport:transport-backend-cct:2.2.0
    • com.google.android.datatransport:transport-runtime:2.2.0

v0.9.1 (23 марта 2020 г.)

Изменения API

  • Добавлены TripInfo.getVehicleId() , TripInfo.getNumberOfPassengers() , TripInfo.getIntermediateDestinationIndex() , TripInfo.getTripActiveRoute() и TripInfo.getTripRemainingRoute() .
  • Добавлен класс options , используемый во время инициализации ConsumerApi , который позволяет динамически устанавливать адрес FleetEngine . Если API не вызывается со значением FleetEngine , он пытается получить его из манифеста Android или возвращается к значению по умолчанию.

Улучшения

  • Полилиния маршрута не отображается, если статус поездки — ARRIVED_AT_PICKUP .
  • Улучшено отслеживание транспортных средств вне маршрута (требуется DriverSDK 1.15):
    • Отслеживание транспортных средств не привязывает транспортное средство к маршруту, когда транспортное средство проезжает мимо точки посадки.
    • Отслеживание транспортных средств позволяет отображать транспортное средство вне дороги; например, на ненанесенных на карту парковках.
  • Значок транспортного средства теперь обновляется, когда пункт назначения водителя не совпадает с пунктом назначения в Fleet Engine.

v0.8.6 (16 декабря 2019 г.)

Изменения API

  • Добавлен TripInfo.getVehicleLocation() .

  • ConsumerMapView больше не является окончательным.

Изменения реализации

  • Оставшееся расстояние активного участка теперь рассчитывается с использованием расстояния сервера (сообщенное водителем + статический маршрут, если применимо) вместо локальной привязки. Это изменение дает более точные значения оставшегося расстояния.

Другие изменения

  • Требуются новые зависимости. Подробности смотрите в файле .pom.

    • com.google.android.datatransport:transport-api:2.0.0
    • com.google.android.datatransport:transport-backend-cct:2.0.2
    • com.google.android.datatransport:transport-runtime:2.0.0
  • Добавлены журналы задержки запроса на поездку.

  • Добавлены журналы ошибок реагирования на поездки.

Примечания

  • Начиная с версии 0.8.1 Consumer SDK для Android поставляется в виде сжатого zip-архива. Информацию о том, как его отменить, см. в разделе Jetifier: обратный режим .

v0.8.1 (13 сентября 2019 г.)

Новые возможности

Изменения API

  • Добавлен ConsumerController.disableAutoCamera() как функция, противоположная centerMapForState() .

  • VehicleLocation.getUpdateTime() теперь возвращает значение Long, которое представляет метку времени (в миллисекундах).

  • Упрощен интерфейс AuthTokenFactory , чтобы предоставить единый метод для генерации токенов. AuthTokenFactory изменен с интерфейса на абстрактный класс, чтобы обеспечить обратную совместимость с Java7. Это изменение обратно совместимо, но старые методы генерации токенов одной службы устарели и в конечном итоге будут удалены.

Изменения реализации

  • Ресурсы теперь центрируются по центру значков, устраняя смещение теней.

  • setState в JOURNEY_SHARING onStartTripMonitoring() вместо ожидания статуса отслеживаемой поездки.

  • Всегда возвращает данные для первого обновления данных о поездке, даже если данные о поездке не синхронизированы.

  • Добавлены Android Map Utils в качестве предоставленной зависимости.

Исправления ошибок

  • Исправлен некорректный синтаксис экспорта proguard для grpc Keep.

v0.7.0 (7 августа 2019 г.)

Новые возможности

  • Поддержка нескольких пунктов назначения для совместного использования путешествий.

Изменения API

  • Новые методы для ConsumerTripCallback .

    • onTripIntermediateDestinationsUpdated() .
    • onTripETAToNextTripWaypointUpdated() .
  • Новые методы ConsumerController .

    • getIntermediateDestinations() .
    • setIntermediateDestinations(List<TerminalLocation> intermediateDestinations) .
  • Новые TripStatuses .

    • TripStatus.ENROUTE_TO_INTERMEDIATE_DESTINATION .
    • TripStatus.ARRIVED_AT_INTERMEDIATE_DESTINATION .
  • Новые геттеры TripWaypoint .

    • getETAMillis() .
    • getDistanceMeters() .
  • Добавлен класс TripInfo .

    • Вы можете получить TripInfo для активной поездки с помощью ConsumerTripManager.getActiveTripInfo() .
  • Добавлен WaypointType.INTERMEDIATE_DESTINATION .

  • Добавлен MarkerType.TRIP_INTERMEDIATE_DESTINATION .

  • Создан ConsumerMapState.JOURNEY_SHARING из объединенных ConsumerMapStates ENROUTE_TO_PICKUP , ARRIVED_AT_PICKUP , ENROUTE_TO_DROPOFF и COMPLETE .

    • StateChangeCallbacks обновлены.

    • Добавлен onStateJourneySharing() .

    • Удалены onStateWaitingForPickup() , onStateDriverArrived() , onStateEnroute() и onStateEndofTrip() .

Исправления ошибок

  • Исправлена ​​ошибка, из-за которой маршрут не обрезался до местоположения транспортного средства, когда мониторинг поездки начинался в середине активной поездки (а не в начале маршрута).

  • Исправлена ​​ошибка, из-за которой обратные вызовы поездки не вызывались для прослушивателей, зарегистрированных в Tripmanager, после того, как TripManager уже получил данные о поездке.

  • Масштаб камеры теперь включает только активный маршрут и следующую путевую точку поездки (путевую точку, принадлежащую поездке). Даже если оставшаяся нога видна, зум никогда не включит ее. Раньше точка высадки включалась в масштабирование, когда транспортное средство либо направлялось к месту выдачи, либо прибывало к месту выдачи. Это уже не так.

Улучшения

  • Заполните нулевую оставшуюся путевую точку данными водителя (оставшийся список путевых точек возвращается из ConsumerTripCallback.onTripRemainingWaypointsUpdated и TripInfo.getRemainingWaypoints() .

  • Обновите ETA всех оставшихся путевых точек, когда изменится ETA до первой путевой точки в списке.

  • Принудительно повторно включите автокамеру только тогда, когда водитель подъедет к месту получения. Раньше автокамера сбрасывалась во включенное состояние при каждом изменении состояния поездки. Автокамера по-прежнему включена по умолчанию. Autocamera не включится повторно, если будет установлена ​​новая активная поездка без нового вызова startTripMonitoring() .

v0.6.1 (26 июня 2019 г.)

Новые возможности

  • Поддержка Carpool для совместного путешествия.

Изменения API

  • ConsumerController.getConsumerMapStyle() теперь возвращает ConsumerMapStyle а не Task<ConsumerMapStyle> .

  • Добавлен PolylineStyle.setZIndex() .

Исправления ошибок

  • Анимация маршрута теперь происходит только тогда, когда сегмент маршрута синхронизирован, что улучшает взаимодействие с пользователем.

  • Исправлено «мерцание» автомобиля во время интерполяции анимации, когда обновления местоположения водителя расположены близко друг к другу.

  • Исправлена ​​ошибка, из-за которой транспортное средство стартовало в начале маршрута, а не в самом обновленном месте, когда мониторинг поездки начинался в середине активной поездки.

  • Отображение полилинии активного маршрута над оставшимся маршрутом, когда они перекрываются.

Улучшения

  • Теперь откройте класс gRPC Status с помощью незапутанных методов.

v0.5.1.01 (17 мая 2019 г.)

Новые возможности

  • Постоянная поддержка Journey Sharing.

Изменения API

  • Новый класс ConsumerController .

Тип полилинии

Старое значение Новое значение
TRIP_PREVIEW_AUTO_ROUTE PREVIEW_AUTO_ROUTE
TRIP_PREVIEW_TAXI_ROUTE PREVIEW_TAXI_ROUTE
TRIP_PREVIEW_TRUCK_ROUTE PREVIEW_TRUCK_ROUTE
TRIP_PREVIEW_TWO_WHEELER_ROUTE PREVIEW_TWO_WHEELER_ROUTE
TRIP_ROUTE ACTIVE_ROUTE
REMAINING_ROUTE

ПотребительПоездкаОбратный вызов

Старое значение Новое значение
onTripRouteUpdated onTripActiveRouteUpdated
onTripRemainingDistanceUpdated onTripActiveRouteRemainingDistanceUpdated
onTripRemainingWaypointsUpdated()

ПотребительКонтроллер

  • Теперь вы можете устанавливать обратные вызовы для состояний, не входя в состояние.
Метод Перезвонить
startPickupSelection setPickupSelectionCallback
startDropoffSelection setDropoffSelectionCallback
startTripPreview setTripPreviewSelectionCallback
  • ConsumerController.setLanguage(String languageCode) позволяет вам установить язык, используемый в вызовах FleetEngine (например, для описаний точек выдачи).

Улучшения

  • Состояние выбора выпадающего списка теперь имеет перетаскиваемую булавку.
  • Удалена анимация камеры в состоянии INITIALIZE .
  • ManagedChannelBuilder заменен на AndroidChannelBuilder .