Android Power Screen `Control` всегда преследует одни и те же цели

Я сотрудничаю с TheLastProject @github над приложением, которое работает как кошелек для карты лояльности: Catima (ссылка на мою вилку и на список приложений )

Я попытался реализовать карты Power screen и следовал руководству по разработке Android по элементам управления устройствами.

В результирующем коде (эта ссылка может стать недействительной во время перебазирования) есть проблемы

      @NonNull
@Override
public Flow.Publisher<Control> createPublisherFor(@NonNull List<String> controlIds) {
    return subscriber -> {
        subscriber.onSubscribe(new NoOpSubscription());
        for (String controlId : controlIds) {
            Integer cardId = this.controlIdToCardId(controlId);
            if (cardId == null)
                continue;
            LoyaltyCard card = dbHelper.getLoyaltyCard(cardId);
            Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class)
                    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                    .putExtra("id", card.id);
            PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(), 0, openIntent, PendingIntent.FLAG_IMMUTABLE);
            var ret = new Control.StatefulBuilder(controlId, pendingIntent)
                    .setTitle(card.store)
                    .setDeviceType(DeviceTypes.TYPE_GENERIC_OPEN_CLOSE)
                    .setSubtitle(card.note)
                    .setStatus(Control.STATUS_OK)
                    .setControlTemplate(new StatelessTemplate(controlId))
                    .setCustomIcon(Icon.createWithBitmap(Utils.generateIcon(this, card.store, card.headerColor).getLetterTile()))
                    .build();
            Log.d(TAG, "Dispatching widget " + controlId);
            subscriber.onNext(ret);
        }
        subscriber.onComplete();
    };
}

Дизайн кода

Карты лояльности обозначаются целым числом. Я создал уникальные идентификаторы элементов управления на основе этого целого числа, чтобы я мог запрашивать их. Как сказал мне специалист по обслуживанию, это представление, которое можно использовать для отображения карты лояльности, и намерение выглядит искренним.

Поэтому для каждой карты во входных данных я повторяю и реактивно генерирую новую для каждой карты. Каждый элемент управления имеет собственное намерение, и каждое намерение привязано к идентификатору карты.

Проблема

Проблема в том, что когда я долго нажимаю на виджет, намерение, испускаемое Android, имеет тот же идентификатор карты, что означает, что независимо от того, выбираю я разные виджеты, отображается одна и та же (не столь детерминированная) карта.

«Не такой уж детерминированный». Когда я удаляю все элементы управления и добавляю их снова, я не могу предсказать, какая карточка отображается. Но каждый раз, когда я снова открываю меню питания, я получаю ту же карту.

В студии Android я отлаживал и вижу, что тот же идентификатор карты передан в LoyaltyCardViewActivity, несмотря на то, что когда я создаю Control объект, который я могу четко отладить, что намерение всегда имеет другой идентификатор

Как воспроизвести

Работает на эмуляторе. Я использовал кучу настоящих карт лояльности и цифровой зеленый сертификат ЕС. Но можно создать две или более карт со штрих-кодом, введя случайные числа.

Вопрос

Что не так с моим кодом?

1 ответ

Решение
      PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(), 0, openIntent, PendingIntent.FLAG_IMMUTABLE);

Вы вызываете это N раз, и я предполагаю, что вы ожидаете, что создаете N различных объектов. На самом деле вы создаете только один, потому что ваш PendingIntent идентификатор у всех одинаковый: 0.

Измените это на что-то вроде:

      PendingIntent pendingIntent = PendingIntent.getActivity(this, cardId, openIntent, PendingIntent.FLAG_IMMUTABLE);

(Я предполагаю, что cardId уникальна для всех ваших карт)

Другие вопросы по тегам