Notification.Action с несколькими RemoteInputs - почему и как?

TL; версия DR: я заметил, что в Android может быть назначено действенное уведомление с несколькими экземплярами RemoteInput - но не смог найти сценарий, в котором это полезно, и даже не знал, как правильно использовать эту потенциальную функцию,

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

Я использовал это демонстрационное приложение со смесью из другого потока, чтобы сгенерировать уведомление, действие которого назначено двум разным экземплярам RemoteInput:

public void showRemoteInputNotification(Context context) {

    //Yes intent
    Intent yesReceive = new Intent();
    yesReceive.setAction(KEY_TEXT_REPLY);
    Bundle yesBundle = new Bundle();
    yesBundle.putInt("userAnswer", 1);
    yesReceive.putExtras(yesBundle);
    PendingIntent pendingIntentYes = PendingIntent.getBroadcast(context, 12345, yesReceive, PendingIntent.FLAG_UPDATE_CURRENT);
    //mBuilder.addAction(R.drawable.calendar_v, "Yes", pendingIntentYes);

    RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
            .setLabel("TEST")
            .build();

    RemoteInput remoteInput2 = new RemoteInput.Builder(KEY_TEXT_REPLY2)
            .setLabel("TEST2")
            .build();

    PendingIntent replyIntent = PendingIntent.getActivity(context,
            REPLY_INTENT_ID,
            getMessageReplyIntent(LABEL_REPLY),
            PendingIntent.FLAG_UPDATE_CURRENT);

    PendingIntent archiveIntent = PendingIntent.getActivity(context,
            ARCHIVE_INTENT_ID,
            getMessageReplyIntent(LABEL_ARCHIVE),
            PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Action replyAction =
            new NotificationCompat.Action.Builder(android.R.drawable.sym_def_app_icon,
                    LABEL_REPLY, pendingIntentYes)//replyIntent)
                    .addRemoteInput(remoteInput)
                    .addRemoteInput(remoteInput2)
                    .build();

    NotificationCompat.Action archiveAction =
            new NotificationCompat.Action.Builder(android.R.drawable.sym_def_app_icon,
                    LABEL_ARCHIVE, archiveIntent)
                    .build();

    NotificationCompat.Builder builder =
            createNotificationBuider(context, "Remote input", "Try typing some text!");
    builder.addAction(replyAction);
    builder.addAction(archiveAction);
    //builder.addAction(android.R.drawable.ic_menu_send, "Yes", pendingIntentYes);

    showNotification(context, builder.build(), REMOTE_INPUT_ID);
}

Тогда пользовательский интерфейс (прокрутка вниз верхней панели уведомлений) все равно будет выглядеть одинаково (столько же кнопок действий). Поэтому я подумал, что, возможно, когда пользователь выполнит действие уведомления через интерфейс системных уведомлений, будут использоваться оба удаленных входа? Поэтому я проверил это в добавленном классе BroadcastReceiver к тому же приложению, которое генерирует это уведомление в первую очередь:

public class NotificationReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Set<String> keys1 = intent.getExtras().keySet();
        Set<String> keys2 = RemoteInput.getResultsFromIntent(intent).keySet();
    }
}

и кажется, что используется только последний RemoteInput, который будет добавлен к действию.

В общем, мне было интересно, есть ли лучший способ использовать или продемонстрировать такой сценарий - или, возможно, это плохая практика для начала? Я смешивал разные части API, которые не должны использоваться таким образом?

РЕДАКТИРОВАТЬ: также попробовал с этим примером от Google, единственное отличие (насколько я понимаю) состоит в том, что этот использует Wearable-типа Action/RemoteInput. Внутри его generateBigPictureStyleNotification функции, я добавил / изменил следующие строки:

RemoteInput remoteInput2 =
                new RemoteInput.Builder(BigPictureSocialIntentService.EXTRA_COMMENT2)
                        .setLabel("TEST")
                        // List of quick response choices for any wearables paired with the phone
                        .setChoices(bigPictureStyleSocialAppData.getPossiblePostResponses())
                        .build();
[...]
NotificationCompat.Action replyAction =
            new NotificationCompat.Action.Builder(
                    R.drawable.ic_reply_white_18dp,
                    replyLabel,
                    replyActionPendingIntent)
                    .addRemoteInput(remoteInput)
                    .addRemoteInput(remoteInput2)
                    .build();

Но затем, как и раньше, когда я пытался ответить из пользовательского интерфейса уведомлений Android, он, похоже, заполнил только последний ключ RemoteInput (отмечен BigPictureSocialIntentService "s getMessage()).

0 ответов