Skip to content

Commit fb80cc2

Browse files
committed
Merge branch 'dev'
2 parents 13d6ade + 0b56397 commit fb80cc2

22 files changed

+995
-370
lines changed

ios/Runner.xcodeproj/project.pbxproj

+6-6
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@
357357
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
358358
CLANG_ENABLE_MODULES = YES;
359359
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
360-
CURRENT_PROJECT_VERSION = 1.4.0.2;
360+
CURRENT_PROJECT_VERSION = 1.4.2.0;
361361
DEVELOPMENT_TEAM = 7E4SDTQ3GK;
362362
ENABLE_BITCODE = NO;
363363
FRAMEWORK_SEARCH_PATHS = (
@@ -374,7 +374,7 @@
374374
"$(inherited)",
375375
"$(PROJECT_DIR)/Flutter",
376376
);
377-
MARKETING_VERSION = 1.4.0;
377+
MARKETING_VERSION = 1.4.2;
378378
PRODUCT_BUNDLE_IDENTIFIER = com.mobileraker.ios;
379379
PRODUCT_NAME = "$(TARGET_NAME)";
380380
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -497,7 +497,7 @@
497497
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
498498
CLANG_ENABLE_MODULES = YES;
499499
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
500-
CURRENT_PROJECT_VERSION = 1.4.0.2;
500+
CURRENT_PROJECT_VERSION = 1.4.2.0;
501501
DEVELOPMENT_TEAM = 7E4SDTQ3GK;
502502
ENABLE_BITCODE = NO;
503503
FRAMEWORK_SEARCH_PATHS = (
@@ -514,7 +514,7 @@
514514
"$(inherited)",
515515
"$(PROJECT_DIR)/Flutter",
516516
);
517-
MARKETING_VERSION = 1.4.0;
517+
MARKETING_VERSION = 1.4.2;
518518
PRODUCT_BUNDLE_IDENTIFIER = com.mobileraker.ios;
519519
PRODUCT_NAME = "$(TARGET_NAME)";
520520
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -531,7 +531,7 @@
531531
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
532532
CLANG_ENABLE_MODULES = YES;
533533
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
534-
CURRENT_PROJECT_VERSION = 1.4.0.2;
534+
CURRENT_PROJECT_VERSION = 1.4.2.0;
535535
DEVELOPMENT_TEAM = 7E4SDTQ3GK;
536536
ENABLE_BITCODE = NO;
537537
FRAMEWORK_SEARCH_PATHS = (
@@ -548,7 +548,7 @@
548548
"$(inherited)",
549549
"$(PROJECT_DIR)/Flutter",
550550
);
551-
MARKETING_VERSION = 1.4.0;
551+
MARKETING_VERSION = 1.4.2;
552552
PRODUCT_BUNDLE_IDENTIFIER = com.mobileraker.ios;
553553
PRODUCT_NAME = "$(TARGET_NAME)";
554554
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";

ios/Runner/Info.plist

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
</array>
3030
<key>LSRequiresIPhoneOS</key>
3131
<true/>
32+
<key>NSCameraUsageDescription</key>
33+
<string>Please provide access to the camera in order to scan QR codes.</string>
3234
<key>UIBackgroundModes</key>
3335
<array>
3436
<string>fetch</string>

lib/app/app_setup.dart

+4
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@ import 'package:mobileraker/ui/views/files/details/file_details_view.dart';
1313
import 'package:mobileraker/ui/views/files/files_view.dart';
1414
import 'package:mobileraker/ui/views/fullcam/full_cam_view.dart';
1515
import 'package:mobileraker/ui/views/overview/overview_view.dart';
16+
import 'package:mobileraker/ui/views/overview/tabs/control_tab_viewmodel.dart';
1617
import 'package:mobileraker/ui/views/overview/tabs/general_tab_viewmodel.dart';
1718
import 'package:mobileraker/ui/views/printers/add/printers_add_view.dart';
1819
import 'package:mobileraker/ui/views/printers/edit/printers_edit_view.dart';
1920
import 'package:mobileraker/ui/views/printers/qr_scanner/qr_scanner_view.dart';
21+
import 'package:mobileraker/ui/views/setting/imprint/imprint_view.dart';
2022
import 'package:mobileraker/ui/views/setting/setting_view.dart';
2123
import 'package:stacked/stacked_annotations.dart';
2224
import 'package:stacked_services/stacked_services.dart';
@@ -29,6 +31,7 @@ import 'package:stacked_services/stacked_services.dart';
2931
MaterialRoute(page: FilesView),
3032
MaterialRoute(page: FileDetailView),
3133
MaterialRoute(page: SettingView),
34+
MaterialRoute(page: ImprintView),
3235
MaterialRoute(page: QrScannerView),
3336
], dependencies: [
3437
LazySingleton(classType: NavigationService),
@@ -37,6 +40,7 @@ import 'package:stacked_services/stacked_services.dart';
3740
LazySingleton(classType: DialogService),
3841
LazySingleton(classType: BottomSheetService),
3942
LazySingleton(classType: GeneralTabViewModel),
43+
LazySingleton(classType: ControlTabViewModel),
4044
Singleton(classType: PrinterSettingHiveRepository),
4145
Singleton(classType: MachineService),
4246
Singleton(classType: SettingService),

lib/enums/dialog_type.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
enum DialogType { numEditForm, textEditForm, importSettings }
1+
enum DialogType { numEditForm, rangeEditForm, textEditForm, importSettings }

lib/service/machine_service.dart

+61-11
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,17 @@ class MachineService {
5353
}
5454

5555
Future<void> removeMachine(PrinterSetting printerSetting) async {
56-
_printerSettingRepo.remove(printerSetting.uuid);
57-
if (_boxUuid.get('selectedPrinter') == printerSetting.uuid) {
58-
PrinterSetting? machine = await _printerSettingRepo.get(index: 0);
59-
await setMachineActive(machine);
56+
_logger.i("Removing machine ${printerSetting.uuid}");
57+
await _printerSettingRepo.remove(printerSetting.uuid);
58+
if (selectedMachine.valueOrNull == printerSetting) {
59+
_logger.i("Machine ${printerSetting.uuid} is active machine");
60+
List<PrinterSetting> remainingPrinters =
61+
await _printerSettingRepo.fetchAll();
62+
63+
PrinterSetting? nextMachine =
64+
remainingPrinters.length > 0 ? remainingPrinters.first : null;
65+
66+
await setMachineActive(nextMachine);
6067
}
6168
}
6269

@@ -65,14 +72,18 @@ class MachineService {
6572
}
6673

6774
setMachineActive(PrinterSetting? printerSetting) async {
68-
if (printerSetting == selectedMachine.valueOrNull) return;
69-
// This case will be called when no printer is left! -> Select no printer as active printer
7075
if (printerSetting == null) {
76+
// This case sets no printer as active!
7177
await _boxUuid.delete('selectedPrinter');
7278
if (!selectedMachine.isClosed) selectedMachine.add(null);
79+
80+
_logger.i(
81+
"Selecting no printer as active Printer. Stream is closed?: ${selectedMachine.isClosed}");
7382
return;
7483
}
7584

85+
if (printerSetting == selectedMachine.valueOrNull) return;
86+
7687
await _boxUuid.put('selectedPrinter', printerSetting.key);
7788
if (!selectedMachine.isClosed) selectedMachine.add(printerSetting);
7889
}
@@ -112,26 +123,65 @@ class MachineService {
112123
Future<String> fetchOrCreateFcmIdentifier(
113124
PrinterSetting printerSetting) async {
114125
var idFromSetting = printerSetting.fcmIdentifier;
115-
if (idFromSetting != null)
116-
return idFromSetting;
126+
if (idFromSetting != null) return idFromSetting;
117127
DatabaseService databaseService = printerSetting.databaseService;
118128

119129
String? item =
120130
await databaseService.getDatabaseItem('mobileraker', 'printerId');
121131
if (item == null) {
122132
String nId = Uuid().v4();
123-
_logger.i("Creating fcm-PrinterId in moonraker-Database: $nId");
124133
item = await databaseService.addDatabaseItem(
125134
'mobileraker', 'printerId', nId);
135+
_logger.i("Registered fcm-PrinterId in MoonrakerDB: $nId");
136+
126137
}
127-
_logger.i(
128-
"Fcm-PrinterId from moonraker-Database in PrinterSettings = $item");
138+
_logger
139+
.i("Got FCM-PrinterID from MoonrakerDB to set in Settings:$item");
129140

130141
printerSetting.fcmIdentifier = item;
131142
await printerSetting.save();
132143
return item!;
133144
}
134145

146+
Future<void> registerFCMTokenOnMachineNEW(
147+
PrinterSetting printerSetting, String fcmToken) async {
148+
DatabaseService databaseService = printerSetting.databaseService;
149+
Map<String, dynamic>? item =
150+
await databaseService.getDatabaseItem('mobileraker', 'fcm.$fcmToken');
151+
if (item == null) {
152+
item = {'printerName': printerSetting.name};
153+
item = await databaseService.addDatabaseItem(
154+
'mobileraker', 'fcm.$fcmToken', item);
155+
_logger.i("Registered FCM Token in MoonrakerDB: $item");
156+
} else if (item['printerName'] != printerSetting.name) {
157+
item['printerName'] = printerSetting.name;
158+
item = await databaseService.addDatabaseItem(
159+
'mobileraker', 'fcm.$fcmToken', item);
160+
_logger.i("Updated Printer's name in MoonrakerDB: $item");
161+
}
162+
_logger.i("Got FCM data from MoonrakerDB: $item");
163+
}
164+
165+
Future<void> registerFCMTokenOnMachine(
166+
PrinterSetting printerSetting, String fcmToken) async {
167+
DatabaseService databaseService = printerSetting.databaseService;
168+
169+
var item =
170+
await databaseService.getDatabaseItem('mobileraker', 'fcmTokens');
171+
if (item == null) {
172+
_logger.i("Creating fcmTokens in moonraker-Database");
173+
await databaseService
174+
.addDatabaseItem('mobileraker', 'fcmTokens', [fcmToken]);
175+
} else {
176+
List<String> fcmTokens = List.from(item);
177+
if (!fcmTokens.contains(fcmToken)) {
178+
_logger.i("Adding token to existing fcmTokens in moonraker-Database");
179+
await databaseService.addDatabaseItem(
180+
'mobileraker', 'fcmTokens', fcmTokens..add(fcmToken));
181+
}
182+
}
183+
}
184+
135185
Future<PrinterSetting?> machineFromFcmIdentifier(String fcmIdentifier) async {
136186
List<PrinterSetting> machines = await fetchAll();
137187
for (PrinterSetting element in machines)

lib/service/notification_service.dart

+34-49
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import 'package:mobileraker/firebase_options.dart';
2121
import 'package:mobileraker/service/printer_service.dart';
2222
import 'package:mobileraker/ui/theme_setup.dart';
2323

24-
import 'database_service.dart';
2524
import 'machine_service.dart';
2625

2726
class NotificationService {
@@ -84,24 +83,24 @@ class NotificationService {
8483

8584
Future<void> initialize() async {
8685
List<PrinterSetting> allMachines = await _machineService.fetchAll();
87-
List<NotificationChannelGroup> groups = [];
88-
List<NotificationChannel> channels = [];
89-
for (PrinterSetting setting in allMachines) {
90-
groups.add(_channelGroupOfPrinterSettings(setting));
91-
channels.addAll(_channelsOfPrinterSettings(setting));
92-
_setupFCMOnPrinterOnceConnected(setting);
93-
}
9486

95-
await setupNotificationChannels(groups, channels);
96-
await setupFirebaseMessaging();
87+
allMachines.forEach(_setupFCMOnPrinterOnceConnected);
88+
89+
await setupNotificationChannels(allMachines);
9790

9891
for (PrinterSetting setting in allMachines) {
99-
_printerStreamMap[setting.uuid] = setting.printerService.printerStream
100-
.listen((value) => _processPrinterUpdate(setting, value));
92+
registerLocalMessageHandling(setting);
10193
}
10294

10395
_hiveStreamListener = setupHiveBoxListener();
10496
_actionStreamListener = setupNotificationActionListener();
97+
await setupFirebaseMessaging();
98+
}
99+
100+
void registerLocalMessageHandling(PrinterSetting setting) {
101+
if (Platform.isIOS) return;
102+
_printerStreamMap[setting.uuid] = setting.printerService.printerStream
103+
.listen((value) => _processPrinterUpdate(setting, value));
105104
}
106105

107106
StreamSubscription<ReceivedAction> setupNotificationActionListener() {
@@ -122,13 +121,19 @@ class NotificationService {
122121
});
123122
}
124123

125-
setupNotificationChannels(List<NotificationChannelGroup> printerNotifyGrp,
126-
List<NotificationChannel> printerNotifyChan) async {
124+
setupNotificationChannels(List<PrinterSetting> machines) async {
125+
List<NotificationChannelGroup> groups = [];
126+
List<NotificationChannel> channels = [];
127+
for (PrinterSetting setting in machines) {
128+
groups.add(_channelGroupOfPrinterSettings(setting));
129+
channels.addAll(_channelsOfPrinterSettings(setting));
130+
}
131+
127132
await AwesomeNotifications().initialize(
128133
// set the icon to null if you want to use the default app icon
129134
null,
130-
printerNotifyChan,
131-
channelGroups: printerNotifyGrp);
135+
channels,
136+
channelGroups: groups);
132137

133138
await AwesomeNotifications().isNotificationAllowed().then((isAllowed) {
134139
if (!isAllowed) {
@@ -175,8 +180,7 @@ class NotificationService {
175180
_channelsOfPrinterSettings(setting);
176181
channelsOfPrinterSettings.forEach((e) => _notifyAPI.setChannel(e));
177182
_setupFCMOnPrinterOnceConnected(setting);
178-
_printerStreamMap[setting.uuid] = setting.printerService.printerStream
179-
.listen((value) => _processPrinterUpdate(setting, value));
183+
registerLocalMessageHandling(setting);
180184
_logger.i(
181185
"Added notifications channels and stream-listener for UUID=${setting.uuid}");
182186
}
@@ -189,35 +193,6 @@ class NotificationService {
189193
.i("Removed notifications channels and stream-listener for UUID=$uuid");
190194
}
191195

192-
/// Register the FCM token of the device in the moonraker database to ensure
193-
/// that our python companion knows the notification targets!
194-
Future<String> _registerFCMTokenOnMachine(
195-
PrinterSetting printerSetting) async {
196-
DatabaseService databaseService = printerSetting.databaseService;
197-
String? fcmToken = await FirebaseMessaging.instance.getToken();
198-
if (fcmToken == null) {
199-
_logger.w("Could not fetch fcm token");
200-
return Future.error("No token available for device!");
201-
}
202-
203-
var item =
204-
await databaseService.getDatabaseItem('mobileraker', 'fcmTokens');
205-
if (item == null) {
206-
_logger.i("Creating fcmTokens in moonraker-Database");
207-
await databaseService
208-
.addDatabaseItem('mobileraker', 'fcmTokens', [fcmToken]);
209-
} else {
210-
List<String> fcmTokens = List.from(item);
211-
if (!fcmTokens.contains(fcmToken)) {
212-
_logger.i("Adding token to existing fcmTokens in moonraker-Database");
213-
await databaseService.addDatabaseItem(
214-
'mobileraker', 'fcmTokens', fcmTokens..add(fcmToken));
215-
}
216-
}
217-
218-
return fcmToken;
219-
}
220-
221196
List<NotificationChannel> _channelsOfPrinterSettings(
222197
PrinterSetting printerSetting) {
223198
return [
@@ -236,6 +211,7 @@ class NotificationService {
236211
playSound: false,
237212
enableVibration: false,
238213
enableLights: false,
214+
importance: NotificationImportance.Low,
239215
defaultColor: brownish.shade500)
240216
];
241217
}
@@ -250,16 +226,25 @@ class NotificationService {
250226
Future<void> _setupFCMOnPrinterOnceConnected(PrinterSetting setting) async {
251227
await setting.websocket.stateStream
252228
.firstWhere((element) => element == WebSocketState.connected);
229+
230+
String? fcmToken = await FirebaseMessaging.instance.getToken();
231+
if (fcmToken == null) {
232+
_logger.w("Could not fetch fcm token");
233+
return Future.error("No token available for device!");
234+
}
235+
253236
_machineService.fetchOrCreateFcmIdentifier(setting);
254-
_registerFCMTokenOnMachine(setting);
237+
_machineService.registerFCMTokenOnMachine(setting, fcmToken);
238+
239+
// _machineService.registerFCMTokenOnMachineNEW(setting, fcmToken);
255240
}
256241

257242
Future<void> _processPrinterUpdate(
258243
PrinterSetting printerSetting, Printer printer) async {
259244
var state = await _updatePrintStatusNotification(
260245
printerSetting, printer.print.state, printer.print.filename);
261246

262-
if (state == PrintState.printing)
247+
if (state == PrintState.printing && !Platform.isIOS)
263248
_updatePrintProgressNotification(printerSetting,
264249
printer.virtualSdCard.progress, printer.print.printDuration);
265250
await printerSetting.save();

0 commit comments

Comments
 (0)