Class PushChannelProps

java.lang.Object
com.iizix.prop.GProp<GProp<?>[]>
com.iizix.prop.PropCnr
com.iizix.prop.push.PushChannelProps
All Implemented Interfaces:
EventListener, IGProp<GProp<?>[]>, IPropCnr, Cloneable

public class PushChannelProps extends PropCnr
The Push Notification (PN) channel of one client session: the container under $env that carries Push state and calls between the server and the client (PUSH-PROPS-DESIGN section 3, ruled 2026-09-24 RR-1 B; built by P4-06).

Created by the client (RR-2 A): iz/EnvProps.js adds it to $env when iz/PushChannelProps.js is loaded, which iiziApp.html does and the Designer, Design Viewer and VSViewer pages do not, so that its absence means exactly "this session has no channel" and every client-bound call of the Java API fails no_device (RR-17 A). The server never predefines it, so EnvProps.onRemoteRootCreated() never makes it private. of(EnvProps) finds it.

State is properties (RR-19 A), written by the client: UUID the push UUID (contract 2.5, the device UUID report - empty means none could be established, so the device calls fail no_device), TRANSPORT the wire key of the transport the device is reached through (v VAPID, fc FCM, empty when it cannot receive PN), and PERM the permission as a cached view. The server writes KEY, the application's VAPID public key, when the session is created, so that a later click (P4-09) needs no round trip; never the private key, never the FCM service account. With it SKEY, the server's own * public key, so that a Browser already subscribed under it - inside iiziRun Developer - answers that subscription with P_VAPID_PUBLIC_KEY instead of key_conflict (PUSH-CLUSTER-DESIGN 3.3, B-10b, RR-21 C). And AUTH: true once the application session has an authenticated user - at creation, and when an in-app sign-in sets one later - the client draining its kept receipts only while it is true (design 7, ruled 2026-09-26 R-10 A). And APP and SERVER at creation, the session's canonical application ID and the push server ID (CC-DESIGN-PUSH-APPID-FILTER SV-4): the client sets its device half's target to them and drains only the receipts of this application (or *) and this server (or none).

Calls are remote events, each direction with its own sequence, repeated as literals with a comment in iz/PushChannelProps.js: server to client REMOTE_QUERY_STATE, REMOTE_SUBSCRIBE (P4-07), REMOTE_UNSUBSCRIBE and REMOTE_RESET (P4-08), REMOTE_DELIVER (the in-session tier, P4-10); client to server REMOTE_REPLY, REMOTE_ACTION_RESULT (the subscribe action, P4-09), REMOTE_SHOWN and REMOTE_CLICKED (the receipts, P4-11). Every switch is on getLocalID(): a remote event's getEventID() is always GEvent.REMOTE (RR-22, design 2.3). A server-bound request carries the request id P_REQUEST and is answered by a REPLY carrying it back with P_OK and the result members, or P_REASON (design 3.4, 3.5). A DELIVER carries the notification as P_NOTIFICATION and nothing replies: the client shows it, on its Service Worker registration where it has one so that it looks and reports like a device push, else with the in-app toaster (design 9.1, RR-14a).

Receipts (design 7, P4-11): the client reports SHOWN for a notification it displayed and CLICKED for a click on one or on one of its actions, each carrying P_MESSAGE (the server's message ID), P_APP_ID, P_TOPIC, P_SENT and P_TIME (the device's clock), and P_SERVER when the device recorded the push server ID (SV-4), a click also P_ACTION. They arrive on the connection's thread and go to the PushChannelProps.IReceiptListener the server set at session creation (setReceiptListener(PushChannelProps.IReceiptListener)), which builds the receipt as the session's user and hands it to the engine's events for every listening session of that user and application, with the duplicates of design 7.4 dropped there. A report with no message ID, or on a channel without a listener, is logged at INFO and dropped.

The subscribe action (design 8.2-8.4, P4-09, RR-6 B, RR-7 A): the server writes the configured actions into ACT through setAction(String, String, PushChannelProps.IReplyListener) - one entry per component, its atom path from the root and the Topic, keyed by an action id from a per-channel counter - and keeps each action's listener here. The client looks a clicked UIButton up in act inside the DOM click, subscribes the device there, and reports REMOTE_ACTION_RESULT once per click; onRemoteEvent(RemoteEvent) hands it to the action's listener on the connection's thread, or, for an action removed meanwhile, to the listener of setOrphanActionListener(PushChannelProps.IReplyListener), so that a subscription the device now holds is still stored (design 8.4).

Correlation and deadlines (RR-18 A, RR-11 A): a table of pending requests keyed by the id, from a per-channel counter never reused; several may be pending at once and the client answers in arrival order. Every request has a deadline; at the deadline the entry is removed and the listener gets timeout. A reply with an unknown id - late, or a second answer - is logged at INFO and dropped (design 6.1, 6.3). At disposal every pending entry is logged at INFO as not completed and dropped (design 6.2).

Threads. A reply arrives on the connection's thread and a deadline on the timer's: the PushChannelProps.IReplyListener is called there, at once, and it is the caller's - the session API's - to post the outcome to the session's worker (design 5). Nothing here posts.

Author:
Christopher Mindus
  • Field Details

    • ATOM_NAME

      public static final String ATOM_NAME
      The atom name of the channel under $env: "PushChannel", named by its class as Flash and NativeSetting are.
      See Also:
    • ATOM

      public static final Atom ATOM
      The atom of the channel under $env.
    • UUID

      public static final String UUID
      The "uuid" StringProp: the push UUID of the device (contract 2.5), written by the client; empty when none could be established.
      See Also:
    • TRANSPORT

      public static final String TRANSPORT
      The "transport" StringProp: the wire key of the transport the device is reached through, v or fc (PushTransport.wireKey); empty when the device cannot receive Push Notification. Written by the client.
      See Also:
    • PERM

      public static final String PERM
      The "perm" StringProp: the permission as the client last reported it, one of prompt, granted, denied or unsupported (the constants of PushPermission); a cached view, which is why queryDeviceState always round-trips.
      See Also:
    • KEY

      public static final String KEY
      The "key" StringProp: the application's VAPID public key, base64url, written by the server when the session is created; absent when the application has none.
      See Also:
    • SKEY

      public static final String SKEY
      The "skey" StringProp: the server's own * VAPID public key, base64url, written by the server with KEY; absent when the server has none. A Browser whose subscription was made under it - iiziRun's, inside iiziRun Developer - answers a SUBSCRIBE or a subscribe action's click with that subscription and P_VAPID_PUBLIC_KEY, and the server stores a row of this application signed with *'s pair (PUSH-CLUSTER-DESIGN 3.3, B-10b, RR-21 C); a subscription under any other key stays key_conflict.
      See Also:
    • AUTH

      public static final String AUTH
      The "auth" BoolProp: true once the application session has an authenticated user, written by the server at the channel's creation and again when the user is set later (an in-app sign-in, AppSessionGyro.changeExternallyAuthenticatedUser); absent before. The client drains its receipt queue only while it is true, and again when it turns true (design 7, R-10 A): a receipt reported to a session without a user would be dropped.
      See Also:
    • SERVER

      public static final String SERVER
      The "server" StringProp: the push server ID (PUSH-WIRE-CONTRACT 6.2, data.iizi.server), written by the server when the session is created while its engine runs; absent otherwise (CC-DESIGN-PUSH-APPID-FILTER SV-4). The client narrows its device half's target to it and keeps in the device's queue the receipts that name another server.
      See Also:
    • APP

      public static final String APP
      The "app" StringProp: the session's canonical application ID - the one data.iizi.app_id names, never an alias the client was started with - written with SERVER (SV-4).
      See Also:
    • ACT

      public static final String ACT
      The "act" PropCnr: the configured subscribe actions (P4-09, design 8.2), written by the server through setAction(String, String, PushChannelProps.IReplyListener): one child container per action, named a and the action id, carrying P_PATH - the component's atom path from the root joined with /, the addressing remote events use (RR-7 A) - and P_TOPIC. The client looks a clicked UIButton up here, inside the DOM click. Absent until the first action is configured.
      See Also:
    • ACT_ATOM

      public static final Atom ACT_ATOM
      The atom of ACT.
    • REMOTE_QUERY_STATE

      public static final int REMOTE_QUERY_STATE
      Server to client 1: QUERY_STATE, with P_REQUEST; answered by REMOTE_REPLY with P_PERM, P_TRANSPORT and P_SUBSCRIBED.
      See Also:
    • REMOTE_SUBSCRIBE

      public static final int REMOTE_SUBSCRIBE
      Server to client 2: SUBSCRIBE, with P_REQUEST and P_TOPIC (P4-07, design 8.5): the client subscribes the device for this application and answers REMOTE_REPLY with P_VAPID_SUBSCRIPTION (a Browser, with P_VAPID_PUBLIC_KEY when the subscription was made under SKEY) or P_FCM_TOKEN (Cordova, with P_FCM_PROJECT when it knows its Firebase project) and P_USER_AGENT, or with P_REASON: permission_denied, gesture_required (a Browser whose permission is not yet granted, or whose pushManager refused outside a click), key_conflict (a Browser subscribed under another VAPID key than KEY or SKEY, never replaced), not_configured (the server wrote no KEY), unsupported or internal.
      See Also:
    • REMOTE_UNSUBSCRIBE

      public static final int REMOTE_UNSUBSCRIBE
      Server to client 3: UNSUBSCRIBE, with P_REQUEST, P_TOPIC and P_DROP (P4-08, design 4.2): the server has already removed the row, and tells the device whether any row of this application remains for it; when none does, a Browser gives up the push subscription it holds under this application's key - one under another key is not this application's and stays - while a Cordova device keeps its FCM token, which every application on the device shares. Answered by REMOTE_REPLY with P_DROPPED.
      See Also:
    • REMOTE_RESET

      public static final int REMOTE_RESET
      Server to client 4: RESET, with P_REQUEST, P_DROP and P_ALL (P4-08): the server has removed the session user's rows on this device - of this application only (resetDevice, RR-15 B), or of every application (resetDeviceEverywhere, P4-b, the HTTP reset {}) - and the device drops as for an UNSUBSCRIBE: with P_ALL a Browser gives up its subscription whatever key it was made under. Answered by REMOTE_REPLY with P_DROPPED.
      See Also:
    • REMOTE_DELIVER

      public static final int REMOTE_DELIVER
      Server to client 5: DELIVER, the notification object of the in-session tier as P_NOTIFICATION; nothing replies (P4-10, design 9.1). Sent by deliver(String).
      See Also:
    • REMOTE_REPLY

      public static final int REMOTE_REPLY
      Client to server 1: REPLY, with P_REQUEST, P_OK, then the result members or P_REASON.
      See Also:
    • REMOTE_ACTION_RESULT

      public static final int REMOTE_ACTION_RESULT
      Client to server 2: ACTION_RESULT, the outcome of one click on a configured subscribe action (P4-09, design 8.3, 8.4), with P_ACTION_ID, P_OK, P_TOPIC (the action's, echoed so that a subscription made after the action was removed is still stored) and then, as a SUBSCRIBE reply carries them, P_VAPID_SUBSCRIPTION (with P_VAPID_PUBLIC_KEY) or P_FCM_TOKEN (with P_FCM_PROJECT) and P_USER_AGENT, or P_REASON: permission_denied, dismissed (the prompt closed without an answer), key_conflict, not_configured, unsupported, gesture_required, internal or no_user (the session has no authenticated user, AUTH false: answered at once, before any prompt, CC-FIX-PWA-FOLLOWUPS PWA-D-6). Not a reply: each click is a new result and the action's listener is called once per click (design 6.3, 8.4).
      See Also:
    • REMOTE_SHOWN

      public static final int REMOTE_SHOWN
      Client to server 3: SHOWN, a notification was shown on the device, with P_MESSAGE, P_APP_ID, P_TOPIC, P_SENT and P_TIME (P4-11, design 7).
      See Also:
    • REMOTE_CLICKED

      public static final int REMOTE_CLICKED
      Client to server 4: CLICKED, a notification or one of its actions was clicked, with the members of REMOTE_SHOWN and P_ACTION (P4-11, design 7).
      See Also:
    • P_REQUEST

      public static final String P_REQUEST
      The request id member "r": an int from the per-channel counter, on every server-bound request and its reply.
      See Also:
    • P_OK

      public static final String P_OK
      The reply's success member "ok": a boolean.
      See Also:
    • P_REASON

      public static final String P_REASON
      The reply's reason member "reason" on a failure: a reason code of PushNotificationException.
      See Also:
    • P_PERM

      public static final String P_PERM
      The reply's permission member "perm": as PERM.
      See Also:
    • P_TRANSPORT

      public static final String P_TRANSPORT
      The reply's transport member "transport": as TRANSPORT.
      See Also:
    • P_SUBSCRIBED

      public static final String P_SUBSCRIBED
      The reply's subscribed member "subscribed": a boolean, the device holds a subscription under this application's key, or an FCM token.
      See Also:
    • P_VAPID_SUBSCRIPTION

      public static final String P_VAPID_SUBSCRIPTION
      The SUBSCRIBE reply member "vapid_subscription": the Browser's push subscription exactly as PushSubscription.toJSON() emits it (endpoint, keys.p256dh, keys.auth), as one JSON text - the subscription of PUSH-WIRE-CONTRACT section 5.2, stored verbatim and never sent back to a client (P4-07).
      See Also:
    • P_VAPID_PUBLIC_KEY

      public static final String P_VAPID_PUBLIC_KEY
      The SUBSCRIBE reply member "vapid_public_key": the VAPID public key, base64url, the Browser's subscription in P_VAPID_SUBSCRIPTION was made under, when that is not KEY but SKEY - the server's own * key, a Browser inside iiziRun Developer. The server stores the row under it, to be signed with *'s pair, when it is the server's own key or the application's, and refuses any other key_conflict (PUSH-CLUSTER-DESIGN 3.3, B-10b, RR-21 C). Absent, the row is the key the server wrote into KEY. The member name is the HTTP subscribe's (PUSH-WIRE-CONTRACT 5.2).
      See Also:
    • P_FCM_TOKEN

      public static final String P_FCM_TOKEN
      The SUBSCRIBE reply member "fcm_token": the FCM registration token of a Cordova device, a non-empty string (P4-07).
      See Also:
    • P_FCM_PROJECT

      public static final String P_FCM_PROJECT
      The SUBSCRIBE reply member "fcm_project": the Firebase project ID the device's FCM token belongs to, as iiziRun's build wrote it into setup.js from the app's own google-services.json or GoogleService-Info.plist (izRun.FCM_PROJECT for the device's platform, CC-FIX-PUSHDEV-PROJECT); absent when the device cannot tell. The server stores an FCM row of the application's own project, and of the server's own * project - a device built as iiziRun Developer - recording that project so the row is signed with *'s credentials (PUSH-CLUSTER-DESIGN 3.3, B-10b, RR-21 C); it refuses any other key_conflict. A device that names none is checked with FCM (validate_only, CC-PUSHDEV-VALIDATE-ONLY).
      See Also:
    • P_USER_AGENT

      public static final String P_USER_AGENT
      The SUBSCRIBE reply member "user_agent": the user agent the device reports, stored with the row as the HTTP subscribe stores the request's (P4-07).
      See Also:
    • P_DROP

      public static final String P_DROP
      The UNSUBSCRIBE and RESET member "drop": a boolean, true when the server holds no further row of this application for this device, so that the device may give up its subscription (design 4.2, P4-08).
      See Also:
    • P_ALL

      public static final String P_ALL
      The RESET member "all": a boolean, true for resetDeviceEverywhere - every application's rows of the user on this device are gone, and a Browser gives up its subscription whatever key it was made under (P4-b, P4-08); false for resetDevice, this application only (RR-15 B).
      See Also:
    • P_DROPPED

      public static final String P_DROPPED
      The UNSUBSCRIBE and RESET reply member "dropped": a boolean, whether the device gave up a subscription; for the log only (P4-08).
      See Also:
    • P_NOTIFICATION

      public static final String P_NOTIFICATION
      The DELIVER member "n": the notification object as the Web Push leg carries it (PUSH-WIRE-CONTRACT section 6.1, title beside the options, with the server's four members under data.iizi; never the FCM copy), as one JSON text.
      See Also:
    • P_MESSAGE

      public static final String P_MESSAGE
      The receipt member "message": the message ID the server assigned, data.iizi.message of the notification (PUSH-WIRE-CONTRACT section 6.2); a string.
      See Also:
    • P_APP_ID

      public static final String P_APP_ID
      The receipt member "app_id": the application ID of the notification, data.iizi.app_id; a string.
      See Also:
    • P_TOPIC

      public static final String P_TOPIC
      The receipt member "topic": the Topic of the notification, data.iizi.topic; a string, empty for the application level. Also the Topic of a SUBSCRIBE (P4-07) or an UNSUBSCRIBE (P4-08) request.
      See Also:
    • P_SENT

      public static final String P_SENT
      The receipt member "sent": when the server sent the notification, data.iizi.sent; a long, epoch milliseconds.
      See Also:
    • P_TIME

      public static final String P_TIME
      The receipt member "time": when the device recorded the event, by its own clock; a long, epoch milliseconds.
      See Also:
    • P_SERVER

      public static final String P_SERVER
      The receipt member "server": the push server ID of the notification, data.iizi.server; a string, absent or empty when the device recorded none (a server, device half or Service Worker from before O-4a). A receipt naming another server is dropped by the engine (SV-5).
      See Also:
    • P_ACTION

      public static final String P_ACTION
      The CLICKED member "action": the actions[].action identity clicked, empty for a click on the notification itself; a string.
      See Also:
    • P_ACTION_ID

      public static final String P_ACTION_ID
      The ACTION_RESULT member "action_id": the id of the subscribe action clicked, as setAction(String, String, PushChannelProps.IReplyListener) allocated it; an int (P4-09).
      See Also:
    • P_PATH

      public static final String P_PATH
      The ACT entry member "path": the component's atom path from the root, joined with /; a string (P4-09).
      See Also:
  • Constructor Details

    • PushChannelProps

      public PushChannelProps()
      Creates the channel without a name.
    • PushChannelProps

      public PushChannelProps(Atom atom)
      Creates the channel with a name.
      Parameters:
      atom - The atom name, normally ATOM.
  • Method Details

    • clone

      public PushChannelProps clone()
      Clones the channel: the pending table and the action table are not cloned.
      Overrides:
      clone in class PropCnr
    • shouldSerializeToXML

      protected boolean shouldSerializeToXML(int programType)
      The channel is never written to XML.
      Overrides:
      shouldSerializeToXML in class GProp<GProp<?>[]>
      Parameters:
      programType - From PropFactory.getProgramType().
      Returns:
      false.
    • of

      public static PushChannelProps of(EnvProps env)
      Finds the channel of a session.
      Parameters:
      env - The session's environment properties, or null.
      Returns:
      The channel the client created under $env, or null when the session has none: a Designer, Design Viewer or VSViewer session, or a client built before P4.
    • getDeviceUUID

      public String getDeviceUUID()
      Gets the push UUID the client reported.
      Returns:
      The UUID, or null when the client reported none or an empty one.
    • getTransport

      public PushTransport getTransport()
      Gets the transport the client reported.
      Returns:
      The transport, or null when the device cannot receive Push Notification or the client reported nothing.
    • getPermission

      public PushPermission getPermission()
      Gets the permission the client last reported: a cached view.
      Returns:
      The permission, PushPermission.UNSUPPORTED when nothing was reported.
    • toPermission

      public static PushPermission toPermission(String perm)
      Maps a permission as the client reports it to the constant.
      Parameters:
      perm - prompt or the Browser's default, granted, denied, unsupported, or null.
      Returns:
      The permission, PushPermission.UNSUPPORTED for null or an unknown value.
    • setPublicKey

      public boolean setPublicKey(String key)
      Sets the application's VAPID public key for the client, the server's one write.
      Parameters:
      key - The base64url public key, or null to remove it.
      Returns:
      true if changed.
    • getPublicKey

      public String getPublicKey()
      Gets the application's VAPID public key the server wrote.
      Returns:
      The key, or null.
    • setServerPublicKey

      public boolean setServerPublicKey(String key)
      Sets the server's own * VAPID public key for the client (B-10b, RR-21 C), written with the application's.
      Parameters:
      key - The base64url public key, or null to remove it.
      Returns:
      true if changed.
    • getServerPublicKey

      public String getServerPublicKey()
      Gets the server's own * VAPID public key the server wrote.
      Returns:
      The key, or null.
    • setAuthenticated

      public boolean setAuthenticated(boolean authenticated)
      Sets whether the application session has an authenticated user, the server's write that lets the client drain its receipts (R-10 A).
      Parameters:
      authenticated - true once the session has an authenticated user.
      Returns:
      true if changed.
    • isAuthenticated

      public boolean isAuthenticated()
      Gets whether the server has written that the application session has an authenticated user.
      Returns:
      true when written true; false when absent or false.
    • setServer

      public boolean setServer(String serverId, String appID)
      Sets the push server ID and the session's canonical application ID for the client (SV-4), the application first, so that the client knows both once the server ID arrives.
      Parameters:
      serverId - The push server ID, PushEngine.getServerId(); null writes nothing.
      appID - The canonical application ID of the session.
      Returns:
      true if either changed.
    • getServer

      public String getServer()
      Gets the push server ID the server wrote.
      Returns:
      The ID, or null.
    • getApp

      public String getApp()
      Gets the canonical application ID the server wrote with the push server ID.
      Returns:
      The ID, or null.
    • setTimerEngine

      public void setTimerEngine(ITimerEngine engine)
      Sets the timer engine the deadlines are registered with, e.g. the client session's.
      Parameters:
      engine - The engine, or null for the system's.
    • setReceiptListener

      public void setReceiptListener(PushChannelProps.IReceiptListener listener)
      Sets the listener of the receipts the client reports (P4-11), the server's one at session creation; without one every report is logged at INFO and dropped.
      Parameters:
      listener - The listener, or null for none.
    • getPendingCount

      public int getPendingCount()
      Gets the number of requests waiting for the client, for diagnostics and tests.
      Returns:
      The count.
    • request

      public int request(int localID, String operation, PropCnr params, long deadlineMillis, PushChannelProps.IReplyListener listener)
      Sends a request to the client and registers its outcome listener and deadline.
      Parameters:
      localID - The server-to-client event, e.g. REMOTE_QUERY_STATE.
      operation - The operation, e.g. queryDeviceState, for the log lines.
      params - The parameters, or null for none but the request id, which is added.
      deadlineMillis - The deadline in milliseconds from now (RR-11 A: 30 s, 5 min for a subscribe).
      listener - The outcome listener, called once.
      Returns:
      The request id.
      Throws:
      IllegalStateException - If the channel is disposed of.
      NullPointerException - If operation or listener is null.
    • deliver

      public boolean deliver(String notification)
      Delivers a notification in-session, down this channel (the in-session tier, P4-10, design 9.1): triggers REMOTE_DELIVER with the notification as P_NOTIFICATION. Nothing replies; the client shows it and, from P4-11 on, reports SHOWN. Called on the engine's thread; the flush to the client is posted to the session's worker by the property chain, as for every change under the root.
      Parameters:
      notification - The notification object as the Web Push leg carries it (contract 6.1, with data.iizi), as JSON text.
      Returns:
      true when sent, false when the channel is disposed of.
      Throws:
      NullPointerException - If notification is null.
    • setAction

      public int setAction(String path, String topic, PushChannelProps.IReplyListener listener)
      Configures the subscribe action of a component (design 8.2): writes the entry into ACT, replacing the entry of the same path, and keeps the listener. The client runs the action inside the component's DOM click and reports each outcome as REMOTE_ACTION_RESULT, which reaches the listener once per click. Called on the session's worker, as every property write by application code is.
      Parameters:
      path - The component's atom path from the root, joined with /.
      topic - The Topic, the empty string for the application-level subscription.
      listener - The listener of each click's outcome, called on the connection's thread.
      Returns:
      The action id.
      Throws:
      IllegalStateException - If the channel is disposed of.
      NullPointerException - If a parameter is null.
    • removeAction

      public boolean removeAction(String path)
      Removes the subscribe action of a component (design 8.2): a no-op when it has none. A click result that arrives after the removal goes to the orphan listener.
      Parameters:
      path - The component's atom path from the root, joined with /.
      Returns:
      true if an action was removed.
    • getActions

      public List<PushChannelProps.Action> getActions()
      Gets the configured subscribe actions, for diagnostics and tests.
      Returns:
      The actions, in no particular order.
    • getAction

      public PushChannelProps.Action getAction(String path)
      Gets a configured subscribe action by its component path.
      Parameters:
      path - The component's atom path from the root, joined with /.
      Returns:
      The action, or null when the component has none.
    • setOrphanActionListener

      public void setOrphanActionListener(PushChannelProps.IReplyListener listener)
      Sets the listener of a successful ACTION_RESULT whose action was removed meanwhile (design 8.4): the device now holds the subscription, and a row nobody stores is a device the server cannot reach, so the server's listener stores it anyway - the Topic is the result's. A failed result of a removed action is logged at INFO and dropped.
      Parameters:
      listener - The listener, called on the connection's thread with the result's parameters and no failure; null for none.
    • onRemoteEvent

      public void onRemoteEvent(RemoteEvent event)
      Called when a remote property event should be processed by this property: a REMOTE_REPLY completes its pending request, a REMOTE_ACTION_RESULT goes to its action's listener, a REMOTE_SHOWN or REMOTE_CLICKED goes to the receipt listener. Switches on getLocalID(), never on getEventID() (RR-22).
      Specified by:
      onRemoteEvent in interface IGProp<GProp<?>[]>
      Overrides:
      onRemoteEvent in class GProp<GProp<?>[]>
      Parameters:
      event - The remote event.
    • onPropDispose

      protected void onPropDispose()
      Called when the channel is disposed of, with its root: every pending request is logged at INFO as not completed and dropped; the listener is not called (design 6.2). The configured subscribe actions go with the screen they belonged to.
      Overrides:
      onPropDispose in class PropCnr