Skip to content

fix(nfc): suppress OS NFC dispatch chooser during HCE sharing - #3

Draft
duhow with Copilot wants to merge 3 commits into
mainfrom
copilot/emulate-ndef-tag-2-compatibility
Draft

fix(nfc): suppress OS NFC dispatch chooser during HCE sharing#3
duhow with Copilot wants to merge 3 commits into
mainfrom
copilot/emulate-ndef-tag-2-compatibility

Conversation

CopilotAI commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

When tapping to share via HCE, the sharing phone was simultaneously acting as an NFC reader — triggering an OS app-chooser dialog that blocked the share flow.

Root cause

enableForegroundDispatch(…, null, null) only intercepts the ACTION_TAG_DISCOVERED fallback tier. Any NFC-capable Android phone carries NDEF data, so Android evaluates ACTION_NDEF_DISCOVERED first — which the null filters left unguarded — and dispatched it to all installed apps that handle that MIME type, producing a chooser.

Fix

Pass explicit IntentFilter arrays to enableForegroundDispatch covering all three dispatch tiers:

privatefunbuildDispatchFilters(): Array<IntentFilter> {
val ndefFilter =IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply {
try { addDataType("*/*") } catch (_:IntentFilter.MalformedMimeTypeException) {}
}
return arrayOf(
ndefFilter, // tier 1: any NDEF contentIntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED), // tier 2: tech-routed tagsIntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED), // tier 3: catch-all
)
}

All three tiers now route to ShareActivity.onNewIntent where they are silently discarded. enableForegroundDispatch is intentionally used over enableReaderMode, which per Android docs disables HCE/CE routing for its entire active duration.

CopilotAI changed the title fix(nfc): remove enableReaderMode that blocks HCE phone-to-phone sharingfix(nfc): remove enableReaderMode that breaks HCE phone-to-phone sharingJul 5, 2026
CopilotAI requested a review from duhowJuly 5, 2026 12:04
CopilotAI changed the title fix(nfc): remove enableReaderMode that breaks HCE phone-to-phone sharingfix(nfc): suppress NFC tag dispatch while HCE is active to stop phone acting as readerJul 5, 2026
CopilotAI changed the title fix(nfc): suppress NFC tag dispatch while HCE is active to stop phone acting as readerfix(nfc): suppress OS NFC dispatch chooser during HCE sharingJul 5, 2026
@github-actions

Copy link
Copy Markdown

✅ Debug APK artifact is ready for commit b64c0b3 .
💾 Download APK artifact here.
Workflow run: https://github.com/duhow/openbeam/actions/runs/28740975196

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@duhow
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix(nfc): suppress OS NFC dispatch chooser during HCE sharing by Copilot · Pull Request #3 · duhow/openbeam · GitHub
Skip to content

fix(nfc): suppress OS NFC dispatch chooser during HCE sharing - #3

Draft
duhow with Copilot wants to merge 3 commits into
mainfrom
copilot/emulate-ndef-tag-2-compatibility
Draft

fix(nfc): suppress OS NFC dispatch chooser during HCE sharing#3
duhow with Copilot wants to merge 3 commits into
mainfrom
copilot/emulate-ndef-tag-2-compatibility

Conversation

CopilotAI commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

When tapping to share via HCE, the sharing phone was simultaneously acting as an NFC reader — triggering an OS app-chooser dialog that blocked the share flow.

Root cause

enableForegroundDispatch(…, null, null) only intercepts the ACTION_TAG_DISCOVERED fallback tier. Any NFC-capable Android phone carries NDEF data, so Android evaluates ACTION_NDEF_DISCOVERED first — which the null filters left unguarded — and dispatched it to all installed apps that handle that MIME type, producing a chooser.

Fix

Pass explicit IntentFilter arrays to enableForegroundDispatch covering all three dispatch tiers:

privatefunbuildDispatchFilters(): Array<IntentFilter> {
val ndefFilter =IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply {
try { addDataType("*/*") } catch (_:IntentFilter.MalformedMimeTypeException) {}
}
return arrayOf(
ndefFilter, // tier 1: any NDEF contentIntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED), // tier 2: tech-routed tagsIntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED), // tier 3: catch-all
)
}

All three tiers now route to ShareActivity.onNewIntent where they are silently discarded. enableForegroundDispatch is intentionally used over enableReaderMode, which per Android docs disables HCE/CE routing for its entire active duration.

CopilotAI changed the title fix(nfc): remove enableReaderMode that blocks HCE phone-to-phone sharingfix(nfc): remove enableReaderMode that breaks HCE phone-to-phone sharingJul 5, 2026
CopilotAI requested a review from duhowJuly 5, 2026 12:04
CopilotAI changed the title fix(nfc): remove enableReaderMode that breaks HCE phone-to-phone sharingfix(nfc): suppress NFC tag dispatch while HCE is active to stop phone acting as readerJul 5, 2026
CopilotAI changed the title fix(nfc): suppress NFC tag dispatch while HCE is active to stop phone acting as readerfix(nfc): suppress OS NFC dispatch chooser during HCE sharingJul 5, 2026
@github-actions

Copy link
Copy Markdown

✅ Debug APK artifact is ready for commit b64c0b3 .
💾 Download APK artifact here.
Workflow run: https://github.com/duhow/openbeam/actions/runs/28740975196

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@duhow
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(nfc): suppress OS NFC dispatch chooser during HCE sharing by Copilot · Pull Request #3 · duhow/openbeam · GitHub
Skip to content

fix(nfc): suppress OS NFC dispatch chooser during HCE sharing - #3

Draft
duhow with Copilot wants to merge 3 commits into
mainfrom
copilot/emulate-ndef-tag-2-compatibility
Draft

fix(nfc): suppress OS NFC dispatch chooser during HCE sharing#3
duhow with Copilot wants to merge 3 commits into
mainfrom
copilot/emulate-ndef-tag-2-compatibility

Conversation

CopilotAI commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

When tapping to share via HCE, the sharing phone was simultaneously acting as an NFC reader — triggering an OS app-chooser dialog that blocked the share flow.

Root cause

enableForegroundDispatch(…, null, null) only intercepts the ACTION_TAG_DISCOVERED fallback tier. Any NFC-capable Android phone carries NDEF data, so Android evaluates ACTION_NDEF_DISCOVERED first — which the null filters left unguarded — and dispatched it to all installed apps that handle that MIME type, producing a chooser.

Fix

Pass explicit IntentFilter arrays to enableForegroundDispatch covering all three dispatch tiers:

privatefunbuildDispatchFilters(): Array<IntentFilter> {
val ndefFilter =IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply {
try { addDataType("*/*") } catch (_:IntentFilter.MalformedMimeTypeException) {}
}
return arrayOf(
ndefFilter, // tier 1: any NDEF contentIntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED), // tier 2: tech-routed tagsIntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED), // tier 3: catch-all
)
}

All three tiers now route to ShareActivity.onNewIntent where they are silently discarded. enableForegroundDispatch is intentionally used over enableReaderMode, which per Android docs disables HCE/CE routing for its entire active duration.

CopilotAI changed the title fix(nfc): remove enableReaderMode that blocks HCE phone-to-phone sharingfix(nfc): remove enableReaderMode that breaks HCE phone-to-phone sharingJul 5, 2026
CopilotAI requested a review from duhowJuly 5, 2026 12:04
CopilotAI changed the title fix(nfc): remove enableReaderMode that breaks HCE phone-to-phone sharingfix(nfc): suppress NFC tag dispatch while HCE is active to stop phone acting as readerJul 5, 2026
CopilotAI changed the title fix(nfc): suppress NFC tag dispatch while HCE is active to stop phone acting as readerfix(nfc): suppress OS NFC dispatch chooser during HCE sharingJul 5, 2026
@github-actions

Copy link
Copy Markdown

✅ Debug APK artifact is ready for commit b64c0b3 .
💾 Download APK artifact here.
Workflow run: https://github.com/duhow/openbeam/actions/runs/28740975196

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@duhow
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(nfc): suppress OS NFC dispatch chooser during HCE sharing by Copilot · Pull Request #3 · duhow/openbeam · GitHub
Skip to content

fix(nfc): suppress OS NFC dispatch chooser during HCE sharing - #3

Draft
duhow with Copilot wants to merge 3 commits into
mainfrom
copilot/emulate-ndef-tag-2-compatibility
Draft

fix(nfc): suppress OS NFC dispatch chooser during HCE sharing#3
duhow with Copilot wants to merge 3 commits into
mainfrom
copilot/emulate-ndef-tag-2-compatibility

Conversation

CopilotAI commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

When tapping to share via HCE, the sharing phone was simultaneously acting as an NFC reader — triggering an OS app-chooser dialog that blocked the share flow.

Root cause

enableForegroundDispatch(…, null, null) only intercepts the ACTION_TAG_DISCOVERED fallback tier. Any NFC-capable Android phone carries NDEF data, so Android evaluates ACTION_NDEF_DISCOVERED first — which the null filters left unguarded — and dispatched it to all installed apps that handle that MIME type, producing a chooser.

Fix

Pass explicit IntentFilter arrays to enableForegroundDispatch covering all three dispatch tiers:

privatefunbuildDispatchFilters(): Array<IntentFilter> {
val ndefFilter =IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply {
try { addDataType("*/*") } catch (_:IntentFilter.MalformedMimeTypeException) {}
}
return arrayOf(
ndefFilter, // tier 1: any NDEF contentIntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED), // tier 2: tech-routed tagsIntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED), // tier 3: catch-all
)
}

All three tiers now route to ShareActivity.onNewIntent where they are silently discarded. enableForegroundDispatch is intentionally used over enableReaderMode, which per Android docs disables HCE/CE routing for its entire active duration.

CopilotAI changed the title fix(nfc): remove enableReaderMode that blocks HCE phone-to-phone sharingfix(nfc): remove enableReaderMode that breaks HCE phone-to-phone sharingJul 5, 2026
CopilotAI requested a review from duhowJuly 5, 2026 12:04
CopilotAI changed the title fix(nfc): remove enableReaderMode that breaks HCE phone-to-phone sharingfix(nfc): suppress NFC tag dispatch while HCE is active to stop phone acting as readerJul 5, 2026
CopilotAI changed the title fix(nfc): suppress NFC tag dispatch while HCE is active to stop phone acting as readerfix(nfc): suppress OS NFC dispatch chooser during HCE sharingJul 5, 2026
@github-actions

Copy link
Copy Markdown

✅ Debug APK artifact is ready for commit b64c0b3 .
💾 Download APK artifact here.
Workflow run: https://github.com/duhow/openbeam/actions/runs/28740975196

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@duhow
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' fix(nfc): suppress OS NFC dispatch chooser during HCE sharing by Copilot · Pull Request #3 · duhow/openbeam · GitHub
Skip to content

fix(nfc): suppress OS NFC dispatch chooser during HCE sharing - #3

Draft
duhow with Copilot wants to merge 3 commits into
mainfrom
copilot/emulate-ndef-tag-2-compatibility
Draft

fix(nfc): suppress OS NFC dispatch chooser during HCE sharing#3
duhow with Copilot wants to merge 3 commits into
mainfrom
copilot/emulate-ndef-tag-2-compatibility

Conversation

CopilotAI commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

When tapping to share via HCE, the sharing phone was simultaneously acting as an NFC reader — triggering an OS app-chooser dialog that blocked the share flow.

Root cause

enableForegroundDispatch(…, null, null) only intercepts the ACTION_TAG_DISCOVERED fallback tier. Any NFC-capable Android phone carries NDEF data, so Android evaluates ACTION_NDEF_DISCOVERED first — which the null filters left unguarded — and dispatched it to all installed apps that handle that MIME type, producing a chooser.

Fix

Pass explicit IntentFilter arrays to enableForegroundDispatch covering all three dispatch tiers:

privatefunbuildDispatchFilters(): Array<IntentFilter> {
val ndefFilter =IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply {
try { addDataType("*/*") } catch (_:IntentFilter.MalformedMimeTypeException) {}
}
return arrayOf(
ndefFilter, // tier 1: any NDEF contentIntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED), // tier 2: tech-routed tagsIntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED), // tier 3: catch-all
)
}

All three tiers now route to ShareActivity.onNewIntent where they are silently discarded. enableForegroundDispatch is intentionally used over enableReaderMode, which per Android docs disables HCE/CE routing for its entire active duration.

CopilotAI changed the title fix(nfc): remove enableReaderMode that blocks HCE phone-to-phone sharingfix(nfc): remove enableReaderMode that breaks HCE phone-to-phone sharingJul 5, 2026
CopilotAI requested a review from duhowJuly 5, 2026 12:04
CopilotAI changed the title fix(nfc): remove enableReaderMode that breaks HCE phone-to-phone sharingfix(nfc): suppress NFC tag dispatch while HCE is active to stop phone acting as readerJul 5, 2026
CopilotAI changed the title fix(nfc): suppress NFC tag dispatch while HCE is active to stop phone acting as readerfix(nfc): suppress OS NFC dispatch chooser during HCE sharingJul 5, 2026
@github-actions

Copy link
Copy Markdown

✅ Debug APK artifact is ready for commit b64c0b3 .
💾 Download APK artifact here.
Workflow run: https://github.com/duhow/openbeam/actions/runs/28740975196

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@duhow
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(nfc): suppress OS NFC dispatch chooser during HCE sharing by Copilot · Pull Request #3 · duhow/openbeam · GitHub
Skip to content

fix(nfc): suppress OS NFC dispatch chooser during HCE sharing - #3

Draft
duhow with Copilot wants to merge 3 commits into
mainfrom
copilot/emulate-ndef-tag-2-compatibility
Draft

fix(nfc): suppress OS NFC dispatch chooser during HCE sharing#3
duhow with Copilot wants to merge 3 commits into
mainfrom
copilot/emulate-ndef-tag-2-compatibility

Conversation

CopilotAI commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

When tapping to share via HCE, the sharing phone was simultaneously acting as an NFC reader — triggering an OS app-chooser dialog that blocked the share flow.

Root cause

enableForegroundDispatch(…, null, null) only intercepts the ACTION_TAG_DISCOVERED fallback tier. Any NFC-capable Android phone carries NDEF data, so Android evaluates ACTION_NDEF_DISCOVERED first — which the null filters left unguarded — and dispatched it to all installed apps that handle that MIME type, producing a chooser.

Fix

Pass explicit IntentFilter arrays to enableForegroundDispatch covering all three dispatch tiers:

privatefunbuildDispatchFilters(): Array<IntentFilter> {
val ndefFilter =IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply {
try { addDataType("*/*") } catch (_:IntentFilter.MalformedMimeTypeException) {}
}
return arrayOf(
ndefFilter, // tier 1: any NDEF contentIntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED), // tier 2: tech-routed tagsIntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED), // tier 3: catch-all
)
}

All three tiers now route to ShareActivity.onNewIntent where they are silently discarded. enableForegroundDispatch is intentionally used over enableReaderMode, which per Android docs disables HCE/CE routing for its entire active duration.

CopilotAI changed the title fix(nfc): remove enableReaderMode that blocks HCE phone-to-phone sharingfix(nfc): remove enableReaderMode that breaks HCE phone-to-phone sharingJul 5, 2026
CopilotAI requested a review from duhowJuly 5, 2026 12:04
CopilotAI changed the title fix(nfc): remove enableReaderMode that breaks HCE phone-to-phone sharingfix(nfc): suppress NFC tag dispatch while HCE is active to stop phone acting as readerJul 5, 2026
CopilotAI changed the title fix(nfc): suppress NFC tag dispatch while HCE is active to stop phone acting as readerfix(nfc): suppress OS NFC dispatch chooser during HCE sharingJul 5, 2026
@github-actions

Copy link
Copy Markdown

✅ Debug APK artifact is ready for commit b64c0b3 .
💾 Download APK artifact here.
Workflow run: https://github.com/duhow/openbeam/actions/runs/28740975196

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@duhow
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(nfc): suppress OS NFC dispatch chooser during HCE sharing by Copilot · Pull Request #3 · duhow/openbeam · GitHub
Skip to content

fix(nfc): suppress OS NFC dispatch chooser during HCE sharing - #3

Draft
duhow with Copilot wants to merge 3 commits into
mainfrom
copilot/emulate-ndef-tag-2-compatibility
Draft

fix(nfc): suppress OS NFC dispatch chooser during HCE sharing#3
duhow with Copilot wants to merge 3 commits into
mainfrom
copilot/emulate-ndef-tag-2-compatibility

Conversation

CopilotAI commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

When tapping to share via HCE, the sharing phone was simultaneously acting as an NFC reader — triggering an OS app-chooser dialog that blocked the share flow.

Root cause

enableForegroundDispatch(…, null, null) only intercepts the ACTION_TAG_DISCOVERED fallback tier. Any NFC-capable Android phone carries NDEF data, so Android evaluates ACTION_NDEF_DISCOVERED first — which the null filters left unguarded — and dispatched it to all installed apps that handle that MIME type, producing a chooser.

Fix

Pass explicit IntentFilter arrays to enableForegroundDispatch covering all three dispatch tiers:

privatefunbuildDispatchFilters(): Array<IntentFilter> {
val ndefFilter =IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply {
try { addDataType("*/*") } catch (_:IntentFilter.MalformedMimeTypeException) {}
}
return arrayOf(
ndefFilter, // tier 1: any NDEF contentIntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED), // tier 2: tech-routed tagsIntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED), // tier 3: catch-all
)
}

All three tiers now route to ShareActivity.onNewIntent where they are silently discarded. enableForegroundDispatch is intentionally used over enableReaderMode, which per Android docs disables HCE/CE routing for its entire active duration.

CopilotAI changed the title fix(nfc): remove enableReaderMode that blocks HCE phone-to-phone sharingfix(nfc): remove enableReaderMode that breaks HCE phone-to-phone sharingJul 5, 2026
CopilotAI requested a review from duhowJuly 5, 2026 12:04
CopilotAI changed the title fix(nfc): remove enableReaderMode that breaks HCE phone-to-phone sharingfix(nfc): suppress NFC tag dispatch while HCE is active to stop phone acting as readerJul 5, 2026
CopilotAI changed the title fix(nfc): suppress NFC tag dispatch while HCE is active to stop phone acting as readerfix(nfc): suppress OS NFC dispatch chooser during HCE sharingJul 5, 2026
@github-actions

Copy link
Copy Markdown

✅ Debug APK artifact is ready for commit b64c0b3 .
💾 Download APK artifact here.
Workflow run: https://github.com/duhow/openbeam/actions/runs/28740975196

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@duhow
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); fix(nfc): suppress OS NFC dispatch chooser during HCE sharing by Copilot · Pull Request #3 · duhow/openbeam · GitHub
Skip to content

fix(nfc): suppress OS NFC dispatch chooser during HCE sharing - #3

Draft
duhow with Copilot wants to merge 3 commits into
mainfrom
copilot/emulate-ndef-tag-2-compatibility
Draft

fix(nfc): suppress OS NFC dispatch chooser during HCE sharing#3
duhow with Copilot wants to merge 3 commits into
mainfrom
copilot/emulate-ndef-tag-2-compatibility

Conversation

CopilotAI commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

When tapping to share via HCE, the sharing phone was simultaneously acting as an NFC reader — triggering an OS app-chooser dialog that blocked the share flow.

Root cause

enableForegroundDispatch(…, null, null) only intercepts the ACTION_TAG_DISCOVERED fallback tier. Any NFC-capable Android phone carries NDEF data, so Android evaluates ACTION_NDEF_DISCOVERED first — which the null filters left unguarded — and dispatched it to all installed apps that handle that MIME type, producing a chooser.

Fix

Pass explicit IntentFilter arrays to enableForegroundDispatch covering all three dispatch tiers:

privatefunbuildDispatchFilters(): Array<IntentFilter> {
val ndefFilter =IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply {
try { addDataType("*/*") } catch (_:IntentFilter.MalformedMimeTypeException) {}
}
return arrayOf(
ndefFilter, // tier 1: any NDEF contentIntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED), // tier 2: tech-routed tagsIntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED), // tier 3: catch-all
)
}

All three tiers now route to ShareActivity.onNewIntent where they are silently discarded. enableForegroundDispatch is intentionally used over enableReaderMode, which per Android docs disables HCE/CE routing for its entire active duration.

CopilotAI changed the title fix(nfc): remove enableReaderMode that blocks HCE phone-to-phone sharingfix(nfc): remove enableReaderMode that breaks HCE phone-to-phone sharingJul 5, 2026
CopilotAI requested a review from duhowJuly 5, 2026 12:04
CopilotAI changed the title fix(nfc): remove enableReaderMode that breaks HCE phone-to-phone sharingfix(nfc): suppress NFC tag dispatch while HCE is active to stop phone acting as readerJul 5, 2026
CopilotAI changed the title fix(nfc): suppress NFC tag dispatch while HCE is active to stop phone acting as readerfix(nfc): suppress OS NFC dispatch chooser during HCE sharingJul 5, 2026
@github-actions

Copy link
Copy Markdown

✅ Debug APK artifact is ready for commit b64c0b3 .
💾 Download APK artifact here.
Workflow run: https://github.com/duhow/openbeam/actions/runs/28740975196

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@duhow