Skip to content

Commit 39b3b89

Browse files
committed
fix(messaging): API 33 permission request
1 parent 66d5335 commit 39b3b89

File tree

3 files changed

+86
-11
lines changed

3 files changed

+86
-11
lines changed

packages/firebase-core/index.android.ts

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { IFirebaseOptions, FirebaseConfig } from '.';
2-
import { Application, knownFolders, Utils } from '@nativescript/core';
2+
import { AndroidActivityEventData, Application, fromObject, knownFolders, Utils } from '@nativescript/core';
33
export * from './utils';
44
declare const __non_webpack_require__;
55
export class FirebaseError extends Error {
@@ -173,6 +173,7 @@ export class FirebaseApp {
173173
}
174174
}
175175

176+
let lastActivity;
176177
export class Firebase {
177178
static #onResumeQueue = [];
178179
static addToResumeQueue(callback: () => void) {
@@ -181,6 +182,21 @@ export class Firebase {
181182
}
182183
Firebase.#onResumeQueue.push(callback);
183184
}
185+
static #activityResultContractsQueue = fromObject({});
186+
187+
static registerActivityResultContracts(callback: (args: AndroidActivityEventData & { dispose: boolean }) => void) {
188+
if (typeof callback !== 'function') {
189+
return;
190+
}
191+
Firebase.#activityResultContractsQueue.on('register', callback);
192+
}
193+
194+
static unregisterActivityResultContracts(callback: (args: AndroidActivityEventData & { dispose: boolean }) => void) {
195+
if (typeof callback !== 'function') {
196+
return;
197+
}
198+
Firebase.#activityResultContractsQueue.off('register', callback);
199+
}
184200
static #appDidLaunch = false;
185201
static #inForeground = false;
186202
static get inForeground() {
@@ -197,12 +213,45 @@ export class Firebase {
197213
Firebase.#onResumeQueue.forEach((callback) => {
198214
callback();
199215
});
200-
Firebase.#onResumeQueue.splice(0);
201216
});
202217

203218
Application.android.on('activityPaused', (args) => {
204219
Firebase.#inForeground = false;
205220
});
221+
222+
Application.android.once('activityCreated', (args: any) => {
223+
if (!lastActivity) {
224+
lastActivity = args.activity;
225+
Firebase.#activityResultContractsQueue.notify({
226+
eventName: 'register',
227+
activity: args.activity,
228+
dispose: false,
229+
});
230+
}
231+
});
232+
233+
Application.android.on('activityDestroyed', (args) => {
234+
const activity = args.activity;
235+
if (lastActivity && activity === lastActivity) {
236+
Firebase.#activityResultContractsQueue.notify({
237+
eventName: 'register',
238+
activity: args.activity,
239+
dispose: true,
240+
});
241+
242+
lastActivity = undefined;
243+
Application.android.once('activityCreated', (args: any) => {
244+
if (!lastActivity) {
245+
lastActivity = args.activity;
246+
Firebase.#activityResultContractsQueue.notify({
247+
eventName: 'register',
248+
activity: args.activity,
249+
dispose: false,
250+
});
251+
}
252+
});
253+
}
254+
});
206255
return firebaseInstance;
207256
}
208257

packages/firebase-core/index.ios.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,9 @@ export class Firebase {
268268
}
269269
Firebase.#onResumeQueue.push(callback);
270270
}
271+
static addToActivityCreatedQueue(callback: () => void) {
272+
// noop
273+
}
271274
static #inForeground = false;
272275
static #appDidLaunch = false;
273276
static get inForeground() {

packages/firebase-messaging-core/index.android.ts

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,25 @@ const onMessageCallbacks: Set<(message: any) => void> = new Set();
5252
const onTokenCallbacks: Set<(token: any) => void> = new Set();
5353
const onNotificationTapCallbacks: Set<(message: any) => void> = new Set();
5454

55+
let lastActivity;
56+
let requestPermissionLauncher: androidx.activity.result.ActivityResultLauncher<any>;
57+
let _resolve;
58+
59+
function register(args: any) {
60+
if (!lastActivity) {
61+
lastActivity = args.activity;
62+
requestPermissionLauncher = args.activity.registerForActivityResult(
63+
new androidx.activity.result.contract.ActivityResultContracts.RequestPermission(),
64+
new androidx.activity.result.ActivityResultCallback({
65+
onActivityResult(isGranted: boolean) {
66+
_resolve?.(isGranted ? 0 : 1);
67+
_resolve = undefined;
68+
},
69+
})
70+
);
71+
}
72+
}
73+
5574
export class MessagingCore implements IMessagingCore {
5675
#native: com.google.firebase.messaging.FirebaseMessaging;
5776
#onMessageCallback?;
@@ -120,6 +139,17 @@ export class MessagingCore implements IMessagingCore {
120139
MessagingCore.#inForeground = false;
121140
});
122141

142+
Application.android.once('activityCreated', register);
143+
144+
Application.android.on('activityDestroyed', (args) => {
145+
const activity = args.activity;
146+
if (lastActivity && activity === lastActivity) {
147+
requestPermissionLauncher?.unregister?.();
148+
lastActivity = undefined;
149+
Application.android.once('activityCreated', register);
150+
}
151+
});
152+
123153
org.nativescript.firebase.messaging.FirebaseMessaging.init(Utils.android.getApplicationContext());
124154
ensureCallback();
125155

@@ -263,20 +293,13 @@ export class MessagingCore implements IMessagingCore {
263293

264294
return new Promise((resolve, reject) => {
265295
const launch = (activity) => {
266-
const requestPermissionLauncher = activity.registerForActivityResult(
267-
new androidx.activity.result.contract.ActivityResultContracts.RequestPermission(),
268-
new androidx.activity.result.ActivityResultCallback({
269-
onActivityResult(isGranted: boolean) {
270-
resolve(isGranted ? 0 : 1);
271-
},
272-
})
273-
);
274-
296+
_resolve = resolve;
275297
requestPermissionLauncher.launch((android as any).Manifest.permission.POST_NOTIFICATIONS);
276298
};
277299

278300
if (!activity) {
279301
Application.android.once('activityCreated', (args: any) => {
302+
register(args);
280303
launch(args.activity);
281304
});
282305
} else {

0 commit comments

Comments
 (0)