Pregunta

Estoy enviando un paquete de tarjetas a Glass con Mirror API (biblioteca c#)

Sé que puede usar el elemento del menú de eliminación predeterminado en tarjetas individuales, pero ¿hay alguna manera de proporcionar la funcionalidad de eliminación para un paquete completo, idealmente como resultado de una acción de los usuarios?

He utilizado con éxito la acción ELIMINAR en un elemento del menú con el siguiente código

MenuItem mi = new MenuItem();
mi.Action = "DELETE";

TimelineItem tli = new TimelineItem()
{
    Html = itemHtml.ToString(),
    Notification = new NotificationConfig() { Level = "DEFAULT" },
    MenuItems = new List<MenuItem>() { mi }
};

¿Hay alguna manera de agregar este elemento del menú de eliminación a la portada de un paquete?Sé que esto puede ser complicado porque al hacer clic en la cubierta del paquete, se accede a las tarjetas secundarias, por lo que no hay ningún menú como en las tarjetas individuales.Estoy buscando algo (que probé pero simplemente ignoró el elemento del menú) como esto:

MenuItem mi = new MenuItem();
mi.Action = "DELETE";

TimelineItem tli = new TimelineItem()
{
    Html = itemHtml.ToString(),
    Notification = new NotificationConfig() { Level = "DEFAULT" },
    IsBundleCover = true,
    BundleId = bundleId,
    MenuItems = new List<MenuItem>() { mi }
};

Si no es posible en una tarjeta de presentación, ¿hay alguna manera de hacerlo para un paquete agregando elementos de menú de eliminación a las tarjetas secundarias?

cualquier sugerencia sera apreciada

¿Fue útil?

Solución

Puede usar el menú personalizado para hacer esto.El código a continuación está utilizando Java pero C # debe ser similar:

  1. Agregar elemento de menú personalizado a la tarjeta:

    List<MenuValue> menuValueList = new ArrayList<MenuValue>();
    menuValueList.add(new MenuValue().setIconUrl(iconUrl).setDisplayName("Delete All"));
    
    MenuItem menuItem = new MenuItem();
    menuItem.setValues(menuValueList).setId("delete_bundle_A").setAction("CUSTOM");
    
    List<MenuItem> menuItemList = new ArrayList<MenuItem>();
    menuItemList.add(menuItem);
    
    timelineItem.setMenuItems(menuItemList);
    
  2. Defina el controlador que maneja la solicitud de devolución de llamada de la notificación del servidor de espejo:

    if (notification.getCollection().equals("timeline") && notification.getUserActions().contains(new UserAction().setType("CUSTOM").setPayload("delete_bundle_A"))) {
        deleteCards(credential, bundleId);
    }
    
  3. La función de tarjeta de eliminación:

    // if bundleId is null or "", delete all cards
    public static void deleteCards(Credential credential, String bundleId) throws IOException {
        if (bundleId == null) {
            bundleId = "";
        }
        Mirror.Timeline timelineItems = MirrorClient.getMirror(credential).timeline();
        Mirror.Timeline.List list = timelineItems.list();
        List<TimelineItem> timelineItemList = null;
        do {
            TimelineListResponse response = list.execute();
            timelineItemList = response.getItems();
            if (timelineItemList != null && timelineItemList.size() > 0) {
                for (TimelineItem item : timelineItemList) {
                    if (bundleId == "" || bundleId.equalsIgnoreCase(item.getBundleId())) {
                        LOG.info("Deleting card " + item.getId());
                        MirrorClient.deleteTimelineItem(credential, item.getId());
                    }
                }
                list.setPageToken(response.getNextPageToken());
            } else {
                break;
            }
        } while (list.getPageToken() != null && list.getPageToken().length() > 0);
    }
    
  4. Finalmente, no olvide suscribirse a la notificación de la línea de tiempo cuando se inicia la aplicación:

    String notifyUrl = "https://mirrornotifications.appspot.com/forward?url=" + "http://yourServer.com/notify";
    Subscription subscription = MirrorClient.insertSubscription(credential, notifyUrl, userId, "timeline");
    

Otros consejos

No está claro si está preguntando cómo crear los elementos del menú para eliminar todo el paquete de una vez o si está buscando un código para realizar la eliminación real.

Yuan proporciona muy buenas respuestas a ambas (sobre todo porque en realidad proporciona código, lo cual yo no haré), pero hay tres cosas que quizás también quieras considerar.

1) No puedes tener un menú en la portada del paquete, pero si no especificas explícitamente una portada del paquete, la tarjeta más reciente se mostrará como portada. y También se mostrará como la primera carta del paquete.Podrás acceder al menú de esta manera.(La aplicación de mensajería predeterminada funciona de esta manera, por ejemplo, pero la primera tarjeta tiene el mismo menú que el resto).

2) No es necesario crear un nuevo elemento de menú.Puede aprovechar el elemento del menú ELIMINAR, si lo desea.Recibirá una notificación de eliminación de una de las tarjetas del paquete y luego podrá leer el ID del paquete y eliminar el resto.

3) No es necesario realizar un bucle todo las tarjetas que ha insertado solo para encontrar las que tengan ese ID de paquete.Eso es terriblemente ineficiente.No hablo C# con fluidez, pero al leer la documentación en https://developers.google.com/resources/api-libraries/documentation/mirror/v1/csharp/latest/classGoogle_1_1Apis_1_1Mirror_1_1v1_1_1TimelineResource_1_1ListRequest.html, tengo la sensación de que puedes crear una ListRequest y luego configurar el ID del paquete antes de ejecutar la consulta y obtener los resultados.

Entonces creo que puedes cambiar el código de Yuan a algo como:

Mirror.Timeline.List list = timelineItems.list();
list.BundleId = bundleId;
List<TimelineItem> timelineItemList = null;
do {
    TimelineListResponse response = list.execute();
    timelineItemList = response.getItems();
    if (timelineItemList != null && timelineItemList.size() > 0) {
        for (TimelineItem item : timelineItemList) {
            LOG.info("Deleting card " + item.getId());
            MirrorClient.deleteTimelineItem(credential, item.getId());
        }
        list.setPageToken(response.getNextPageToken());
    } else {
        break;
    }
} while (list.getPageToken() != null && list.getPageToken().length() > 0);

(esto debería tratarse como pseudocódigo, en el mejor de los casos)

Si estás seguro de cuántos artículos has incluido en un paquete, es posible que también puedas configurar list.MaxResults y no tener que iterar sobre las páginas de resultados.Entonces tal vez algo más parecido

Mirror.Timeline.List list = timelineItems.list();
list.BundleId = bundleId;
list.MaxResults = 20;  // Set to more than the max number of items in a bundle
TimelineListResponse response = list.execute();
List<TimelineItem> timelineItemList = response.getItems();
if (timelineItemList != null && timelineItemList.size() > 0) {
    for (TimelineItem item : timelineItemList) {
        LOG.info("Deleting card " + item.getId());
        MirrorClient.deleteTimelineItem(credential, item.getId());
    }
}

No parece haber una manera de eliminar un paquete en un solo paso, pero todavía es posible ... Puede hacer una línea de tiempo / línea de tiempo para obtener una lista de elementos que su aplicación ha presionado a la línea de tiempo de los usuarios.Filtro de que para encontrar las entradas con el Bundleid que desea eliminar.Para cada uno de esos artículos, llame a Eliminar / Timeline / {itemID}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top