From 1e2279106f46770b872468e0f2eb3cf3086f61ea Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 25 Oct 2024 20:14:40 +0500 Subject: [PATCH 1/9] Updated Device.dart: added orientation property --- modules/ensemble/lib/framework/device.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ensemble/lib/framework/device.dart b/modules/ensemble/lib/framework/device.dart index 71e2b30d6..21b05c088 100644 --- a/modules/ensemble/lib/framework/device.dart +++ b/modules/ensemble/lib/framework/device.dart @@ -41,6 +41,7 @@ class Device // Media Query "width": () => screenWidth, "height": () => screenHeight, + "orientation": () => screenOrientation, "safeAreaTop": () => safeAreaTop, "safeAreaBottom": () => safeAreaBottom, @@ -95,6 +96,7 @@ mixin MediaQueryCapability { int get screenWidth => _getData().size.width.toInt(); int get screenHeight => _getData().size.height.toInt(); + String get screenOrientation => _getData().orientation.toString(); int get safeAreaTop => _getData().padding.top.toInt(); int get safeAreaBottom => _getData().padding.bottom.toInt(); } From bb76a492afe240ef2f1fcc536ee0acda1cda8caf Mon Sep 17 00:00:00 2001 From: TheNoumanDev Date: Tue, 5 Nov 2024 15:58:49 +0500 Subject: [PATCH 2/9] detecting chnagings in davice object parameters. --- .../ensemble/lib/framework/data_context.dart | 14 +++ modules/ensemble/lib/framework/device.dart | 101 +++++++++++++++--- 2 files changed, 100 insertions(+), 15 deletions(-) diff --git a/modules/ensemble/lib/framework/data_context.dart b/modules/ensemble/lib/framework/data_context.dart index dafa62024..4412d833d 100644 --- a/modules/ensemble/lib/framework/data_context.dart +++ b/modules/ensemble/lib/framework/data_context.dart @@ -98,6 +98,20 @@ class DataContext implements Context { if (_contextMap['device'] == null) { _contextMap['device'] = Device(); } + + // Always set up the listener + print('👂 Setting up device update listener...'); + Device.onDeviceUpdate.listen((newData) { + print('📱 DataContext received device update'); + + // Update MediaQuery data + MediaQueryCapability.data = newData; + + // Force a refresh of the device instance + _contextMap['device'] = Device(); + + print('✅ DataContext device metrics updated:'); + }); } DataContext createChildContext( diff --git a/modules/ensemble/lib/framework/device.dart b/modules/ensemble/lib/framework/device.dart index 21b05c088..ae35c67a2 100644 --- a/modules/ensemble/lib/framework/device.dart +++ b/modules/ensemble/lib/framework/device.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:core'; import 'dart:io'; import 'dart:developer'; @@ -13,22 +14,95 @@ import 'package:ensemble_ts_interpreter/invokables/invokable.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; import 'package:get_it/get_it.dart'; import 'package:intl/intl.dart'; -/// get device information as well as requesting device permissions -class Device - with - Invokable, - MediaQueryCapability, - LocationCapability, - DeviceInfoCapability { +class Device with Invokable, MediaQueryCapability, LocationCapability, DeviceInfoCapability, WidgetsBindingObserver { static final Device _instance = Device._internal(); + static bool _isInitialized = false; + bool _isHandlingChange = false; + MediaQueryData? _lastReportedData; + + static final StreamController _deviceUpdateController = + StreamController.broadcast(); + static Stream get onDeviceUpdate => _deviceUpdateController.stream; + + Device._internal() { + if (!_isInitialized) { + print('🔄 Initializing Device observer...'); + WidgetsBinding.instance.addObserver(this); + // Set up initial data + WidgetsBinding.instance.addPostFrameCallback((_) { + _handleMediaQueryChange(); // Call this to set initial state + }); + _isInitialized = true; + } + } + + factory Device() => _instance; + + @override + void didChangeMetrics() { + print('📏 Metrics changed - handling update...'); + if (!_isHandlingChange) { + WidgetsBinding.instance.addPostFrameCallback((_) => _handleMediaQueryChange()); + } + } + + void _handleMediaQueryChange() { + if (_isHandlingChange) return; + _isHandlingChange = true; + + try { + final context = Utils.globalAppKey.currentContext; + if (context == null) { + print('❌ No context available for MediaQuery update'); + return; + } + + final newData = MediaQuery.of(context); + + // Check for real changes + if (_hasSignificantChanges(_lastReportedData, newData)) { + + _lastReportedData = newData; + MediaQueryCapability.data = newData; + + // Broadcast the change + print('📢 Broadcasting device update...'); + _deviceUpdateController.add(newData); + } + } catch (e) { + print('💥 Error handling MediaQuery change: $e'); + } finally { + _isHandlingChange = false; + } + } + + bool _hasSignificantChanges(MediaQueryData? oldData, MediaQueryData newData) { + if (oldData == null) return true; + + final orientationChanged = oldData.orientation != newData.orientation; + final sizeChanged = oldData.size != newData.size; + + if (orientationChanged || sizeChanged) { + print('📊 Change detection:'); + print('- Orientation: ${oldData.orientation} → ${newData.orientation}'); + print('- Size: ${oldData.size} → ${newData.size}'); + } + + return orientationChanged || sizeChanged; + } - Device._internal(); + void initialize() { + initDeviceInfo(); + } - factory Device() { - return _instance; + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + _isInitialized = false; } @override @@ -73,13 +147,10 @@ class Device } @override - Map setters() { - return {}; - } + Map setters() => {}; void openAppSettings([String? target]) { - final settingType = - AppSettingsType.values.from(target) ?? AppSettingsType.settings; + final settingType = AppSettingsType.values.from(target) ?? AppSettingsType.settings; AppSettings.openAppSettings(type: settingType); } } From cfa78bfedfe603efc072ca099582a3619048988d Mon Sep 17 00:00:00 2001 From: TheNoumanDev Date: Tue, 5 Nov 2024 22:59:02 +0500 Subject: [PATCH 3/9] removed unnecessary code --- .../ensemble/lib/framework/data_context.dart | 14 ---- modules/ensemble/lib/framework/device.dart | 84 ++++--------------- 2 files changed, 18 insertions(+), 80 deletions(-) diff --git a/modules/ensemble/lib/framework/data_context.dart b/modules/ensemble/lib/framework/data_context.dart index 4412d833d..dafa62024 100644 --- a/modules/ensemble/lib/framework/data_context.dart +++ b/modules/ensemble/lib/framework/data_context.dart @@ -98,20 +98,6 @@ class DataContext implements Context { if (_contextMap['device'] == null) { _contextMap['device'] = Device(); } - - // Always set up the listener - print('👂 Setting up device update listener...'); - Device.onDeviceUpdate.listen((newData) { - print('📱 DataContext received device update'); - - // Update MediaQuery data - MediaQueryCapability.data = newData; - - // Force a refresh of the device instance - _contextMap['device'] = Device(); - - print('✅ DataContext device metrics updated:'); - }); } DataContext createChildContext( diff --git a/modules/ensemble/lib/framework/device.dart b/modules/ensemble/lib/framework/device.dart index ae35c67a2..2014f8b1a 100644 --- a/modules/ensemble/lib/framework/device.dart +++ b/modules/ensemble/lib/framework/device.dart @@ -18,91 +18,42 @@ import 'package:flutter/widgets.dart'; import 'package:get_it/get_it.dart'; import 'package:intl/intl.dart'; -class Device with Invokable, MediaQueryCapability, LocationCapability, DeviceInfoCapability, WidgetsBindingObserver { +class Device + with + Invokable, + MediaQueryCapability, + LocationCapability, + DeviceInfoCapability, + WidgetsBindingObserver { static final Device _instance = Device._internal(); - static bool _isInitialized = false; - bool _isHandlingChange = false; - MediaQueryData? _lastReportedData; - - static final StreamController _deviceUpdateController = - StreamController.broadcast(); - static Stream get onDeviceUpdate => _deviceUpdateController.stream; - + Device._internal() { - if (!_isInitialized) { - print('🔄 Initializing Device observer...'); - WidgetsBinding.instance.addObserver(this); - // Set up initial data - WidgetsBinding.instance.addPostFrameCallback((_) { - _handleMediaQueryChange(); // Call this to set initial state - }); - _isInitialized = true; - } + WidgetsBinding.instance.addObserver(this); } factory Device() => _instance; @override void didChangeMetrics() { - print('📏 Metrics changed - handling update...'); - if (!_isHandlingChange) { - WidgetsBinding.instance.addPostFrameCallback((_) => _handleMediaQueryChange()); - } + WidgetsBinding.instance + .addPostFrameCallback((_) => _handleMediaQueryChange()); } void _handleMediaQueryChange() { - if (_isHandlingChange) return; - _isHandlingChange = true; - try { final context = Utils.globalAppKey.currentContext; - if (context == null) { - print('❌ No context available for MediaQuery update'); - return; - } + if (context == null) return; final newData = MediaQuery.of(context); - - // Check for real changes - if (_hasSignificantChanges(_lastReportedData, newData)) { - - _lastReportedData = newData; + + // Compare with existing static data + if (MediaQueryCapability.data?.orientation != newData.orientation || + MediaQueryCapability.data?.size != newData.size) { MediaQueryCapability.data = newData; - - // Broadcast the change - print('📢 Broadcasting device update...'); - _deviceUpdateController.add(newData); } } catch (e) { print('💥 Error handling MediaQuery change: $e'); - } finally { - _isHandlingChange = false; - } - } - - bool _hasSignificantChanges(MediaQueryData? oldData, MediaQueryData newData) { - if (oldData == null) return true; - - final orientationChanged = oldData.orientation != newData.orientation; - final sizeChanged = oldData.size != newData.size; - - if (orientationChanged || sizeChanged) { - print('📊 Change detection:'); - print('- Orientation: ${oldData.orientation} → ${newData.orientation}'); - print('- Size: ${oldData.size} → ${newData.size}'); } - - return orientationChanged || sizeChanged; - } - - void initialize() { - initDeviceInfo(); - } - - @override - void dispose() { - WidgetsBinding.instance.removeObserver(this); - _isInitialized = false; } @override @@ -150,7 +101,8 @@ class Device with Invokable, MediaQueryCapability, LocationCapability, DeviceInf Map setters() => {}; void openAppSettings([String? target]) { - final settingType = AppSettingsType.values.from(target) ?? AppSettingsType.settings; + final settingType = + AppSettingsType.values.from(target) ?? AppSettingsType.settings; AppSettings.openAppSettings(type: settingType); } } From 5c901779c5bffb7e5e3cd856f5c66f843e69abbf Mon Sep 17 00:00:00 2001 From: TheNoumanDev Date: Fri, 8 Nov 2024 16:12:54 +0500 Subject: [PATCH 4/9] updated binding for device object --- modules/ensemble/lib/framework/bindings.dart | 29 ++++++++++++ .../ensemble/lib/framework/data_context.dart | 14 +++--- modules/ensemble/lib/framework/device.dart | 45 +++++++++++++------ modules/ensemble/lib/screen_controller.dart | 10 +++++ 4 files changed, 79 insertions(+), 19 deletions(-) diff --git a/modules/ensemble/lib/framework/bindings.dart b/modules/ensemble/lib/framework/bindings.dart index 39b49099c..64a1c0707 100644 --- a/modules/ensemble/lib/framework/bindings.dart +++ b/modules/ensemble/lib/framework/bindings.dart @@ -44,6 +44,18 @@ abstract class BindingSource { String binding, DataContext dataContext) { RegExp variableNameRegex = RegExp('^[0-9a-z_]+', caseSensitive: false); + // Check for device bindings (both patterns) + String deviceExpr = 'ensemble.device.'; + if (binding.startsWith(deviceExpr)) { + // For ensemble.device.property pattern + String property = binding.substring(deviceExpr.length); + return DeviceBindingSource(property); + } else if (binding.startsWith('device.')) { + // For device.property pattern + String property = binding.substring('device.'.length); + return DeviceBindingSource(property); + } + // bindable storage String storageExpr = 'ensemble.storage.'; String userExpr = 'ensemble.user.'; @@ -121,6 +133,18 @@ abstract class BindingSource { String variable = expression.substring(2, expression.length - 1).trim(); RegExp variableNameRegex = RegExp('^[0-9a-z_]+', caseSensitive: false); + // Check for device bindings (both patterns) + String deviceExpr = 'ensemble.device.'; + if (variable.startsWith(deviceExpr)) { + // For ensemble.device.property pattern + String property = variable.substring(deviceExpr.length); + return DeviceBindingSource(property); + } else if (variable.startsWith('device.')) { + // For device.property pattern + String property = variable.substring('device.'.length); + return DeviceBindingSource(property); + } + // storage bindable String storageExpr = 'ensemble.storage.'; String userExpr = 'ensemble.user.'; @@ -202,6 +226,11 @@ class StorageBindingSource extends BindingSource { StorageBindingSource(super.modelId); } +/// bindable source backed by device +class DeviceBindingSource extends BindingSource { + DeviceBindingSource(super.modelId); +} + /// TODO: consolidate this with StorageBindingSource class SystemStorageBindingSource extends BindingSource { SystemStorageBindingSource(super.modelId, {required this.storagePrefix}); diff --git a/modules/ensemble/lib/framework/data_context.dart b/modules/ensemble/lib/framework/data_context.dart index dafa62024..a405dcc72 100644 --- a/modules/ensemble/lib/framework/data_context.dart +++ b/modules/ensemble/lib/framework/data_context.dart @@ -88,15 +88,19 @@ class DataContext implements Context { _contextMap['auth'] = GetIt.instance(); } - _addLegacyDataContext(); + _addLegacyDataContext(buildContext); } - // For backward compatibility - void _addLegacyDataContext() { + // device is a common name. If user already uses that, don't override it // This is now in ensemble.device.* + void _addLegacyDataContext(BuildContext? newBuildContext) { if (_contextMap['device'] == null) { - _contextMap['device'] = Device(); + _contextMap['device'] = Device(newBuildContext); + } else { + // If device exists, update its context + final device = _contextMap['device']; + device.updateContext(newBuildContext); } } @@ -468,7 +472,7 @@ class NativeInvokable extends ActionInvokable { 'user': () => UserInfo(), 'formatter': () => Formatter(), 'utils': () => _EnsembleUtils(), - 'device': () => Device(), + 'device': () => Device(buildContext), 'version': () => _cache['version'], }; } diff --git a/modules/ensemble/lib/framework/device.dart b/modules/ensemble/lib/framework/device.dart index 2014f8b1a..ab7cbf925 100644 --- a/modules/ensemble/lib/framework/device.dart +++ b/modules/ensemble/lib/framework/device.dart @@ -9,6 +9,7 @@ import 'package:ensemble/framework/extensions.dart'; import 'package:ensemble/framework/notification_manager.dart'; import 'package:ensemble/framework/storage_manager.dart'; import 'package:ensemble/framework/stub/location_manager.dart'; +import 'package:ensemble/screen_controller.dart'; import 'package:ensemble/util/utils.dart'; import 'package:ensemble_ts_interpreter/invokables/invokable.dart'; import 'package:flutter/cupertino.dart'; @@ -26,12 +27,25 @@ class Device DeviceInfoCapability, WidgetsBindingObserver { static final Device _instance = Device._internal(); + static late BuildContext context; Device._internal() { WidgetsBinding.instance.addObserver(this); } - factory Device() => _instance; + factory Device([BuildContext? buildContext]) { + if (buildContext != null) { + context = buildContext; + } + return _instance; + } + + // method to update context + void updateContext(BuildContext? newContext) { + if (newContext != null) { + context = newContext; + } + } @override void didChangeMetrics() { @@ -40,19 +54,22 @@ class Device } void _handleMediaQueryChange() { - try { - final context = Utils.globalAppKey.currentContext; - if (context == null) return; - - final newData = MediaQuery.of(context); - - // Compare with existing static data - if (MediaQueryCapability.data?.orientation != newData.orientation || - MediaQueryCapability.data?.size != newData.size) { - MediaQueryCapability.data = newData; - } - } catch (e) { - print('💥 Error handling MediaQuery change: $e'); + final newData = MediaQuery.of(context); + + // Compare with existing static data + if (MediaQueryCapability.data?.orientation != newData.orientation || + MediaQueryCapability.data?.size != newData.size) { + MediaQueryCapability.data = newData; + + // Dispatch individual property changes + ScreenController().dispatchDeviceChanges(context, 'width', screenWidth); + ScreenController().dispatchDeviceChanges(context, 'height', screenHeight); + ScreenController() + .dispatchDeviceChanges(context, 'orientation', screenOrientation); + ScreenController() + .dispatchDeviceChanges(context, 'safeAreaTop', safeAreaTop); + ScreenController() + .dispatchDeviceChanges(context, 'safeAreaBottom', safeAreaBottom); } } diff --git a/modules/ensemble/lib/screen_controller.dart b/modules/ensemble/lib/screen_controller.dart index 5fb502f8b..51bafc04d 100644 --- a/modules/ensemble/lib/screen_controller.dart +++ b/modules/ensemble/lib/screen_controller.dart @@ -578,6 +578,16 @@ class ScreenController { } } + void dispatchDeviceChanges( + BuildContext context, String property, dynamic value) { + ScopeManager? scopeManager = getScopeManager(context); + + if (scopeManager != null) { + scopeManager + .dispatch(ModelChangeEvent(DeviceBindingSource(property), value)); + } + } + void dispatchSystemStorageChanges( BuildContext context, String key, dynamic value, {required String storagePrefix}) { From cd7d0301221343fce148b515a017dfa35139b5eb Mon Sep 17 00:00:00 2001 From: Sharjeel Yunus Date: Thu, 20 Feb 2025 00:42:34 +0500 Subject: [PATCH 5/9] feat(maps): add fixed marker functionality to EnsembleMapWidget --- modules/location/lib/widget/maps/maps.dart | 4 +++ .../location/lib/widget/maps/maps_state.dart | 35 +++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/modules/location/lib/widget/maps/maps.dart b/modules/location/lib/widget/maps/maps.dart index 80553e93c..ef38afac0 100644 --- a/modules/location/lib/widget/maps/maps.dart +++ b/modules/location/lib/widget/maps/maps.dart @@ -85,6 +85,8 @@ class EnsembleMapWidget extends StatefulWidget _controller.toolbarRight = Utils.optionalInt(value, min: 0), 'mapType': (value) => _controller.mapType = value, + 'fixedMarker': (value) => + _controller.fixedMarker = Utils.getBool(value, fallback: false), 'markers': (markerData) => setMarkers(markerData), 'scrollableMarkerOverlay': (value) => _controller .scrollableMarkerOverlay = @@ -185,6 +187,8 @@ class MyController extends WidgetController with LocationCapability { bool tiltEnabled = true; bool zoomEnabled = true; + bool fixedMarker = false; + // toolbar has multiple button options bool showToolbar = true; bool showMapTypesButton = true; diff --git a/modules/location/lib/widget/maps/maps_state.dart b/modules/location/lib/widget/maps/maps_state.dart index 89d188d7d..e11af43ec 100644 --- a/modules/location/lib/widget/maps/maps_state.dart +++ b/modules/location/lib/widget/maps/maps_state.dart @@ -41,6 +41,8 @@ class EnsembleMapState extends MapsActionableState static const MAX_WIDTH = 500; static const MAX_HEIGHT = 500; + late FixedMarker _fixedMarker; + final Completer _controller = Completer(); @@ -85,6 +87,7 @@ class EnsembleMapState extends MapsActionableState @override void initState() { super.initState(); + _fixedMarker = FixedMarker(position: widget.controller.defaultCameraLatLng); _initCurrentLocation(); } @@ -230,6 +233,12 @@ class EnsembleMapState extends MapsActionableState _selectedMarkerId = markerId; } + // build marker image for fixed marker + if (markerTemplate != null && widget.controller.fixedMarker) { + _fixedMarker.icon = + await _buildMarkerFromTemplate(payloads.first, markerTemplate); + } + BitmapDescriptor? markerAsset; double zIndex = 0; if (markerId == _selectedMarkerId) { @@ -571,6 +580,13 @@ class EnsembleMapState extends MapsActionableState //log("Camera moved"); }); } + + if (widget.controller.fixedMarker && + _fixedMarker.position != position.target) { + setState(() { + _fixedMarker.position = position.target; + }); + } } void _onCameraIdle() {} @@ -597,8 +613,16 @@ class EnsembleMapState extends MapsActionableState Set _getMarkers() { Set markers = {}; for (MarkerPayload markerPayload in _markerPayloads) { - if (markerPayload.marker != null) { - markers.add(markerPayload.marker!); + if (widget.controller.fixedMarker) { + markers.add(Marker( + markerId: const MarkerId("fixed_marker"), + position: _fixedMarker.position, + icon: _fixedMarker.icon ?? BitmapDescriptor.defaultMarker, + )); + } else { + if (markerPayload.marker != null) { + markers.add(markerPayload.marker!); + } } } @@ -625,3 +649,10 @@ class MarkerPayload { final LatLng latLng; Marker? marker; } + +class FixedMarker { + LatLng position; + BitmapDescriptor? icon; + + FixedMarker({required this.position, this.icon}); +} From 6da646ea344a54a9434c0bcb20b3ba70e38de84b Mon Sep 17 00:00:00 2001 From: Sharjeel Yunus Date: Thu, 20 Feb 2025 01:32:04 +0500 Subject: [PATCH 6/9] feat(maps): add draggable marker functionality --- modules/location/lib/widget/maps/maps.dart | 3 +++ modules/location/lib/widget/maps/maps_state.dart | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/modules/location/lib/widget/maps/maps.dart b/modules/location/lib/widget/maps/maps.dart index ef38afac0..61bae3119 100644 --- a/modules/location/lib/widget/maps/maps.dart +++ b/modules/location/lib/widget/maps/maps.dart @@ -87,6 +87,8 @@ class EnsembleMapWidget extends StatefulWidget 'mapType': (value) => _controller.mapType = value, 'fixedMarker': (value) => _controller.fixedMarker = Utils.getBool(value, fallback: false), + 'draggableMarker': (value) => + _controller.draggableMarker = Utils.getBool(value, fallback: false), 'markers': (markerData) => setMarkers(markerData), 'scrollableMarkerOverlay': (value) => _controller .scrollableMarkerOverlay = @@ -188,6 +190,7 @@ class MyController extends WidgetController with LocationCapability { bool zoomEnabled = true; bool fixedMarker = false; + bool draggableMarker = false; // toolbar has multiple button options bool showToolbar = true; diff --git a/modules/location/lib/widget/maps/maps_state.dart b/modules/location/lib/widget/maps/maps_state.dart index e11af43ec..a519573af 100644 --- a/modules/location/lib/widget/maps/maps_state.dart +++ b/modules/location/lib/widget/maps/maps_state.dart @@ -264,6 +264,10 @@ class EnsembleMapState extends MapsActionableState position: markerPayload.latLng, icon: markerAsset ?? BitmapDescriptor.defaultMarker, consumeTapEvents: true, + draggable: widget.controller.draggableMarker, + onDrag: (latLng) { + _moveCamera(latLng); + }, onTap: () { _selectMarker(markerId); @@ -618,6 +622,10 @@ class EnsembleMapState extends MapsActionableState markerId: const MarkerId("fixed_marker"), position: _fixedMarker.position, icon: _fixedMarker.icon ?? BitmapDescriptor.defaultMarker, + draggable: widget.controller.draggableMarker, + onDrag: (position) { + _moveCamera(position); + }, )); } else { if (markerPayload.marker != null) { From 17eee92c2852ce7b8cc448db5d579dad3c6a43da Mon Sep 17 00:00:00 2001 From: Sharjeel Yunus Date: Thu, 20 Feb 2025 02:08:19 +0500 Subject: [PATCH 7/9] added comments --- modules/location/lib/widget/maps/maps.dart | 2 ++ modules/location/lib/widget/maps/maps_state.dart | 7 ++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/location/lib/widget/maps/maps.dart b/modules/location/lib/widget/maps/maps.dart index 61bae3119..274038b6b 100644 --- a/modules/location/lib/widget/maps/maps.dart +++ b/modules/location/lib/widget/maps/maps.dart @@ -189,7 +189,9 @@ class MyController extends WidgetController with LocationCapability { bool tiltEnabled = true; bool zoomEnabled = true; + // Determines whether the marker remains fixed at the center of the map when the user moves the map. bool fixedMarker = false; + // Determines whether the marker can be dragged by the user. bool draggableMarker = false; // toolbar has multiple button options diff --git a/modules/location/lib/widget/maps/maps_state.dart b/modules/location/lib/widget/maps/maps_state.dart index a519573af..86e8a5f8b 100644 --- a/modules/location/lib/widget/maps/maps_state.dart +++ b/modules/location/lib/widget/maps/maps_state.dart @@ -12,7 +12,6 @@ import 'package:ensemble/layout/templated.dart'; import 'package:ensemble/screen_controller.dart'; import 'package:ensemble/util/debouncer.dart'; import 'package:ensemble/util/utils.dart'; -import 'package:ensemble/widget/shape.dart'; import 'package:ensemble_location/location_manager.dart'; import 'package:ensemble_location/widget/maps/custom_marker_pin.dart'; import 'package:ensemble_location/widget/maps/map_actions.dart'; @@ -627,10 +626,8 @@ class EnsembleMapState extends MapsActionableState _moveCamera(position); }, )); - } else { - if (markerPayload.marker != null) { - markers.add(markerPayload.marker!); - } + } else if (markerPayload.marker != null) { + markers.add(markerPayload.marker!); } } From 1173409777bff010f8e789b96b2bc2b56576a1c6 Mon Sep 17 00:00:00 2001 From: Sharjeel Yunus Date: Thu, 20 Feb 2025 02:34:48 +0500 Subject: [PATCH 8/9] update fallback values for fixed and draggable markers --- modules/location/lib/widget/maps/maps.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/location/lib/widget/maps/maps.dart b/modules/location/lib/widget/maps/maps.dart index 274038b6b..741692502 100644 --- a/modules/location/lib/widget/maps/maps.dart +++ b/modules/location/lib/widget/maps/maps.dart @@ -85,10 +85,10 @@ class EnsembleMapWidget extends StatefulWidget _controller.toolbarRight = Utils.optionalInt(value, min: 0), 'mapType': (value) => _controller.mapType = value, - 'fixedMarker': (value) => - _controller.fixedMarker = Utils.getBool(value, fallback: false), - 'draggableMarker': (value) => - _controller.draggableMarker = Utils.getBool(value, fallback: false), + 'fixedMarker': (value) => _controller.fixedMarker = + Utils.getBool(value, fallback: _controller.fixedMarker), + 'draggableMarker': (value) => _controller.draggableMarker = + Utils.getBool(value, fallback: _controller.draggableMarker), 'markers': (markerData) => setMarkers(markerData), 'scrollableMarkerOverlay': (value) => _controller .scrollableMarkerOverlay = From 622908b5aae1b0a84df99c82a28a5ef67fcaafac Mon Sep 17 00:00:00 2001 From: Sharjeel Yunus Date: Thu, 20 Feb 2025 14:39:07 +0500 Subject: [PATCH 9/9] chore(release): publish packages - ensemble@1.1.24 --- CHANGELOG.md | 46 ++++++++++++++++++++++ modules/auth/pubspec.yaml | 2 +- modules/bracket/pubspec.yaml | 2 +- modules/camera/pubspec.yaml | 2 +- modules/chat/pubspec.yaml | 2 +- modules/connect/pubspec.yaml | 2 +- modules/contacts/pubspec.yaml | 2 +- modules/deeplink/pubspec.yaml | 2 +- modules/ensemble/CHANGELOG.md | 4 ++ modules/ensemble/pubspec.yaml | 2 +- modules/ensemble_bluetooth/pubspec.yaml | 2 +- modules/ensemble_network_info/pubspec.yaml | 2 +- modules/file_manager/pubspec.yaml | 2 +- modules/firebase_analytics/pubspec.yaml | 2 +- modules/location/pubspec.yaml | 2 +- modules/moengage/pubspec.yaml | 2 +- starter/pubspec.yaml | 2 +- 17 files changed, 65 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4890a6a58..c34ce07ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,52 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2025-02-20 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`ensemble` - `v1.1.24`](#ensemble---v1124) + - [`ensemble_contacts` - `v0.0.1+1`](#ensemble_contacts---v0011) + - [`ensemble_location` - `v0.0.1+1`](#ensemble_location---v0011) + - [`ensemble_chat` - `v0.0.1+1`](#ensemble_chat---v0011) + - [`ensemble_file_manager` - `v0.0.1+1`](#ensemble_file_manager---v0011) + - [`ensemble_auth` - `v1.0.1`](#ensemble_auth---v101) + - [`ensemble_connect` - `v0.0.1+1`](#ensemble_connect---v0011) + - [`ensemble_deeplink` - `v0.0.1+1`](#ensemble_deeplink---v0011) + - [`ensemble_network_info` - `v0.0.1+1`](#ensemble_network_info---v0011) + - [`ensemble_camera` - `v0.0.1+1`](#ensemble_camera---v0011) + - [`ensemble_bluetooth` - `v0.0.1+1`](#ensemble_bluetooth---v0011) + +Packages with dependency updates only: + +> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project. + + - `ensemble_contacts` - `v0.0.1+1` + - `ensemble_location` - `v0.0.1+1` + - `ensemble_chat` - `v0.0.1+1` + - `ensemble_file_manager` - `v0.0.1+1` + - `ensemble_auth` - `v1.0.1` + - `ensemble_connect` - `v0.0.1+1` + - `ensemble_deeplink` - `v0.0.1+1` + - `ensemble_network_info` - `v0.0.1+1` + - `ensemble_camera` - `v0.0.1+1` + - `ensemble_bluetooth` - `v0.0.1+1` + +--- + +#### `ensemble` - `v1.1.24` + + - Bump "ensemble" to `1.1.24`. + + ## 2025-02-19 ### Changes diff --git a/modules/auth/pubspec.yaml b/modules/auth/pubspec.yaml index e4270dbf1..540c7707c 100644 --- a/modules/auth/pubspec.yaml +++ b/modules/auth/pubspec.yaml @@ -28,7 +28,7 @@ dependencies: ensemble: git: url: https://github.com/EnsembleUI/ensemble.git - ref: ensemble-v1.1.23 + ref: ensemble-v1.1.24 path: modules/ensemble ensemble_ts_interpreter: diff --git a/modules/bracket/pubspec.yaml b/modules/bracket/pubspec.yaml index 6dfecd4f3..cc39430fb 100644 --- a/modules/bracket/pubspec.yaml +++ b/modules/bracket/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: ensemble: git: url: https://github.com/EnsembleUI/ensemble.git - ref: ensemble-v1.1.23 + ref: ensemble-v1.1.24 path: modules/ensemble dev_dependencies: diff --git a/modules/camera/pubspec.yaml b/modules/camera/pubspec.yaml index 4ea37527b..abcddfe7f 100644 --- a/modules/camera/pubspec.yaml +++ b/modules/camera/pubspec.yaml @@ -15,7 +15,7 @@ dependencies: ensemble: git: url: https://github.com/EnsembleUI/ensemble.git - ref: ensemble-v1.1.23 + ref: ensemble-v1.1.24 path: modules/ensemble ensemble_ts_interpreter: git: diff --git a/modules/chat/pubspec.yaml b/modules/chat/pubspec.yaml index 118716db0..c7c63d6b2 100644 --- a/modules/chat/pubspec.yaml +++ b/modules/chat/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: ensemble: git: url: https://github.com/EnsembleUI/ensemble.git - ref: ensemble-v1.1.23 + ref: ensemble-v1.1.24 path: modules/ensemble ensemble_ts_interpreter: diff --git a/modules/connect/pubspec.yaml b/modules/connect/pubspec.yaml index 756e0eb4a..bdcd92bf5 100644 --- a/modules/connect/pubspec.yaml +++ b/modules/connect/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: ensemble: git: url: https://github.com/EnsembleUI/ensemble.git - ref: ensemble-v1.1.23 + ref: ensemble-v1.1.24 path: modules/ensemble plaid_flutter: ^3.1.2 diff --git a/modules/contacts/pubspec.yaml b/modules/contacts/pubspec.yaml index 71ea8f92a..c57907a78 100644 --- a/modules/contacts/pubspec.yaml +++ b/modules/contacts/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: ensemble: git: url: https://github.com/EnsembleUI/ensemble.git - ref: ensemble-v1.1.23 + ref: ensemble-v1.1.24 path: modules/ensemble flutter_contacts: ^1.1.7+1 diff --git a/modules/deeplink/pubspec.yaml b/modules/deeplink/pubspec.yaml index a572246c5..bff9ad86a 100644 --- a/modules/deeplink/pubspec.yaml +++ b/modules/deeplink/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: ensemble: git: url: https://github.com/EnsembleUI/ensemble.git - ref: ensemble-v1.1.23 + ref: ensemble-v1.1.24 path: modules/ensemble flutter_branch_sdk: ^7.0.1 diff --git a/modules/ensemble/CHANGELOG.md b/modules/ensemble/CHANGELOG.md index 54ed3c693..3a8f1da96 100644 --- a/modules/ensemble/CHANGELOG.md +++ b/modules/ensemble/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.24 + + - Bump "ensemble" to `1.1.24`. + ## 1.1.23 ## 1.1.22 diff --git a/modules/ensemble/pubspec.yaml b/modules/ensemble/pubspec.yaml index e4a7823ee..ddaf25026 100644 --- a/modules/ensemble/pubspec.yaml +++ b/modules/ensemble/pubspec.yaml @@ -15,7 +15,7 @@ description: Ensemble Runtime # This version is used _only_ for the Runner app, which is used if you just do # a `flutter run` or a `flutter make-host-app-editable`. It has no impact # on any other native host app that you embed your Flutter project into. -version: 1.1.23 +version: 1.1.24 environment: sdk: ">=3.5.0" diff --git a/modules/ensemble_bluetooth/pubspec.yaml b/modules/ensemble_bluetooth/pubspec.yaml index 8229f6cc6..5fbd06e5c 100644 --- a/modules/ensemble_bluetooth/pubspec.yaml +++ b/modules/ensemble_bluetooth/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: ensemble: git: url: https://github.com/EnsembleUI/ensemble.git - ref: ensemble-v1.1.23 + ref: ensemble-v1.1.24 path: modules/ensemble ensemble_ts_interpreter: git: diff --git a/modules/ensemble_network_info/pubspec.yaml b/modules/ensemble_network_info/pubspec.yaml index 657a29af9..a3eceed9a 100644 --- a/modules/ensemble_network_info/pubspec.yaml +++ b/modules/ensemble_network_info/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: ensemble: git: url: https://github.com/EnsembleUI/ensemble.git - ref: ensemble-v1.1.23 + ref: ensemble-v1.1.24 path: modules/ensemble network_info_plus: ^5.0.3 diff --git a/modules/file_manager/pubspec.yaml b/modules/file_manager/pubspec.yaml index 5d4bfcdf2..5de8ffe23 100644 --- a/modules/file_manager/pubspec.yaml +++ b/modules/file_manager/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: ensemble: git: url: https://github.com/EnsembleUI/ensemble.git - ref: ensemble-v1.1.23 + ref: ensemble-v1.1.24 path: modules/ensemble ensemble_ts_interpreter: git: diff --git a/modules/firebase_analytics/pubspec.yaml b/modules/firebase_analytics/pubspec.yaml index bc1a7901e..f4467f8a8 100644 --- a/modules/firebase_analytics/pubspec.yaml +++ b/modules/firebase_analytics/pubspec.yaml @@ -40,7 +40,7 @@ dependencies: ensemble: git: url: https://github.com/EnsembleUI/ensemble.git - ref: ensemble-v1.1.23 + ref: ensemble-v1.1.24 path: modules/ensemble dev_dependencies: diff --git a/modules/location/pubspec.yaml b/modules/location/pubspec.yaml index b4577d233..02adc71fc 100644 --- a/modules/location/pubspec.yaml +++ b/modules/location/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: ensemble: git: url: https://github.com/EnsembleUI/ensemble.git - ref: ensemble-v1.1.23 + ref: ensemble-v1.1.24 path: modules/ensemble ensemble_ts_interpreter: diff --git a/modules/moengage/pubspec.yaml b/modules/moengage/pubspec.yaml index 72e1d4939..cab74dcda 100644 --- a/modules/moengage/pubspec.yaml +++ b/modules/moengage/pubspec.yaml @@ -37,7 +37,7 @@ dependencies: ensemble: git: url: https://github.com/EnsembleUI/ensemble.git - ref: ensemble-v1.1.23 + ref: ensemble-v1.1.24 path: modules/ensemble moengage_flutter: ^8.0.0 diff --git a/starter/pubspec.yaml b/starter/pubspec.yaml index 3331a9841..ad92c5151 100644 --- a/starter/pubspec.yaml +++ b/starter/pubspec.yaml @@ -36,7 +36,7 @@ dependencies: ensemble: git: url: https://github.com/EnsembleUI/ensemble.git - ref: ensemble-v1.1.23 + ref: ensemble-v1.1.24 path: modules/ensemble