mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-11-04 12:14:11 +00:00 
			
		
		
		
	Attempt to auto-configure push notifications to remove one tour pane
This commit is contained in:
		@@ -45,6 +45,7 @@ List<Widget> buildTour(TourRouteState state) {
 | 
				
			|||||||
      pushNotificationsKey: state.pushNotificationsKey,
 | 
					      pushNotificationsKey: state.pushNotificationsKey,
 | 
				
			||||||
      onConfigured: state.rebuild,
 | 
					      onConfigured: state.rebuild,
 | 
				
			||||||
      onChanged: state.rebuild,
 | 
					      onChanged: state.rebuild,
 | 
				
			||||||
 | 
					      visible: state.areNotificationsConfigured,
 | 
				
			||||||
    ),
 | 
					    ),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Forez specific features
 | 
					    // Forez specific features
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,10 @@
 | 
				
			|||||||
 | 
					import 'package:comunic/helpers/firebase_messaging_helper.dart';
 | 
				
			||||||
import 'package:comunic/helpers/independent_push_notifications_helper.dart';
 | 
					import 'package:comunic/helpers/independent_push_notifications_helper.dart';
 | 
				
			||||||
import 'package:comunic/helpers/preferences_helper.dart';
 | 
					import 'package:comunic/helpers/preferences_helper.dart';
 | 
				
			||||||
import 'package:comunic/helpers/server_config_helper.dart';
 | 
					import 'package:comunic/helpers/server_config_helper.dart';
 | 
				
			||||||
import 'package:comunic/models/api_request.dart';
 | 
					import 'package:comunic/models/api_request.dart';
 | 
				
			||||||
import 'package:comunic/utils/flutter_utils.dart';
 | 
					import 'package:comunic/utils/flutter_utils.dart';
 | 
				
			||||||
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Push notifications helper
 | 
					/// Push notifications helper
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
@@ -58,6 +60,34 @@ class PushNotificationsHelper {
 | 
				
			|||||||
    IndependentPushNotificationsHelper.disable();
 | 
					    IndependentPushNotificationsHelper.disable();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Configure push notifications
 | 
				
			||||||
 | 
					  static Future<void> configure(
 | 
				
			||||||
 | 
					      BuildContext context, PushNotificationsStatus newStatus) async {
 | 
				
			||||||
 | 
					    String firebaseToken = "";
 | 
				
			||||||
 | 
					    switch (newStatus) {
 | 
				
			||||||
 | 
					      case PushNotificationsStatus.DISABLED:
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case PushNotificationsStatus.FIREBASE:
 | 
				
			||||||
 | 
					        await FirebaseMessagingHelper.preConfigure();
 | 
				
			||||||
 | 
					        firebaseToken = await FirebaseMessagingHelper.getToken();
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case PushNotificationsStatus.INDEPENDENT:
 | 
				
			||||||
 | 
					        if (await IndependentPushNotificationsHelper.needPreConfiguration())
 | 
				
			||||||
 | 
					          await IndependentPushNotificationsHelper.preConfigure(context);
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
 | 
					        throw new Exception("Unknown status!");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await PushNotificationsHelper.clearLocalStatus();
 | 
				
			||||||
 | 
					    await PushNotificationsHelper.setNewStatus(newStatus,
 | 
				
			||||||
 | 
					        firebaseToken: firebaseToken);
 | 
				
			||||||
 | 
					    await PushNotificationsHelper.refreshLocalStatus();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// Set new push notification status on the server
 | 
					  /// Set new push notification status on the server
 | 
				
			||||||
  static Future<void> setNewStatus(
 | 
					  static Future<void> setNewStatus(
 | 
				
			||||||
    PushNotificationsStatus newStatus, {
 | 
					    PushNotificationsStatus newStatus, {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,3 @@
 | 
				
			|||||||
import 'package:comunic/helpers/firebase_messaging_helper.dart';
 | 
					 | 
				
			||||||
import 'package:comunic/helpers/independent_push_notifications_helper.dart';
 | 
					 | 
				
			||||||
import 'package:comunic/helpers/push_notifications_helper.dart';
 | 
					import 'package:comunic/helpers/push_notifications_helper.dart';
 | 
				
			||||||
import 'package:comunic/helpers/server_config_helper.dart';
 | 
					import 'package:comunic/helpers/server_config_helper.dart';
 | 
				
			||||||
import 'package:comunic/models/config.dart';
 | 
					import 'package:comunic/models/config.dart';
 | 
				
			||||||
@@ -162,35 +160,12 @@ class PushNotificationsConfigurationWidgetState
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  Future<bool> submit() async {
 | 
					  Future<bool> submit() async {
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      String firebaseToken = "";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (currStatus == await PushNotificationsHelper.getLocalStatus()) {
 | 
					      if (currStatus == await PushNotificationsHelper.getLocalStatus()) {
 | 
				
			||||||
        widget.onConfigured();
 | 
					        widget.onConfigured();
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      switch (currStatus) {
 | 
					      await PushNotificationsHelper.configure(context, currStatus);
 | 
				
			||||||
        case PushNotificationsStatus.DISABLED:
 | 
					 | 
				
			||||||
          break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case PushNotificationsStatus.FIREBASE:
 | 
					 | 
				
			||||||
          await FirebaseMessagingHelper.preConfigure();
 | 
					 | 
				
			||||||
          firebaseToken = await FirebaseMessagingHelper.getToken();
 | 
					 | 
				
			||||||
          break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case PushNotificationsStatus.INDEPENDENT:
 | 
					 | 
				
			||||||
          if (await IndependentPushNotificationsHelper.needPreConfiguration())
 | 
					 | 
				
			||||||
            await IndependentPushNotificationsHelper.preConfigure(context);
 | 
					 | 
				
			||||||
          break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        default:
 | 
					 | 
				
			||||||
          throw new Exception("Unknown status!");
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      await PushNotificationsHelper.clearLocalStatus();
 | 
					 | 
				
			||||||
      await PushNotificationsHelper.setNewStatus(currStatus,
 | 
					 | 
				
			||||||
          firebaseToken: firebaseToken);
 | 
					 | 
				
			||||||
      await PushNotificationsHelper.refreshLocalStatus();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      widget.onConfigured();
 | 
					      widget.onConfigured();
 | 
				
			||||||
    } catch (e, s) {
 | 
					    } catch (e, s) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,6 @@
 | 
				
			|||||||
import 'package:comunic/helpers/preferences_helper.dart';
 | 
					import 'package:comunic/helpers/preferences_helper.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/helpers/push_notifications_helper.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/helpers/server_config_helper.dart';
 | 
				
			||||||
import 'package:comunic/helpers/users_helper.dart';
 | 
					import 'package:comunic/helpers/users_helper.dart';
 | 
				
			||||||
import 'package:comunic/models/config.dart';
 | 
					import 'package:comunic/models/config.dart';
 | 
				
			||||||
import 'package:comunic/models/user.dart';
 | 
					import 'package:comunic/models/user.dart';
 | 
				
			||||||
@@ -12,6 +14,7 @@ import 'package:comunic/ui/widgets/tour/presentation_pane.dart';
 | 
				
			|||||||
import 'package:comunic/ui/widgets/tour/tour_notifications_pane.dart';
 | 
					import 'package:comunic/ui/widgets/tour/tour_notifications_pane.dart';
 | 
				
			||||||
import 'package:comunic/utils/account_utils.dart';
 | 
					import 'package:comunic/utils/account_utils.dart';
 | 
				
			||||||
import 'package:comunic/utils/intl_utils.dart';
 | 
					import 'package:comunic/utils/intl_utils.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/utils/log_utils.dart';
 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Tour route
 | 
					/// Tour route
 | 
				
			||||||
@@ -41,9 +44,27 @@ class TourRouteState extends State<TourRoute> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  int _defaultIndex = 0;
 | 
					  int _defaultIndex = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool areNotificationsConfigured = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Future<void> _init() async {
 | 
					  Future<void> _init() async {
 | 
				
			||||||
    currUser =
 | 
					    currUser =
 | 
				
			||||||
        await UsersHelper().getSingleWithThrow(userID(), forceDownload: true);
 | 
					        await UsersHelper().getSingleWithThrow(userID(), forceDownload: true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Pre-configure notifications
 | 
				
			||||||
 | 
					    final notificationsStatus = await PushNotificationsHelper.getLocalStatus();
 | 
				
			||||||
 | 
					    if (!PushNotificationsHelper.arePushNotificationsAvailable ||
 | 
				
			||||||
 | 
					        notificationsStatus != PushNotificationsStatus.UNDEFINED)
 | 
				
			||||||
 | 
					      areNotificationsConfigured = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Attempt to automatically register to FCM
 | 
				
			||||||
 | 
					    else if (srvConfig.notificationsPolicy.hasFirebase) {
 | 
				
			||||||
 | 
					      try {
 | 
				
			||||||
 | 
					        await PushNotificationsHelper.configure(
 | 
				
			||||||
 | 
					            context, PushNotificationsStatus.FIREBASE);
 | 
				
			||||||
 | 
					      } catch (e, s) {
 | 
				
			||||||
 | 
					        logError(e, s);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void rebuild() => setState(() {});
 | 
					  void rebuild() => setState(() {});
 | 
				
			||||||
@@ -53,7 +74,7 @@ class TourRouteState extends State<TourRoute> {
 | 
				
			|||||||
    await _key.currentState.refresh();
 | 
					    await _key.currentState.refresh();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  List<Widget> get _list => config().toursEntriesBuilder != null
 | 
					  List<Widget> get _list => (config().toursEntriesBuilder != null
 | 
				
			||||||
      ? config().toursEntriesBuilder(this)
 | 
					      ? config().toursEntriesBuilder(this)
 | 
				
			||||||
      : [
 | 
					      : [
 | 
				
			||||||
          FirstTourPane(),
 | 
					          FirstTourPane(),
 | 
				
			||||||
@@ -69,6 +90,7 @@ class TourRouteState extends State<TourRoute> {
 | 
				
			|||||||
            pushNotificationsKey: pushNotificationsKey,
 | 
					            pushNotificationsKey: pushNotificationsKey,
 | 
				
			||||||
            onConfigured: () => setState(() {}),
 | 
					            onConfigured: () => setState(() {}),
 | 
				
			||||||
            onChanged: () => setState(() {}),
 | 
					            onChanged: () => setState(() {}),
 | 
				
			||||||
 | 
					            visible: !areNotificationsConfigured,
 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          PresentationPane(
 | 
					          PresentationPane(
 | 
				
			||||||
@@ -96,7 +118,14 @@ class TourRouteState extends State<TourRoute> {
 | 
				
			|||||||
                "${tr("Your data is YOUR DATA. We will never use it or sell it.")}\n\n${tr("If you do not trust us, you can always check out our source code to verify it!")}",
 | 
					                "${tr("Your data is YOUR DATA. We will never use it or sell it.")}\n\n${tr("If you do not trust us, you can always check out our source code to verify it!")}",
 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
          LastTourPane(),
 | 
					          LastTourPane(),
 | 
				
			||||||
        ];
 | 
					        ])
 | 
				
			||||||
 | 
					    ..removeWhere((pane) {
 | 
				
			||||||
 | 
					      if (pane is PresentationPane) {
 | 
				
			||||||
 | 
					        PresentationPane p = pane;
 | 
				
			||||||
 | 
					        return !(p.visible ?? true);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  Widget build(BuildContext context) => LoginRoutesTheme(
 | 
					  Widget build(BuildContext context) => LoginRoutesTheme(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,6 +14,7 @@ class PresentationPane extends StatelessWidget {
 | 
				
			|||||||
  final Function(BuildContext) onActionTap;
 | 
					  final Function(BuildContext) onActionTap;
 | 
				
			||||||
  final bool canGoNext;
 | 
					  final bool canGoNext;
 | 
				
			||||||
  final Future<bool> Function(BuildContext) onTapNext;
 | 
					  final Future<bool> Function(BuildContext) onTapNext;
 | 
				
			||||||
 | 
					  final bool visible;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const PresentationPane({
 | 
					  const PresentationPane({
 | 
				
			||||||
    Key key,
 | 
					    Key key,
 | 
				
			||||||
@@ -26,6 +27,7 @@ class PresentationPane extends StatelessWidget {
 | 
				
			|||||||
    this.onActionTap,
 | 
					    this.onActionTap,
 | 
				
			||||||
    this.canGoNext = true,
 | 
					    this.canGoNext = true,
 | 
				
			||||||
    this.onTapNext,
 | 
					    this.onTapNext,
 | 
				
			||||||
 | 
					    this.visible = true,
 | 
				
			||||||
  })  : assert(icon != null || iconWidget != null),
 | 
					  })  : assert(icon != null || iconWidget != null),
 | 
				
			||||||
        assert(title != null),
 | 
					        assert(title != null),
 | 
				
			||||||
        assert(text != null || child != null),
 | 
					        assert(text != null || child != null),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,7 @@ class TourNotificationsPane extends PresentationPane {
 | 
				
			|||||||
            pushNotificationsKey,
 | 
					            pushNotificationsKey,
 | 
				
			||||||
    @required Function() onConfigured,
 | 
					    @required Function() onConfigured,
 | 
				
			||||||
    @required Function() onChanged,
 | 
					    @required Function() onChanged,
 | 
				
			||||||
 | 
					    @required bool visible,
 | 
				
			||||||
  })  : assert(pushNotificationsKey != null),
 | 
					  })  : assert(pushNotificationsKey != null),
 | 
				
			||||||
        super(
 | 
					        super(
 | 
				
			||||||
          icon: Icons.notifications,
 | 
					          icon: Icons.notifications,
 | 
				
			||||||
@@ -28,5 +29,6 @@ class TourNotificationsPane extends PresentationPane {
 | 
				
			|||||||
          ),
 | 
					          ),
 | 
				
			||||||
          canGoNext: pushNotificationsKey?.currentState?.canSubmit ?? false,
 | 
					          canGoNext: pushNotificationsKey?.currentState?.canSubmit ?? false,
 | 
				
			||||||
          onTapNext: (c) => pushNotificationsKey.currentState.submit(),
 | 
					          onTapNext: (c) => pushNotificationsKey.currentState.submit(),
 | 
				
			||||||
 | 
					          visible: visible,
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user