diff --git a/assets/icons/automation_ic.svg b/assets/icons/automation_ic.svg
new file mode 100644
index 0000000..a655eb5
--- /dev/null
+++ b/assets/icons/automation_ic.svg
@@ -0,0 +1,23 @@
+
diff --git a/lib/features/app_layout/bloc/home_cubit.dart b/lib/features/app_layout/bloc/home_cubit.dart
index 3e85cdc..29773da 100644
--- a/lib/features/app_layout/bloc/home_cubit.dart
+++ b/lib/features/app_layout/bloc/home_cubit.dart
@@ -370,6 +370,9 @@ class HomeCubit extends Cubit {
.add(const SmartSceneClearEvent());
BlocProvider.of(NavigationService.navigatorKey.currentState!.context)
.add(ResetEffectivePeriod());
+ NavigationService.navigatorKey.currentContext!
+ .read()
+ .add(const ClearTabToRunSetting());
},
),
IconButton(
diff --git a/lib/features/devices/view/widgets/scene_listview.dart b/lib/features/devices/view/widgets/scene_listview.dart
index 63b770f..4fa2031 100644
--- a/lib/features/devices/view/widgets/scene_listview.dart
+++ b/lib/features/devices/view/widgets/scene_listview.dart
@@ -40,13 +40,10 @@ class SceneListview extends StatelessWidget {
sceneName: scene.name,
),
);
- context
- .read()
- .add(const SmartSceneClearEvent());
+ context.read().add(const SmartSceneClearEvent());
- BlocProvider.of(context).add(
- FetchSceneTasksEvent(
- sceneId: scene.id, isAutomation: false));
+ BlocProvider.of(context)
+ .add(FetchSceneTasksEvent(sceneId: scene.id, isAutomation: false));
/// the state to set the scene type must be after the fetch
BlocProvider.of(context)
@@ -59,11 +56,13 @@ class SceneListview extends StatelessWidget {
children: [
Padding(
padding: const EdgeInsets.all(8.0),
- child: Image.asset(
+ child: Image.memory(
height: 32,
width: 32,
- Assets.assetsIconsLogo,
+ scene.iconInBytes,
fit: BoxFit.fill,
+ errorBuilder: (context, error, stackTrace) => Image.asset(
+ height: 32, width: 32, fit: BoxFit.fill, Assets.assetsIconsLogo),
),
),
Expanded(
diff --git a/lib/features/scene/bloc/create_scene/create_scene_bloc.dart b/lib/features/scene/bloc/create_scene/create_scene_bloc.dart
index 0a52b02..024faf4 100644
--- a/lib/features/scene/bloc/create_scene/create_scene_bloc.dart
+++ b/lib/features/scene/bloc/create_scene/create_scene_bloc.dart
@@ -1,5 +1,4 @@
import 'dart:async';
-import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/model/device_control_model.dart';
@@ -10,6 +9,7 @@ import 'package:syncrow_app/features/scene/enum/operation_dialog_type.dart';
import 'package:syncrow_app/features/scene/helper/scene_operations_data_helper.dart';
import 'package:syncrow_app/features/scene/model/create_automation_model.dart';
import 'package:syncrow_app/features/scene/model/create_scene_model.dart';
+import 'package:syncrow_app/features/scene/model/icon_model.dart';
import 'package:syncrow_app/features/scene/model/scene_static_function.dart';
import 'package:syncrow_app/navigation/navigation_service.dart';
import 'package:syncrow_app/services/api/scene_api.dart';
@@ -36,6 +36,10 @@ class CreateSceneBloc extends Bloc
on(_selectConditionRule);
on(_sceneTypeEvent);
on(_onEffectiveTimeEvent);
+ on(_fetchIconScene);
+ on(_iconSelected);
+ on(_showInDeviceClicked);
+ on(_clearTabToRunSetting);
}
CreateSceneEnum sceneType = CreateSceneEnum.none;
@@ -52,6 +56,9 @@ class CreateSceneBloc extends Bloc
final Map automationComparatorValues = {};
String conditionRule = 'or';
EffectiveTime? effectiveTime;
+ List iconModelList = [];
+ String selectedIcon = '';
+ bool showInDeviceScreen = false;
FutureOr _onAddSceneTask(AddTaskEvent event, Emitter emit) {
emit(CreateSceneLoading());
@@ -350,6 +357,8 @@ class CreateSceneBloc extends Bloc
automationTempTasksList.clear();
automationSelectedValues.clear();
automationComparatorValues.clear();
+ selectedIcon = '';
+ showInDeviceScreen = false;
effectiveTime = EffectiveTime(start: '00:00', end: '23:59', loops: '1111111');
sceneType = CreateSceneEnum.none;
conditionRule = 'or';
@@ -380,6 +389,19 @@ class CreateSceneBloc extends Bloc
));
}
+ FutureOr _clearTabToRunSetting(ClearTabToRunSetting event, Emitter emit) {
+ emit(CreateSceneLoading());
+ selectedIcon = '';
+ showInDeviceScreen = false;
+ emit(AddSceneTask(
+ tasksList: tasksList,
+ automationTasksList: automationTasksList,
+ condition: conditionRule,
+ showInDevice: showInDeviceScreen,
+ selectedIcon: selectedIcon,
+ iconModels: iconModelList));
+ }
+
FutureOr _fetchSceneTasks(
FetchSceneTasksEvent event, Emitter emit) async {
emit(CreateSceneLoading());
@@ -392,6 +414,8 @@ class CreateSceneBloc extends Bloc
automationTempTasksList.clear();
automationSelectedValues.clear();
automationComparatorValues.clear();
+ selectedIcon = '';
+ showInDeviceScreen = false;
effectiveTime = EffectiveTime(start: '00:00', end: '23:59', loops: '1111111');
sceneType = CreateSceneEnum.none;
conditionRule = 'or';
@@ -425,17 +449,23 @@ class CreateSceneBloc extends Bloc
.add(SetCustomTime(effectiveTime!.start, effectiveTime!.end));
emit(AddSceneTask(
- automationTasksList: automationTasksList,
- tasksList: tasksList,
- condition: conditionRule,
- ));
+ automationTasksList: automationTasksList,
+ tasksList: tasksList,
+ condition: conditionRule,
+ iconModels: iconModelList,
+ selectedIcon: selectedIcon,
+ showInDevice: showInDeviceScreen));
} else {
tasksList = List.from(
getTaskListFunctionsFromApi(actions: response.actions, isAutomation: false));
+ selectedIcon = response.icon!;
+ showInDeviceScreen = response.showInDevice!;
emit(AddSceneTask(
- tasksList: tasksList,
- condition: conditionRule,
- ));
+ tasksList: tasksList,
+ condition: conditionRule,
+ iconModels: iconModelList,
+ selectedIcon: selectedIcon,
+ showInDevice: showInDeviceScreen));
}
} else {
emit(const CreateSceneError(message: 'Something went wrong'));
@@ -445,6 +475,57 @@ class CreateSceneBloc extends Bloc
}
}
+ FutureOr _fetchIconScene(SceneIconEvent event, Emitter emit) async {
+ emit(CreateSceneLoading());
+ try {
+ iconModelList = await SceneApi.getIcon();
+ emit(AddSceneTask(
+ tasksList: tasksList,
+ automationTasksList: automationTasksList,
+ condition: conditionRule,
+ showInDevice: showInDeviceScreen,
+ selectedIcon: selectedIcon,
+ iconModels: iconModelList));
+ } catch (e) {
+ emit(const CreateSceneError(message: 'Something went wrong'));
+ }
+ }
+
+ FutureOr _iconSelected(IconSelected event, Emitter emit) async {
+ try {
+ if (event.confirmSelection) {
+ selectedIcon = event.iconId;
+ }
+ emit(CreateSceneLoading());
+ emit(AddSceneTask(
+ tasksList: tasksList,
+ automationTasksList: automationTasksList,
+ showInDevice: showInDeviceScreen,
+ condition: conditionRule,
+ selectedIcon: event.iconId,
+ iconModels: iconModelList));
+ } catch (e) {
+ emit(const CreateSceneError(message: 'Something went wrong'));
+ }
+ }
+
+ FutureOr _showInDeviceClicked(
+ ShowOnDeviceClicked event, Emitter emit) async {
+ try {
+ emit(CreateSceneLoading());
+ showInDeviceScreen = event.value;
+ emit(AddSceneTask(
+ tasksList: tasksList,
+ automationTasksList: automationTasksList,
+ condition: conditionRule,
+ selectedIcon: selectedIcon,
+ iconModels: iconModelList,
+ showInDevice: showInDeviceScreen));
+ } catch (e) {
+ emit(const CreateSceneError(message: 'Something went wrong'));
+ }
+ }
+
String _getDayFromIndex(int index) {
const days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
return days[index];
diff --git a/lib/features/scene/bloc/create_scene/create_scene_event.dart b/lib/features/scene/bloc/create_scene/create_scene_event.dart
index 74046bd..2b79f6d 100644
--- a/lib/features/scene/bloc/create_scene/create_scene_event.dart
+++ b/lib/features/scene/bloc/create_scene/create_scene_event.dart
@@ -149,8 +149,7 @@ class FetchSceneTasksEvent extends CreateSceneEvent {
final String sceneId;
final bool isAutomation;
- const FetchSceneTasksEvent(
- {this.isAutomation = false, required this.sceneId});
+ const FetchSceneTasksEvent({this.isAutomation = false, required this.sceneId});
@override
List