Fix real Amber login hang: skip package-name so getPublicKey uses the intent, not the stalling ContentProvider (v1.1.9)
Root cause found in the plugin's native getPublicKey (NostrSignerPlugin.java): when a packageName is set, it FIRST tries Amber's ContentProvider (background, no-UI). On GrapheneOS that cross-app ContentResolver query is blocked and never returns, so it never falls through to startActivityForResult(nostrsigner:) — the branch that actually opens Amber's approval UI. Result: eternal "Waiting for Amber". Fix: getAmberPublicKeyViaPlugin no longer calls setPackageName and no longer passes packageName; it passes only the get_public_key permission. With no package name the plugin skips the content-resolver branch and launches the intent directly, opening Amber's UI. Amber returns both pubkey and its package, so later signing still works. Paired with the auto-injected <queries> manifest block so the OS can resolve the intent in the first place. Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
This commit is contained in:
parent
07699592da
commit
6fb7314f6c
1 changed files with 16 additions and 2 deletions
|
|
@ -147,10 +147,24 @@ async function getPlugin(): Promise<NostrSignerNative> {
|
||||||
* handle both hex and real npub just in case.
|
* handle both hex and real npub just in case.
|
||||||
*/
|
*/
|
||||||
export async function getAmberPublicKeyViaPlugin(): Promise<string> {
|
export async function getAmberPublicKeyViaPlugin(): Promise<string> {
|
||||||
const plugin = await getPlugin();
|
// Get the raw native bridge directly. CRITICALLY we do NOT call
|
||||||
|
// setPackageName here and we do NOT pass packageName to getPublicKey.
|
||||||
|
//
|
||||||
|
// WHY: the native getPublicKey first tries Amber's ContentProvider (a
|
||||||
|
// background, no-UI query) whenever a packageName is known. On GrapheneOS that
|
||||||
|
// cross-app ContentResolver query is blocked/stalls and never returns cleanly,
|
||||||
|
// so the code never falls through to the intent that actually opens Amber's
|
||||||
|
// approval screen → eternal "Waiting for Amber". By omitting packageName, the
|
||||||
|
// plugin skips the content-resolver branch and goes STRAIGHT to
|
||||||
|
// startActivityForResult(nostrsigner:) which launches Amber's UI. Amber returns
|
||||||
|
// both the pubkey AND its package, so subsequent signing still works.
|
||||||
|
const plugin = getNativeSigner();
|
||||||
|
if (!plugin) {
|
||||||
|
throw new Error('Amber signing is only available in the SkateSpots Android app.');
|
||||||
|
}
|
||||||
|
|
||||||
const result = await withTimeout(
|
const result = await withTimeout(
|
||||||
plugin.getPublicKey({ packageName: AMBER_PACKAGE }),
|
plugin.getPublicKey({ permissions: JSON.stringify([{ type: 'get_public_key' }]) }),
|
||||||
'login',
|
'login',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue