waleedAhmad1 / google-glass-api

Automatically exported from code.google.com/p/google-glass-api
0 stars 0 forks source link

Custom menu items do not ping server via subscription #491

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
What steps will reproduce the problem?
1. Subscribe to notifications (I used PHP in my case)
2. Create custom menu item and send to Glass with timeline card
3. Tap the custom menu item 

What is the expected output? What do you see instead?
The payload should be sent to the server where the subscription is set up.  
This works for the "REPLY" action but not when the action is set to "CUSTOM"

What version of the product are you using? On what operating system?
Google Glass v2 running XE16.1.1

Please provide any additional information below.

This is the PHP code I am using for the notification and custom menu button:

    subscribe_to_notifications($mirror_service, 'timeline', uniqid(), 'https://gpop-server.com/glass-notifications/post.php');

   $menu_items = array();

    $menu_item = new Google_MenuItem();

    $menu_item->setAction("CUSTOM");

    $custom_menu_value = new Google_MenuValue();

    $custom_menu_value->setDisplayName("Notify Server");

    $menu_item->setId('Testing');

    $menu_item->setPayload('Testing');

    $menu_item->setValues(array($custom_menu_value));

    array_push($menu_items, $menu_item);

    $new_timeline_item = new Google_TimelineItem();
    $notification = new Google_NotificationConfig();
    $notification->setLevel("DEFAULT");
    $new_timeline_item->setNotification($notification);
    $new_timeline_item->setMenuItems($menu_items);
    $new_timeline_item->setText('Notifications Test');

    insert_timeline_item($mirror_service, $new_timeline_item, 'image/jpeg', file_get_contents('https://www.google.com/images/srpr/logo11w.png'));

This is the object for the custom menu item once it is created:

Google_MenuItem Object
(
    [action] => CUSTOM
    [id] => 
    [payload] => 
    [removeWhenSelected] => 1
    [__valuesType:protected] => Google_MenuValue
    [__valuesDataType:protected] => array
    [values] => Array
        (
            [0] => Google_MenuValue Object
                (
                    [displayName] => SEND
                    [iconUrl] => 
                    [state] => 
                )

        )

)

Thanks in advance for your help.

Original issue reported on code.google.com by ibrahimk...@gmail.com on 27 Apr 2014 at 7:03

GoogleCodeExporter commented 9 years ago
[deleted comment]
GoogleCodeExporter commented 9 years ago
I'm experiencing the same issue, using Ruby and the subscription proxy.  I'm 
testing on my own computer and the local web server I'm testing with available 
publically (tested with cellular connection from my phone), but I never see any 
hits to the web server.  I've checked the timeline objects returned and the 
callback URL comes back as what I expect (the subscription proxy address and my 
own address appended).  I've been searching and scratching my head, but nothing 
as of yet.

My code is available here:  https://github.com/willjasen/dropcam-glass

Original comment by willja...@gmail.com on 27 Apr 2014 at 7:26

GoogleCodeExporter commented 9 years ago
[deleted comment]
GoogleCodeExporter commented 9 years ago
Thanks for replying!  It seems that the custom menu action does in fact work 
using the Google Mirror API playground 
(https://developers.google.com/glass/tools-downloads/playground) but NOT when 
run from Google Glass (XE16.1.1).  

Could this perhaps be a firmware bug?  Please let me know if I can provide any 
additional assets or resources.

Original comment by ibrahimk...@gmail.com on 27 Apr 2014 at 8:10

Attachments:

GoogleCodeExporter commented 9 years ago
I know that the Glass-Nest app (http://www.glass-nest.com) that I have uses 
subscriptions and it is working okay for me, making me think it's less likely a 
firmware bug and maybe more of something that I'm just missing, but everything 
in my code and what is generated during runtime looks to be okay and I would 
expect that an update would trigger something, even an error, but I never see 
any of that.

Original comment by willja...@gmail.com on 2 May 2014 at 9:36

GoogleCodeExporter commented 9 years ago
I'm experiencing the same issue in XE16.2.

Finally, I found some errors in LOGCAT. (logs are following.)

That log says function 
com.google.glass.sync.AttachmentManager.storePathToIdMapping rise assert at 
sync to google. By this error, the update(user selected the menuitem) will 
never sync to google server.

I remove attachment-image from 'TimelineItem', then the update was notified to 
my server. 

>insertTimelineItem($mirror_service, $new_timeline_item, "image/jpeg", 
$im->getimageblob()); // will NEVER sync to google, and NOT notify to my server.

>insertTimelineItem($mirror_service, $new_timeline_item,null,null); // will 
sync to google, and notify to my server.

That function 'storePathToIdMapping(path, remoteID)' has 2 params. 
But 'path' is empty string at that case.
In this funciton, 'android/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)' 
at AttachmentManager:327 and 'invoke-static {v3}, 
Lcom/google/glass/predicates/Assert;->assertFalse(Z)V', then the item never 
sync.

I think this could be a firmware bug.

-----

05-06 01:03:34.577: I/MainTimelineView(688): New timeline database content 
loaded; updating views.
05-06 01:03:34.640: I/SyncHelper(688): Requesting sync 
[authority=com.google.glass.timeline, syncSource=DEVICE_TIMELINE, 
extras=Bundle[{}]].
05-06 01:03:34.726: D/dalvikvm(811): GC_EXPLICIT freed 828K, 16% free 
5859K/6904K, paused 16ms+9ms, total 141ms
05-06 01:03:34.749: I/MainTimelineView(688): New timeline database content 
loaded; updating views.
05-06 01:03:34.796: I/TimelineSyncAdapter(811): Entering onPerformSync 
[authority= com.google.glass.timeline, extras=Bundle[{sync_priority=0}]].
05-06 01:03:34.827: I/DownloadSyncHelper(811): Fetching unsynced items from 
server.
05-06 01:03:34.858: I/DownloadSyncHelper(811): Requesting sync 
[window=TimelineSyncWindow{startTime=1399305735227001, continuationToken=null}].
05-06 01:03:34.897: I/TimelineHelper(811): Getting unsynced items with sync 
protocols: 0, 1
05-06 01:03:34.968: W/GLSUser(919): GoogleAccountDataService.getToken()
05-06 01:03:35.983: I/DownloadSyncHelper(811): Received items from server 
[count=0].
05-06 01:03:36.077: W/TimelineSyncHandler(811): Exception waiting for timeline 
upload to complete.
05-06 01:03:36.077: W/TimelineSyncHandler(811): 
java.util.concurrent.ExecutionException: java.lang.IllegalStateException: 
Expected condition to be false.
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
java.util.concurrent.FutureTask.report(FutureTask.java:93)
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
java.util.concurrent.FutureTask.get(FutureTask.java:163)
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
com.google.glass.sync.TimelineSyncHandler.sync(TimelineSyncHandler.java:116)
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
com.google.glass.sync.TimelineSyncAdapter.onPerformSync(TimelineSyncAdapter.java
:55)
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncA
dapter.java:259)
05-06 01:03:36.077: W/TimelineSyncHandler(811): Caused by: 
java.lang.IllegalStateException: Expected condition to be false.
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
com.google.glass.predicates.Assert.assertFalse(Assert.java:102)
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
com.google.glass.sync.AttachmentManager.storePathToIdMapping(AttachmentManager.j
ava:327)
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
com.google.glass.sync.UploadSyncHelper.addAttachments(UploadSyncHelper.java:440)
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
com.google.glass.sync.UploadSyncHelper.syncItemToCloud(UploadSyncHelper.java:288
)
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
com.google.glass.sync.UploadSyncHelper.syncNextUnsyncedItem(UploadSyncHelper.jav
a:831)
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
com.google.glass.sync.UploadSyncHelper.sync(UploadSyncHelper.java:203)
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
com.google.glass.sync.TimelineSyncHandler$1.call(TimelineSyncHandler.java:98)
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
com.google.glass.sync.TimelineSyncHandler$1.call(TimelineSyncHandler.java:94)
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
java.util.concurrent.FutureTask.run(FutureTask.java:237)
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
05-06 01:03:36.077: W/TimelineSyncHandler(811):     at 
java.lang.Thread.run(Thread.java:841)
05-06 01:03:36.077: W/FormattingLoggers(811): Last logging operation took a 
long time (in ms): 71

Original comment by takuhiro...@gmail.com on 5 May 2014 at 7:31

GoogleCodeExporter commented 9 years ago
I changed my code so that the attachments and parameters with the timeline item 
aren't executed, and I received a plain text card with the update menu as 
expected, but still no hits to my testing web server.

Original comment by willja...@gmail.com on 6 May 2014 at 8:46

GoogleCodeExporter commented 9 years ago
I can confirm that this bug is still happening for me in XE17.  

I am using the following to insert the timeline item in PHP:
insert_timeline_item($mirror_service, $new_timeline_item, null, null);

The server notification works fine from the Mirror API playground but not when 
running on the device.

Original comment by ibrahimk...@gmail.com on 8 May 2014 at 1:46

GoogleCodeExporter commented 9 years ago
On Glass V2 running XE17.

insertTimelineItem($mirror_service, $new_timeline_item, "image/jpeg", 
$im->getimageblob());
V
TimelineItem inserted.
V
Select CUSTOM menu.
V
No hit to my server...

But,

insertTimelineItem($mirror_service, $new_timeline_item, "image/jpeg", 
$im->getimageblob());
V
TimelineItem inserted.
V
Select Built-in action(like SHARE) menu.
V
Shared.
V
Select CUSTOM menu at same TimelineItem that already shared.
V
Hit to my server!

Original comment by takuhiro...@gmail.com on 9 May 2014 at 5:41

GoogleCodeExporter commented 9 years ago
Not seeing this issue currently in XE17. To the original poster 
ibrahimk...@gmail.com, your PHP is incorrect. You're using setPayload() on a 
menu item and that's not the proper method (see the class definition in 
Google_MirrorService within the Google API Client). A typical custom menu item 
in PHP looks like:

// A custom menu item
$custom_menu_item = new Google_MenuItem();
$custom_menu_value = new Google_MenuValue();
$custom_menu_value->setDisplayName("Test CUSTOM");
$custom_menu_value->setIconUrl("https://something-somewhere/icon.png");

$custom_menu_item->setValues(array($custom_menu_value));
$custom_menu_item->setAction("CUSTOM");

$custom_menu_item->setId("issue491-test");

Attached image shows said code sending notification back to application through 
an ngrok tunnel.

Original comment by justin.d...@gmail.com on 12 May 2014 at 4:20

Attachments:

GoogleCodeExporter commented 9 years ago
Justin, could this be working because you are using a local server instead of a 
live server?

Still seeing this issue in XE17, but works fine in Mirror API Playground.  I 
have set up the subscription to ping an HTTPS url on a GoDaddy server.  Below 
is my Mirror API timeline code (PHP) and the resulting timeline item.

Google_TimelineItem Object
(
    [__attachmentsType:protected] => Google_Attachment
    [__attachmentsDataType:protected] => array
    [attachments] => 
    [bundleId] => 
    [canonicalUrl] => 
    [created] => 2014-05-13T05:00:05.967Z
    [__creatorType:protected] => Google_Contact
    [__creatorDataType:protected] => 
    [creator] => 
    [displayTime] => 
    [etag] => 1399957205967
    [html] => 
    [htmlPages] => 
    [id] => 40771318-14de-45d7-8a65-68570b999f2e
    [inReplyTo] => 
    [isBundleCover] => 
    [isDeleted] => 
    [isPinned] => 
    [kind] => mirror#timelineItem
    [__locationType:protected] => Google_Location
    [__locationDataType:protected] => 
    [location] => 
    [__menuItemsType:protected] => Google_MenuItem
    [__menuItemsDataType:protected] => array
    [menuItems] => Array
        (
            [0] => Google_MenuItem Object
                (
                    [action] => CUSTOM
                    [id] => Test-ID
                    [payload] => Test Payload
                    [removeWhenSelected] => 
                    [__valuesType:protected] => Google_MenuValue
                    [__valuesDataType:protected] => array
                    [values] => Array
                        (
                            [0] => Google_MenuValue Object
                                (
                                    [displayName] => TEST
                                    [iconUrl] => http://gpop-server.com/vip-membership/icon.png
                                    [state] => DEFAULT
                                )

                            [1] => Google_MenuValue Object
                                (
                                    [displayName] => Sending...
                                    [iconUrl] => http://gpop-server.com/vip-membership/icon.png
                                    [state] => PENDING
                                )

                            [2] => Google_MenuValue Object
                                (
                                    [displayName] => Confirmed!
                                    [iconUrl] => http://gpop-server.com/vip-membership/icon.png
                                    [state] => CONFIRMED
                                )

                        )

                )

        )

    [__notificationType:protected] => Google_NotificationConfig
    [__notificationDataType:protected] => 
    [notification] => Google_NotificationConfig Object
        (
            [deliveryTime] => 
            [level] => DEFAULT
        )

    [pinScore] => 
    [__recipientsType:protected] => Google_Contact
    [__recipientsDataType:protected] => array
    [recipients] => 
    [selfLink] => https://www.googleapis.com/mirror/v1/timeline/40771318-14de-45d7-8a65-68570b999f2e
    [sourceItemId] => 
    [speakableText] => 
    [speakableType] => 
    [text] => Subscription Test
    [title] => 
    [updated] => 2014-05-13T05:00:05.967Z
)

$new_timeline_item = new Google_TimelineItem();

    $notification = new Google_NotificationConfig();
    $notification->setLevel("DEFAULT");
    $new_timeline_item->setNotification($notification);

    $menu_items = array();

    $menu_item = new Google_MenuItem();

    $menu_item->setAction("CUSTOM");

    $menu_item->setPayload("Test Payload");

    $custom_menu_value = new Google_MenuValue();

    $custom_menu_value->setIconUrl('http://gpop-server.com/vip-membership/icon.png');

    $custom_menu_value->setDisplayName("TEST");

    $custom_menu_value->setState("DEFAULT");

    $menu_item->setId('Test-ID');

    $custom_menu_value_pending = new Google_MenuValue();

    $custom_menu_value_pending->setDisplayName("Sending...");

    $custom_menu_value_pending->setIconUrl('http://gpop-server.com/vip-membership/icon.png');

    $custom_menu_value_pending->setState("PENDING");

    $custom_menu_value_confirmed = new Google_MenuValue();

    $custom_menu_value_confirmed->setDisplayName("Confirmed!");

    $custom_menu_value_confirmed->setState("CONFIRMED");

    $custom_menu_value_confirmed->setIconUrl('http://gpop-server.com/vip-membership/icon.png');

    $menu_item->setValues(array($custom_menu_value,$custom_menu_value_pending, $custom_menu_value_confirmed));

    array_push($menu_items, $menu_item);

    $new_timeline_item->setMenuItems($menu_items);

    $new_timeline_item->setText('Subscription Test');

    $timeline = insert_timeline_item($mirror_service, $new_timeline_item, null, null);

Original comment by ibrahimk...@gmail.com on 13 May 2014 at 5:05

GoogleCodeExporter commented 9 years ago
It works now! No code changes needed, only a Glass reset. I've been having 
issues with auto backup that Glass updates weren't fixing, so I did a factory 
reset and that issue was fixed, so for kicks, I tried once again for a pingback 
and I received one! Who knew..

Original comment by willja...@gmail.com on 26 May 2014 at 8:22

GoogleCodeExporter commented 9 years ago
Works as well for me - thank you Will for the suggestion!

Original comment by ibrahimk...@gmail.com on 28 May 2014 at 9:59

GoogleCodeExporter commented 9 years ago
Hi Guys

We are working on google glass apps with mirror api, native android and hybrid. 
Since XE - 16 google update, we are not getting notifications on our php mirror 
api apps which are totally dependent on menu actions, sharing with contact etc. 
We are authorized and also subscribed

Original comment by sonamsin...@gmail.com on 29 May 2014 at 12:46

GoogleCodeExporter commented 9 years ago
Have you tried factory resetting Glass?  Do you have code available somewhere 
to review?

Original comment by willja...@gmail.com on 29 May 2014 at 2:59

GoogleCodeExporter commented 9 years ago
Hey all - still having this issue but made a major discovery today.

After doing a factory reset on Glass, I was able to receive notifications to my 
server using the following timeline insert:

$timeline = insert_timeline_item($mirror_service, $new_timeline_item, null, 
null);

However, I noticed that if you use the image/jpeg method below, it will not 
send notifications to the server.  

$timeline = insert_timeline_item($mirror_service, $new_timeline_item, 
'image/jpeg', 
file_get_contents('http://cdn.shopify.com/s/files/1/0251/6611/files/Starter.jpg?
3294'));

Also, most importantly... the above 'image/jpeg' implementation causes all 
future timeline subscription notifications (even when properly implemented) to 
hang up and will only work again once a factory reset is done.

Hope this is helpful.

Original comment by ibrahimk...@gmail.com on 29 May 2014 at 10:06

GoogleCodeExporter commented 9 years ago
I notice the same problem with updating a subscription if an image is sent with 
the timeline item. I'm able to delete the subscription so that I don't have to 
perform a factory reset, but still unfortunate.

There has to be some way to do it; for example, Twitter notifications have a 
background image and updates still work for those cards, so we're missing 
something.

Original comment by willja...@gmail.com on 30 May 2014 at 2:26

GoogleCodeExporter commented 9 years ago
Getting the same problem here. The playground ( 
https://developers.google.com/glass/tools-downloads/playground ) lets me click 
on the custom action on the card fine and the server's notify end point is 
called.

If I do the same on the Glass runing XE 18.11, the server never gets called, 
and I see a crash in the logs:
I/TimelineItemDatabaseHelper( 2096): Getting unsynced items with sync 
protocols: 0, 1
I/TimelineItemDatabaseHelper( 2096): Prioritizing 
7648b7fc-64cf-4311-81cc-68a36f3210e9 due to shareCount=1
W/AwContents( 2069): nativeOnDraw failed; clearing to background color.
I/MainTimelineView( 2069): New timeline database content loaded; updating views.
I/MainTimelineView( 2069): New timeline database content loaded; updating views.
I/EyeGestureService( 1829): Retrieving persistent state of detection for 
gesture DON.
I/DownloadSyncHelper( 2096): Received items from server [count=0].
W/TimelineSyncHandler( 2096): Exception waiting for timeline upload to complete.
W/TimelineSyncHandler( 2096): java.util.concurrent.ExecutionException: 
java.lang.IllegalStateException: Expected condition to be false.
W/TimelineSyncHandler( 2096):   at 
java.util.concurrent.FutureTask.report(FutureTask.java:93)
W/TimelineSyncHandler( 2096):   at 
java.util.concurrent.FutureTask.get(FutureTask.java:163)
W/TimelineSyncHandler( 2096):   at 
com.google.glass.sync.TimelineSyncHandler.sync(TimelineSyncHandler.java:145)
W/TimelineSyncHandler( 2096):   at 
com.google.glass.sync.TimelineSyncAdapter.onPerformSync(TimelineSyncAdapter.java
:57)
W/TimelineSyncHandler( 2096):   at 
android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncA
dapter.java:259)
W/TimelineSyncHandler( 2096): Caused by: java.lang.IllegalStateException: 
Expected condition to be false.
W/TimelineSyncHandler( 2096):   at 
com.google.glass.predicates.Assert.assertFalse(Assert.java:102)
W/TimelineSyncHandler( 2096):   at 
com.google.glass.sync.AttachmentManager.storePathToIdMapping(AttachmentManager.j
ava:329)
W/TimelineSyncHandler( 2096):   at 
com.google.glass.sync.UploadSyncHelper.addAttachments(UploadSyncHelper.java:432)
W/TimelineSyncHandler( 2096):   at 
com.google.glass.sync.UploadSyncHelper.syncItemToCloud(UploadSyncHelper.java:279
)
W/TimelineSyncHandler( 2096):   at 
com.google.glass.sync.UploadSyncHelper.syncNextUnsyncedItem(UploadSyncHelper.jav
a:823)
W/TimelineSyncHandler( 2096):   at 
com.google.glass.sync.UploadSyncHelper.sync(UploadSyncHelper.java:194)
W/TimelineSyncHandler( 2096):   at 
com.google.glass.sync.TimelineSyncHandler$1.call(TimelineSyncHandler.java:127)
W/TimelineSyncHandler( 2096):   at 
com.google.glass.sync.TimelineSyncHandler$1.call(TimelineSyncHandler.java:123)
W/TimelineSyncHandler( 2096):   at 
java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/TimelineSyncHandler( 2096):   at 
com.google.glass.async.AsyncThreadExecutorManager$2$1.run(AsyncThreadExecutorMan
ager.java:63)
W/TimelineSyncHandler( 2096):   at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
W/TimelineSyncHandler( 2096):   at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
W/TimelineSyncHandler( 2096):   at java.lang.Thread.run(Thread.java:841)
I/chromium( 2069): [INFO:async_pixel_transfer_manager_android.cc(56)] Async 
pixel transfers not supported
W/BluetoothAdapter( 2014): getBluetoothService() called with no 
BluetoothManagerCallback
D/BTIF_SOCK( 2161): service_uuid: 0000111f-0000-1000-8000-00805f9b34fb
D/BluetoothSocket( 2014): connect(), SocketState: INIT, mPfd: 
{ParcelFileDescriptor: FileDescriptor[75]}

I guess the Glass can click custom action menu items on things without an image 
attachment because the crash looks related to the Glass uploading the 
attachment. Maybe other people get around the problem by just using HTML cards 
that refer to remote images in their src attributes and not having any 
attachment?

Original comment by lna...@gmail.com on 25 Jun 2014 at 3:39

GoogleCodeExporter commented 9 years ago
You can tell when your sync is broken because after tapping the action the two 
arrows in a circle in the lower right corner get stuck and stay there. After 
factory reset and getting actions working again (by not using attachments), 
they go away almost immediately after an action. So this is a good indicator to 
go factory reset your Glass. I tried removing all the cards from the app and 
tried clearing the data on the Home app, but that didn't seem to fix things.

Original comment by lna...@gmail.com on 25 Jun 2014 at 4:16

GoogleCodeExporter commented 9 years ago
I changed my app so that the images were displayed using HTML rather than 
uploading.  Two problems with this:

1.  While the subscription update pings my servers, the image on Glass doesn't 
actually update, even though the server has generated the new image at the same 
link.  Maybe Glass is caching data and not reloading the image correctly?  I 
could try to add in a date into the link to change up the URL and see what 
happens.

2.  Other apps, like Twitter, display an attached photo to a tweet as an 
uploaded image.  The image is less opaque in the background while the tweet 
text and user profile picture overlays on top of the background image cleanly, 
and assumingly, less style formatting work.

Ultimately, uploading an image is the way to go - I'm just not sure why updates 
don't happen as expected.

Original comment by willja...@gmail.com on 6 Jul 2014 at 5:29

GoogleCodeExporter commented 9 years ago
I also don't get notifications. I have Glass with XE 20.1 (I haven't factory 
reset it in a while). I run the Mirror API Java Quick Start project of June 
out-of-the-box. I deployed it and run it on my server that has a routable IP 
address, and I use the subscription proxy for notifications over non-SSL. I get 
timeline cards in my Glass and the logs on my server shows "Bootstrapper 
inserted subscription timeline". Good.

THIS SCENARIO WORKS:
In the Glassware Starter Project, I select "Insert a card you can reply to", my 
Glass gets the card "Tell me what you had for lunch :)", I tap the card and 
select "Reply", I speak a message, and after some 10s my server logs show "got 
raw notification" with "operation": "INSERT". Good. That proves the 
subscription and notifications are going through.

THIS SCENARIO FAILS:
When I tap the same card and select "Drill In", my server does NOT get the 
notification. Not good. I'm expecting "operation": "MENU_ACTION" as per the 
Mirror API documentation. I also removed the IconUrl from the custom menu item 
in case the image was at cause but that didn't help.

PAST TESTS
I have logs from Sept 3 last week when I had tested notifications for the first 
time using a custom menu item I had copy/pasted from the Drill In example. The 
logs show I had gotten a notification "operation": "UPDATE" [...] "type": 
"CUSTOM". (That differs from the MENU_ACTION I expect; nevertheless it was a 
positive result.) I don't know if this worked before Sept 3 or not. But since 
then, it hasn't worked. I tried reproducing the notification to no avail. I 
suspect something broke somewhere in XE or in Mirror API since Sept 3.

Original comment by thibaud....@gmail.com on 11 Sep 2014 at 3:58

GoogleCodeExporter commented 9 years ago
So, I factory reset my Glass based on the previous comments, it's still XE 
20.1. I re-ran the same setup. Now I don't get any notifications at all, not 
even the "Reply" that I was able to receive up to a few minutes ago before the 
factory reset...?!?

Original comment by thibaud....@gmail.com on 11 Sep 2014 at 5:52

GoogleCodeExporter commented 9 years ago
UPDATE. I did some more tests, and I conclude the following: 1) notifications 
on custom menu items do work, 2) only if the timeline card is not part of a 
bundle, 3) only if the timeline card is not a bundle cover (that was already 
known and documented), 4) only if the timeline card does not have an image 
attachment, and 5) only if the custom menu item does not have an IconUrl. I 
think #4 is what some of the previous comments were trying to say. When I meet 
those conditions, I get "operation": "UPDATE", "type": "CUSTOM", and the 
payload. I still have to triple-check what I'm saying.

Original comment by thibaud....@gmail.com on 12 Sep 2014 at 6:18

GoogleCodeExporter commented 9 years ago
Hey Thibaud, some menu commands don't go to the server. Although the ones that 
do are broken when there's an image attachment. That's what this bug report is 
about.

Original comment by lna...@gmail.com on 12 Sep 2014 at 2:14

GoogleCodeExporter commented 9 years ago
It's a tough issue to debug, because once you get that broken, stuck sync 
symbol in the bottom right when you start trying to run commands, nothing is 
going to go up until you empty out your timeline and reset your Glass. Glass 
will always just have some sort of internal crash trying to sync after that 
point.

Original comment by lna...@gmail.com on 12 Sep 2014 at 2:16

GoogleCodeExporter commented 9 years ago
Lance, thanks for the response. What does the "broken stuck sync symbol" looks 
like? I get "just now" and the circular arrows and that's it. How do you tell 
if my Glass is stuck/crashed? /T

Original comment by thibaud....@gmail.com on 13 Sep 2014 at 5:33