Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/constants/database_keys.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ abstract final class DatabaseKeys {
static const thingsBoardApiEndpointKey = 'thingsBoardApiEndpoint';
static const initialAppLink = 'initialAppLink';
static const selectedRegion = 'selectedRegion';
static const pushNotificationsRegistered = 'pushNotificationsRegistered';
}
14 changes: 8 additions & 6 deletions lib/core/auth/login/provider/login_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import 'package:thingsboard_app/utils/services/communication/events/user_loaded_
import 'package:thingsboard_app/utils/services/communication/i_communication_service.dart';
import 'package:thingsboard_app/utils/services/custom_translation/i_custom_translation_service.dart';
import 'package:thingsboard_app/utils/services/device_info/i_device_info_service.dart';
import 'package:thingsboard_app/utils/services/firebase/i_firebase_service.dart';
import 'package:thingsboard_app/utils/services/notification_service.dart';
import 'package:thingsboard_app/utils/services/overlay_service/i_overlay_service.dart';
import 'package:thingsboard_app/utils/services/tb_client_service/i_tb_client_service.dart';
Expand All @@ -41,8 +40,7 @@ class Login extends _$Login {
}

Future<void> logout() async {
if (getIt<IFirebaseService>().apps.isNotEmpty &&
state.isFullyAuthenticated()) {
if (state.isFullyAuthenticated()) {
await getIt<NotificationService>().logout();
}
getIt<ICustomTranslationService>().clear();
Expand All @@ -54,6 +52,12 @@ class Login extends _$Login {

if (!_tbClient.isAuthenticated()) {
state = const LoginState(isUserLoaded: false);
// Fire-and-forget: the cleanup swallows its own errors, and the
// registration flag is deleted last, so an interrupted attempt is
// retried on the next launch without delaying the login screen.
// NotificationService.init() waits for it, so a fast auto-login
// (QR code, OAuth2) cannot register a token while it is being deleted.
unawaited(getIt<NotificationService>().cleanUpStalePushRegistration());
return;
}
if (_tbClient.isPreVerificationToken() ||
Expand Down Expand Up @@ -123,9 +127,7 @@ class Login extends _$Login {

Future<void> _onFullyLoggedIn() async {
await loadUser();
if (getIt<IFirebaseService>().apps.isNotEmpty) {
await getIt<NotificationService>().init();
}
await getIt<NotificationService>().init();
}

Future<void> twoFaConfirmed(LoginResponse response) async {
Expand Down
2 changes: 1 addition & 1 deletion lib/core/auth/login/provider/login_provider.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 1 addition & 4 deletions lib/core/context/tb_context.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import 'package:thingsboard_app/thingsboard_client.dart';
import 'package:thingsboard_app/utils/services/version_service/version_info.dart';
import 'package:thingsboard_app/utils/services/device_info/i_device_info_service.dart';
import 'package:thingsboard_app/utils/services/endpoint/i_endpoint_service.dart';
import 'package:thingsboard_app/utils/services/firebase/i_firebase_service.dart';
import 'package:thingsboard_app/utils/services/notification_service.dart';
import 'package:thingsboard_app/utils/services/overlay_service/i_overlay_service.dart';
import 'package:thingsboard_app/utils/services/wl_provider.dart';
Expand Down Expand Up @@ -298,9 +297,7 @@ class TbContext implements PopEntry {
log.debug('TbContext::logout($requestConfig, $notifyUser)');
_handleRootState = true;

if (getIt<IFirebaseService>().apps.isNotEmpty) {
await getIt<NotificationService>().init();
}
await getIt<NotificationService>().logout();

await tbClient.logout(requestConfig: requestConfig, notifyUser: notifyUser);

Expand Down
4 changes: 2 additions & 2 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
await Hive.initFlutter();
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark);
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark);
Hive.registerAdapter(RegionAdapter());
await setUpRootDependencies();
if (UniversalPlatform.isAndroid) {
Expand All @@ -34,7 +34,7 @@ Future<void> main() async {
}

try {
getIt<IFirebaseService>().initializeApp(
await getIt<IFirebaseService>().initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
} catch (e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,10 @@ abstract interface class ILocalDatabaseService {
Future<String?> getInitialAppLink();

Future<void> deleteInitialAppLink();

Future<bool> isPushRegistered();

Future<void> setPushRegistered();

Future<void> clearPushRegistered();
}
16 changes: 16 additions & 0 deletions lib/utils/services/local_database/local_database_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,20 @@ class LocalDatabaseService implements ILocalDatabaseService {
Future<void> deleteInitialAppLink() {
return storage.deleteItem(DatabaseKeys.initialAppLink);
}

@override
Future<bool> isPushRegistered() async {
return await storage.getItem(DatabaseKeys.pushNotificationsRegistered) ==
true;
}

@override
Future<void> setPushRegistered() {
return storage.setItem(DatabaseKeys.pushNotificationsRegistered, true);
}

@override
Future<void> clearPushRegistered() {
return storage.deleteItem(DatabaseKeys.pushNotificationsRegistered);
}
}
Loading