-
Notifications
You must be signed in to change notification settings - Fork 435
Invite a friend: referral attribution across the analytics stack #5751
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
shai-almog
wants to merge
100
commits into
master
Choose a base branch
from
invite-attribution
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
100 commits
Select commit
Hold shift + click to select a range
e2b4b11
Invite attribution: core client API, catalog entry and package guard
shai-almog 1a5055e
Invite attribution: tests, and the analysis gates they have to pass
shai-almog 5b44d6b
Invite attribution: declare the build hints the link plumbing will read
shai-almog 8f64c92
Invite attribution: make an invite link open the app, on both platforms
shai-almog 76b058b
Invite attribution: read the Play Install Referrer, and drop a floor …
shai-almog 95e69cb
Invite attribution: document it in the developer guide
shai-almog 63b514b
Invite attribution: simulate the deferred path without a device
shai-almog 5c6d14f
Android: deliver a link that reaches a running activity to the router
shai-almog 47a8945
Invite attribution: address the review, and clear the PMD gate
shai-almog 3c43f5c
Invite attribution: second review round, and a domain the client neve…
shai-almog e63dfed
Invite attribution: third review round on the client
shai-almog bfe5429
Invites: six ways attribution used to be lost quietly
shai-almog 5610439
Invites: four more ways a terminal answer was reached too early
shai-almog 57fc4c3
Invites: a direct link now wins, and a pending answer is not a termin…
shai-almog 43b57ce
Android port: exclude the referrer package from the Ant build too
shai-almog 5a71e81
Invites: six answers that reached nobody, or reached the wrong conclu…
shai-almog 37706e6
Invites: an erasure that does not depend on who is registered
shai-almog 81c7aa8
Invites: five consequences of the last two rounds
shai-almog 1546075
Invites: re-attribution no longer contradicts the answer it already gave
shai-almog 7a767ca
Invites: three more that the last two rounds' fixes opened
shai-almog abfb082
Invites: provenance, abandonment, and a fragment that became part of …
shai-almog cdb508d
Invites: a direct link is its own question, and a reopened one keeps …
shai-almog 8bfb8eb
Invites: four places the state machine forgot what it already knew
shai-almog 9dbd595
Invites: the window bounds the guess, not the answer
shai-almog 8e45b87
Invites: one delivery is not one url, and a failed write is not a res…
shai-almog 9324a40
Invites: consuming the argument, and three restarts that should not h…
shai-almog e7c14df
Invites: an erasure has to reach the durable records, not just the di…
shai-almog b3667c2
Invites: the reopened marker is converted, not rebuilt
shai-almog abb2a1b
Invites: three more places a write's result was assumed
shai-almog 883f9aa
Invites: reopen with a usable window and a real device profile
shai-almog 242bad2
Invites: a failed pending write no longer loses what it was writing
shai-almog 1dcfc6b
Invites: two ways a registration said yes when the answer was no
shai-almog 9fe42d0
Invites: reconcile the cached state when a held record finally lands
shai-almog 3c16d23
Invites: getState() never answers from a cache the record contradicts
shai-almog 2afe6d2
Invites: four review findings, one of them a design decision reversed
shai-almog 3b1d4c0
Invites: an erasure that lasts, a kill switch that reaches the wire
shai-almog 0d0e067
Invites: the kill switch is about the guess, not about being deferred
shai-almog 7c75853
Invites: an erasure that survives a failed write, and three smaller h…
shai-almog e629d9e
Invites: an erasure that is checked, and an answer that can arrive to…
shai-almog 3330a86
Invites: the erasure has to take the outbox, and a refusal has to settle
shai-almog 25dffdd
Invites: App Clips replace the statistical match on iOS
shai-almog 018119b
Invites: five holes the App Clip path and the erasure left open
shai-almog 3ef1b8c
Invites: the App Clip is generated now, not just entitled
shai-almog 0132106
Invites: a transient store failure is not an answer, and the clip is …
shai-almog e18bff5
Invites: the retry could not deliver, and the app group was comma-joined
shai-almog d238328
Invites: a reset that could not finish, and a tap time nobody kept
shai-almog b935910
Analytics: an erasure that never reached the disk came back a launch …
shai-almog 51173b4
Analytics: the header gate covers a file I modified
shai-almog e2d3dc6
Invites: the write check I added checked nothing, and two iOS build t…
shai-almog 6d7a38f
Invites: a deletion tombstone read as pending, and a false privacy claim
shai-almog fb39ecf
Invites: a settled claim whose record refused to go was asked again
shai-almog 7066438
Invites: the App Clip embed named the target, not the product
shai-almog 4e39d4f
Invites: a burst of mints resent the whole queue, and a hint too much
shai-almog 23ef7ab
Invites: three erasures that reported success and left something behind
shai-almog cd49ddd
Invites: an app with no invites would not have linked
shai-almog a4fb342
Invites: the generated App Clip had no icon, so the archive could not…
shai-almog 801bfed
Invites: a tap time the refusal dropped, and a budget charged twice
shai-almog aa67da3
Invites: an erasure that died with the process, and a mark nothing re…
shai-almog c67db7d
Invites: warm deep links keep their intent, and an upgrade keeps its …
shai-almog b19ff95
Invites: a "not yet" answer is asked again in the same process
shai-almog 44b972c
Invites: the durable attribution is the authority for its dimensions too
shai-almog fde7e27
Invites: an erasure reaches the registration already on the wire
shai-almog eb21b8b
Invites: one save for the dimensions, and a bounded set of queued reg…
shai-almog 1802b96
Invites: the App Clip was never built on the default path, and four more
shai-almog 4c3c0ba
Invites: consent withdrawal cancels what is already queued
shai-almog 8675993
Invites: a queued claim is an erasure's problem too, and codes are co…
shai-almog 3c2be9e
Invites: why the App Clip overlay takes no app identifier
shai-almog b57d51e
Invites: the restored-install detection clears its flag in one save
shai-almog 385750c
Invites: an unanswered prompt stops the queue without settling anything
shai-almog 820a655
Invites: the App Links filter and the minted url agree about the slug
shai-almog 046511d
Invites: the clip keeps its code until the framework has one that sur…
shai-almog 8219b71
Invites: a double tap on the invite button minted two codes
shai-almog 869e508
Invites: getInvite() went null exactly when the app needed it
shai-almog 7aa520a
Invites: a second press shared twice, and a retried write told nobody
shai-almog 937bdda
Invites: a killed lookup still looked outstanding, and a cleared hand…
shai-almog 7781cc3
Invites: the code now proves who minted it, and forgetting reaches th…
shai-almog 7aff67e
Invites: the share guard would have killed the button on Android
shai-almog 8985e5b
Invites: bound what reaches the outbox, and document what was promised
shai-almog 5b4d745
Invites: an erasure that could not empty the clip reported success
shai-almog ca0d989
Invites: the App Clip handoff docs failed the developer guide prose gate
shai-almog 42ddf86
Invites: the erasure check I added proved nothing, and a useless answ…
shai-almog ee083dd
Invites: a handoff-only erasure failure latched nothing
shai-almog 3a53d48
Invites: a foreign link could claim the install, and Play's one shot …
shai-almog d80a4bd
Invites: the simulator's referrer source broke the build
shai-almog 2cda78a
Invites: a failed acknowledgement was treated as done
shai-almog 5d0e166
Invites: the proof had a fallback that made it forgeable
shai-almog 81743c8
Invites: an app group list could end up mixing its delimiters
shai-almog 13c4a83
Invites: a routed link was handled twice, and a link base could be un…
shai-almog d597eec
Invites: consuming the argument too early could lose a tapped invite
shai-almog 05fa40d
Invites: a domain hint written as a URL reached the platform metadata…
shai-almog 08fd5e5
Invites: two fixes that were applied to instances instead of to the c…
shai-almog 419fd80
Invites: forgetting has to reach the Play referrer too
shai-almog 9c1a9e4
Invites: the registration carries the time the device minted the code
shai-almog ffce0c8
Install the erasure hook at source registration, and stop leaking a r…
shai-almog 22fcf2d
Clear the owed-erasure marker on a successful reset, and claim a rout…
shai-almog caafc53
Restore AndroidImplementation's CRLF line endings
shai-almog 271f17b
Merge master into invite-attribution
shai-almog 20ba08c
Do not learn a slug from a link, require the code to look like one, a…
shai-almog c30f5a9
Validate query-borne codes as well, and mint afresh when the request …
shai-almog 0e7d89e
Give each chooser its own PendingIntent, and make the share token ung…
shai-almog File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
47 changes: 47 additions & 0 deletions
47
CodenameOne/src/com/codename1/analytics/invite/AppClipHandoffCallback.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,47 @@ | ||
| /* | ||
| * Copyright (c) 2026, Codename One and/or its affiliates. All rights reserved. | ||
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | ||
| * This code is free software; you can redistribute it and/or modify it | ||
| * under the terms of the GNU General Public License version 2 only, as | ||
| * published by the Free Software Foundation. Codename One designates this | ||
| * particular file as subject to the "Classpath" exception as provided | ||
| * by Oracle in the LICENSE file that accompanied this code. | ||
| * | ||
| * This code is distributed in the hope that it will be useful, but WITHOUT | ||
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
| * version 2 for more details (a copy is included in the LICENSE file that | ||
| * accompanied this code). | ||
| * | ||
| * You should have received a copy of the GNU General Public License version | ||
| * 2 along with this work; if not, write to the Free Software Foundation, | ||
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | ||
| * | ||
| * Please contact Codename One through http://www.codenameone.com/ if you | ||
| * need additional information or have any questions. | ||
| */ | ||
| package com.codename1.analytics.invite; | ||
|
|
||
| /// Receives the answer to [AppClipHandoffSource#requestHandoff]. | ||
| /// | ||
| /// Exactly one method is called, once. | ||
| public interface AppClipHandoffCallback { | ||
| /// Called with the invite code an App Clip recorded. | ||
| /// | ||
| /// #### Parameters | ||
| /// | ||
| /// - `code`: the invite code the clip received, never empty | ||
| /// | ||
| /// - `clickedSeconds`: when the link was tapped, in seconds since the | ||
| /// epoch, or 0 when the clip did not record it | ||
| void onHandoff(String code, long clickedSeconds); | ||
|
|
||
| /// Called when no clip handoff exists. This is the normal answer for | ||
| /// somebody who installed the application without ever tapping an invite | ||
| /// link, and is not an error. | ||
| /// | ||
| /// #### Parameters | ||
| /// | ||
| /// - `reason`: one of the `REASON_` constants on [Invites] | ||
| void onUnavailable(String reason); | ||
| } |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.