Browse Source

Merge pull request #2224 from nextcloud/widget-imp

Widget imp
Marino Faggiana 2 years ago
parent
commit
78e1846756
64 changed files with 499 additions and 999 deletions
  1. 26 112
      Nextcloud.xcodeproj/project.pbxproj
  2. 9 7
      Widget/Dashboard/DashboardData.swift
  3. 3 3
      Widget/Dashboard/DashboardWidgetProvider.swift
  4. 0 16
      Widget/Dashboard/Intent/ca.lproj/Dashboard.strings
  5. 0 16
      Widget/Dashboard/Intent/cs-CZ.lproj/Dashboard.strings
  6. 0 16
      Widget/Dashboard/Intent/da.lproj/Dashboard.strings
  7. 0 16
      Widget/Dashboard/Intent/de.lproj/Dashboard.strings
  8. 0 16
      Widget/Dashboard/Intent/en-GB.lproj/Dashboard.strings
  9. 0 16
      Widget/Dashboard/Intent/en.lproj/Dashboard.strings
  10. 0 16
      Widget/Dashboard/Intent/es-419.lproj/Dashboard.strings
  11. 0 16
      Widget/Dashboard/Intent/es-CL.lproj/Dashboard.strings
  12. 0 16
      Widget/Dashboard/Intent/es-CO.lproj/Dashboard.strings
  13. 0 16
      Widget/Dashboard/Intent/es-CR.lproj/Dashboard.strings
  14. 0 16
      Widget/Dashboard/Intent/es-DO.lproj/Dashboard.strings
  15. 0 16
      Widget/Dashboard/Intent/es-EC.lproj/Dashboard.strings
  16. 0 16
      Widget/Dashboard/Intent/es-GT.lproj/Dashboard.strings
  17. 0 16
      Widget/Dashboard/Intent/es-HN.lproj/Dashboard.strings
  18. 0 16
      Widget/Dashboard/Intent/es-MX.lproj/Dashboard.strings
  19. 0 16
      Widget/Dashboard/Intent/es-NI.lproj/Dashboard.strings
  20. 0 16
      Widget/Dashboard/Intent/es-PA.lproj/Dashboard.strings
  21. 0 16
      Widget/Dashboard/Intent/es-PE.lproj/Dashboard.strings
  22. 0 16
      Widget/Dashboard/Intent/es-PR.lproj/Dashboard.strings
  23. 0 16
      Widget/Dashboard/Intent/es-PY.lproj/Dashboard.strings
  24. 0 16
      Widget/Dashboard/Intent/es-SV.lproj/Dashboard.strings
  25. 0 16
      Widget/Dashboard/Intent/es-UY.lproj/Dashboard.strings
  26. 0 16
      Widget/Dashboard/Intent/es.lproj/Dashboard.strings
  27. 0 16
      Widget/Dashboard/Intent/eu.lproj/Dashboard.strings
  28. 0 16
      Widget/Dashboard/Intent/fr.lproj/Dashboard.strings
  29. 0 16
      Widget/Dashboard/Intent/gl.lproj/Dashboard.strings
  30. 0 16
      Widget/Dashboard/Intent/hu.lproj/Dashboard.strings
  31. 0 16
      Widget/Dashboard/Intent/is.lproj/Dashboard.strings
  32. 0 16
      Widget/Dashboard/Intent/it.lproj/Dashboard.strings
  33. 0 16
      Widget/Dashboard/Intent/ja-JP.lproj/Dashboard.strings
  34. 0 16
      Widget/Dashboard/Intent/ka-GE.lproj/Dashboard.strings
  35. 0 16
      Widget/Dashboard/Intent/ko.lproj/Dashboard.strings
  36. 0 16
      Widget/Dashboard/Intent/nb-NO.lproj/Dashboard.strings
  37. 0 16
      Widget/Dashboard/Intent/nl.lproj/Dashboard.strings
  38. 0 16
      Widget/Dashboard/Intent/pl.lproj/Dashboard.strings
  39. 0 16
      Widget/Dashboard/Intent/pt-BR.lproj/Dashboard.strings
  40. 0 16
      Widget/Dashboard/Intent/pt-PT.lproj/Dashboard.strings
  41. 0 16
      Widget/Dashboard/Intent/ru.lproj/Dashboard.strings
  42. 0 16
      Widget/Dashboard/Intent/sk-SK.lproj/Dashboard.strings
  43. 0 16
      Widget/Dashboard/Intent/sr.lproj/Dashboard.strings
  44. 0 16
      Widget/Dashboard/Intent/sv.lproj/Dashboard.strings
  45. 0 16
      Widget/Dashboard/Intent/tr.lproj/Dashboard.strings
  46. 0 16
      Widget/Dashboard/Intent/zh-Hans.lproj/Dashboard.strings
  47. 0 16
      Widget/Dashboard/Intent/zh-Hant-TW.lproj/Dashboard.strings
  48. 39 30
      Widget/Files/FilesData.swift
  49. 9 7
      Widget/Files/FilesWidgetProvider.swift
  50. 66 42
      Widget/Files/FilesWidgetView.swift
  51. 158 20
      Widget/Intent/Base.lproj/Intent.intentdefinition
  52. 30 0
      Widget/Intent/en.lproj/Intent.strings
  53. 11 2
      Widget/Lockscreen/LockscreenData.swift
  54. 7 5
      Widget/Lockscreen/LockscreenWidgetProvider.swift
  55. 13 3
      Widget/Toolbar/ToolbarData.swift
  56. 1 1
      Widget/Toolbar/ToolbarWidgetProvider.swift
  57. 12 5
      Widget/Toolbar/ToolbarWidgetView.swift
  58. 3 2
      Widget/Widget.swift
  59. 49 4
      WidgetDashboardIntentHandler/IntentHandler.swift
  60. 55 44
      iOSClient/AppDelegate.swift
  61. 1 1
      iOSClient/Brand/WidgetDashboardIntentHandler.plist
  62. 1 1
      iOSClient/Brand/iOSClient.plist
  63. 5 5
      iOSClient/NCGlobal.swift
  64. 1 1
      iOSClient/Supporting Files/en.lproj/Localizable.strings

+ 26 - 112
Nextcloud.xcodeproj/project.pbxproj

@@ -241,6 +241,9 @@
 		F75B0ABD244C4DBB00E58DCA /* NCFunctionCenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F75B0ABC244C4DBB00E58DCA /* NCFunctionCenter.swift */; };
 		F75C0C4823D1FAE300163CC8 /* NCRichWorkspaceCommon.swift in Sources */ = {isa = PBXBuildFile; fileRef = F75C0C4723D1FAE300163CC8 /* NCRichWorkspaceCommon.swift */; };
 		F75D19E325EFE09000D74598 /* NCTrash+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = F75D19E225EFE09000D74598 /* NCTrash+Menu.swift */; };
+		F75DD765290ABB25002EB562 /* Intent.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = F75DD769290ABB25002EB562 /* Intent.intentdefinition */; };
+		F75DD766290ABB25002EB562 /* Intent.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = F75DD769290ABB25002EB562 /* Intent.intentdefinition */; };
+		F75DD767290ABB25002EB562 /* Intent.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = F75DD769290ABB25002EB562 /* Intent.intentdefinition */; };
 		F75E57BD25BF0EC1002B72C2 /* SVGKit in Frameworks */ = {isa = PBXBuildFile; productRef = F75E57BC25BF0EC1002B72C2 /* SVGKit */; };
 		F75E57BF25BF0EC8002B72C2 /* SVGKit in Frameworks */ = {isa = PBXBuildFile; productRef = F75E57BE25BF0EC8002B72C2 /* SVGKit */; };
 		F75E57C125BF0ECD002B72C2 /* SVGKit in Frameworks */ = {isa = PBXBuildFile; productRef = F75E57C025BF0ECD002B72C2 /* SVGKit */; };
@@ -439,7 +442,6 @@
 		F7C9739228F17131002C43E2 /* Intents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F7C9739128F17131002C43E2 /* Intents.framework */; };
 		F7C9739528F17131002C43E2 /* IntentHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7C9739428F17131002C43E2 /* IntentHandler.swift */; };
 		F7C9739928F17131002C43E2 /* WidgetDashboardIntentHandler.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = F7C9739028F17131002C43E2 /* WidgetDashboardIntentHandler.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
-		F7C9739D28F1733B002C43E2 /* Dashboard.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = F7FABE3928D1DAD00000A325 /* Dashboard.intentdefinition */; };
 		F7CA212D25F1333300826ABB /* NCAccountRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7CA212B25F1333200826ABB /* NCAccountRequest.swift */; };
 		F7CA212E25F1333300826ABB /* NCAccountRequest.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F7CA212C25F1333200826ABB /* NCAccountRequest.storyboard */; };
 		F7CB689A2541676B0050EC94 /* NCMore.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F7CB68992541676B0050EC94 /* NCMore.storyboard */; };
@@ -499,8 +501,6 @@
 		F7F878AE1FB9E3B900599E4F /* NCEndToEndMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F878AD1FB9E3B900599E4F /* NCEndToEndMetadata.swift */; };
 		F7F878AF1FB9E3B900599E4F /* NCEndToEndMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F878AD1FB9E3B900599E4F /* NCEndToEndMetadata.swift */; };
 		F7F9D1BB25397CE000D9BFF5 /* NCViewer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F9D1BA25397CE000D9BFF5 /* NCViewer.swift */; };
-		F7FABE3628D1DAD00000A325 /* Dashboard.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = F7FABE3928D1DAD00000A325 /* Dashboard.intentdefinition */; };
-		F7FABE3728D1DAD00000A325 /* Dashboard.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = F7FABE3928D1DAD00000A325 /* Dashboard.intentdefinition */; settings = {ATTRIBUTES = (codegen, ); }; };
 		F7FAFD3A28BFA948000777FE /* NCNotification+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7FAFD3928BFA947000777FE /* NCNotification+Menu.swift */; };
 		F7FF2CB12842159500EBB7A1 /* NCSectionHeader.xib in Resources */ = {isa = PBXBuildFile; fileRef = F7FF2CB02842159500EBB7A1 /* NCSectionHeader.xib */; };
 /* End PBXBuildFile section */
@@ -748,50 +748,6 @@
 		F7239876253D86D300257F49 /* NCEmptyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NCEmptyView.xib; sourceTree = "<group>"; };
 		F723B3DC22FC6D1C00301EFE /* NCShareCommentsCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NCShareCommentsCell.xib; sourceTree = "<group>"; };
 		F7245923289BB50B00474787 /* ThreadSafeDictionary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThreadSafeDictionary.swift; sourceTree = "<group>"; };
-		F72653DA29097065001B9680 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F72653DC29097071001B9680 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F72653DE29097072001B9680 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F72653E029097072001B9680 /* es-UY */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-UY"; path = "es-UY.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F72653E229097073001B9680 /* es-PR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PR"; path = "es-PR.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F72653E429097076001B9680 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F72653E629097077001B9680 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F72653E829097078001B9680 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F72653EA29097079001B9680 /* zh-Hant-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant-TW"; path = "zh-Hant-TW.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F72653EC29097079001B9680 /* cs-CZ */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "cs-CZ"; path = "cs-CZ.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F72653EE2909707A001B9680 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F72653F02909707B001B9680 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F72653F22909707C001B9680 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F72653F42909707E001B9680 /* es-CL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CL"; path = "es-CL.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F72653F62909707F001B9680 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F72653F829097080001B9680 /* gl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = gl; path = gl.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F72653FA29097081001B9680 /* ka-GE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ka-GE"; path = "ka-GE.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F72653FC29097082001B9680 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F72653FE29097083001B9680 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F726540029097084001B9680 /* is */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = is; path = is.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F726540229097084001B9680 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F726540429097085001B9680 /* ja-JP */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ja-JP"; path = "ja-JP.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F726540629097086001B9680 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F726540829097087001B9680 /* nb-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "nb-NO"; path = "nb-NO.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F726540A29097089001B9680 /* sk-SK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sk-SK"; path = "sk-SK.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F726540C29097089001B9680 /* sr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sr; path = sr.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F726540E2909708A001B9680 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F72654102909708B001B9680 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F72654122909708C001B9680 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F72654142909708D001B9680 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F72654162909708E001B9680 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F726541829097090001B9680 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F726541A29097091001B9680 /* es-HN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-HN"; path = "es-HN.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F726541C29097092001B9680 /* es-GT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-GT"; path = "es-GT.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F726541E29097093001B9680 /* es-SV */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-SV"; path = "es-SV.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F726542029097095001B9680 /* es-EC */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-EC"; path = "es-EC.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F726542229097095001B9680 /* es-DO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-DO"; path = "es-DO.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F726542429097096001B9680 /* es-CR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CR"; path = "es-CR.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F726542629097097001B9680 /* es-CO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CO"; path = "es-CO.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F726542829097098001B9680 /* es-PY */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PY"; path = "es-PY.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F726542A29097099001B9680 /* es-PA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PA"; path = "es-PA.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F726542C2909709A001B9680 /* es-NI */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-NI"; path = "es-NI.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F726542E2909709B001B9680 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F72654302909709C001B9680 /* es-PE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PE"; path = "es-PE.lproj/Dashboard.strings"; sourceTree = "<group>"; };
 		F7267A81225DFCE100D6DB7D /* AFNetworking.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AFNetworking.framework; path = Carthage/Build/iOS/AFNetworking.framework; sourceTree = "<group>"; };
 		F72685E827C78E490019EF5E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		F726EEEB1FED1C820030B9C8 /* NCEndToEndInitialize.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCEndToEndInitialize.swift; sourceTree = "<group>"; };
@@ -871,6 +827,7 @@
 		F75B923D1ECAE55E00199C96 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F75C0C4723D1FAE300163CC8 /* NCRichWorkspaceCommon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCRichWorkspaceCommon.swift; sourceTree = "<group>"; };
 		F75D19E225EFE09000D74598 /* NCTrash+Menu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCTrash+Menu.swift"; sourceTree = "<group>"; };
+		F75DD768290ABB25002EB562 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; name = Base; path = Base.lproj/Intent.intentdefinition; sourceTree = "<group>"; };
 		F75EDFBC1E8C112F00E6F369 /* libsqlite3.0.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.0.tbd; path = usr/lib/libsqlite3.0.tbd; sourceTree = SDKROOT; };
 		F75EDFBE1E8C116D00E6F369 /* libstdc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libstdc++.tbd"; path = "usr/lib/libstdc++.tbd"; sourceTree = SDKROOT; };
 		F760329D252F0F8E0015A421 /* NCTransferCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NCTransferCell.swift; path = iOSClient/Transfers/NCTransferCell.swift; sourceTree = SOURCE_ROOT; };
@@ -1053,6 +1010,7 @@
 		F7BB04851FD58ACB00BBFD2A /* cs-CZ */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "cs-CZ"; path = "cs-CZ.lproj/Localizable.strings"; sourceTree = "<group>"; };
 		F7BC287D26663F6C004D46C5 /* NCViewCertificateDetails.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = NCViewCertificateDetails.storyboard; sourceTree = "<group>"; };
 		F7BC287F26663F85004D46C5 /* NCViewCertificateDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCViewCertificateDetails.swift; sourceTree = "<group>"; };
+		F7BE7C25290AC8C9002ABB61 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Intent.strings; sourceTree = "<group>"; };
 		F7C1EEA425053A9C00866ACC /* NCDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCDataSource.swift; sourceTree = "<group>"; };
 		F7C40BE221998C050004137E /* PDFGenerator.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PDFGenerator.framework; path = Carthage/Build/iOS/PDFGenerator.framework; sourceTree = "<group>"; };
 		F7C40BE421998D5A0004137E /* MGSwipeTableCell.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MGSwipeTableCell.framework; path = Carthage/Build/iOS/MGSwipeTableCell.framework; sourceTree = "<group>"; };
@@ -1124,7 +1082,6 @@
 		F7F67BB81A24D27800EE80DA /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
 		F7F878AD1FB9E3B900599E4F /* NCEndToEndMetadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCEndToEndMetadata.swift; sourceTree = "<group>"; };
 		F7F9D1BA25397CE000D9BFF5 /* NCViewer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCViewer.swift; sourceTree = "<group>"; };
-		F7FABE3828D1DAD00000A325 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; name = Base; path = Base.lproj/Dashboard.intentdefinition; sourceTree = "<group>"; };
 		F7FAFD3928BFA947000777FE /* NCNotification+Menu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCNotification+Menu.swift"; sourceTree = "<group>"; };
 		F7FC7D551DC1F93800BB2C6A /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
 		F7FF2CB02842159500EBB7A1 /* NCSectionHeader.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NCSectionHeader.xib; sourceTree = "<group>"; };
@@ -1358,14 +1315,6 @@
 			path = "Rename file";
 			sourceTree = "<group>";
 		};
-		F70EA92828D4B97C00920635 /* Intent */ = {
-			isa = PBXGroup;
-			children = (
-				F7FABE3928D1DAD00000A325 /* Dashboard.intentdefinition */,
-			);
-			path = Intent;
-			sourceTree = "<group>";
-		};
 		F710E80C1EF95C9C00DC2427 /* Intro */ = {
 			isa = PBXGroup;
 			children = (
@@ -1466,7 +1415,6 @@
 		F72EA95528B7BAD100C88F0C /* Dashboard */ = {
 			isa = PBXGroup;
 			children = (
-				F70EA92828D4B97C00920635 /* Intent */,
 				F7E0710028B13BB00001B882 /* DashboardData.swift */,
 				F72EA95128B7BA2A00C88F0C /* DashboardWidgetProvider.swift */,
 				F72A17D728B221E300F3F159 /* DashboardWidgetView.swift */,
@@ -1492,6 +1440,7 @@
 				F72EA95628B7BAE700C88F0C /* Files */,
 				F76DEE9A28F808BC0041B1C9 /* Lockscreen */,
 				F77ED59628C9CEEE00E24ED0 /* Toolbar */,
+				F75DD764290AB369002EB562 /* Intent */,
 				F7346E2028B0FA3A006CE2D2 /* Widget-Brinding-header.h */,
 				F7346E1528B0EF5C006CE2D2 /* Widget.swift */,
 			);
@@ -1551,6 +1500,14 @@
 			path = ScanDocument;
 			sourceTree = "<group>";
 		};
+		F75DD764290AB369002EB562 /* Intent */ = {
+			isa = PBXGroup;
+			children = (
+				F75DD769290ABB25002EB562 /* Intent.intentdefinition */,
+			);
+			path = Intent;
+			sourceTree = "<group>";
+		};
 		F7603298252F0E550015A421 /* Collection Common */ = {
 			isa = PBXGroup;
 			children = (
@@ -2845,7 +2802,6 @@
 				F72EA95A28B7BD0D00C88F0C /* FilesWidgetView.swift in Sources */,
 				F78302FE28B4C44700B84583 /* NCBrand.swift in Sources */,
 				F793E5A028B7651B005E4B02 /* NCViewCertificateDetails.swift in Sources */,
-				F7FABE3728D1DAD00000A325 /* Dashboard.intentdefinition in Sources */,
 				F793E59F28B764F6005E4B02 /* NCContentPresenter.swift in Sources */,
 				F76DEE9828F808AF0041B1C9 /* LockscreenWidgetProvider.swift in Sources */,
 				F78302FA28B4C3EA00B84583 /* NCManageDatabase+Metadata.swift in Sources */,
@@ -2864,6 +2820,7 @@
 				F72EA95828B7BC4F00C88F0C /* FilesData.swift in Sources */,
 				F793E59E28B763C2005E4B02 /* NCAskAuthorization.swift in Sources */,
 				F78302FF28B4C45000B84583 /* NCUtilityFileSystem.swift in Sources */,
+				F75DD766290ABB25002EB562 /* Intent.intentdefinition in Sources */,
 				F78302F628B4C3C500B84583 /* NCDatabase.swift in Sources */,
 				F7D68FCD28CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift in Sources */,
 				F783030128B4C49700B84583 /* UIImage+Extensions.swift in Sources */,
@@ -2993,6 +2950,7 @@
 				F7239871253D86B600257F49 /* NCEmptyDataSet.swift in Sources */,
 				AFCE353327E4ED1900FEA6C2 /* UIToolbar+Extension.swift in Sources */,
 				8491B1CD273BBA82001C8C5B /* UIViewController+Menu.swift in Sources */,
+				F75DD765290ABB25002EB562 /* Intent.intentdefinition in Sources */,
 				F702F2F725EE5CED008F8E80 /* NCLogin.swift in Sources */,
 				F7E98C1627E0D0FC001F9F19 /* NCManageDatabase+Video.swift in Sources */,
 				F7F4F11227ECDC52008676F9 /* UIFont+Extension.swift in Sources */,
@@ -3069,7 +3027,6 @@
 				F7F4F11027ECDC4A008676F9 /* UIDevice+Extensions.swift in Sources */,
 				F77B0ED11D118A16002130FE /* Acknowledgements.m in Sources */,
 				F70D8D8124A4A9BF000A5756 /* NCNetworkingProcessUpload.swift in Sources */,
-				F7FABE3628D1DAD00000A325 /* Dashboard.intentdefinition in Sources */,
 				F7D96FCC246ED7E200536D73 /* NCNetworkingCheckRemoteUser.swift in Sources */,
 				F7E4D9C422ED929B003675FD /* NCShareCommentsCell.swift in Sources */,
 				F717402E24F699A5000C87D5 /* NCFavorite.swift in Sources */,
@@ -3090,6 +3047,7 @@
 				F7C9739528F17131002C43E2 /* IntentHandler.swift in Sources */,
 				F7A8D73D28F181D3008BBE1C /* NCUtilityFileSystem.swift in Sources */,
 				F7A8D74528F1828E008BBE1C /* CCUtility.m in Sources */,
+				F75DD767290ABB25002EB562 /* Intent.intentdefinition in Sources */,
 				F7A8D73F28F181EF008BBE1C /* NCGlobal.swift in Sources */,
 				F7A8D74328F1826F008BBE1C /* String+Extensions.swift in Sources */,
 				F7A8D73728F17E1E008BBE1C /* NCManageDatabase+Account.swift in Sources */,
@@ -3097,7 +3055,6 @@
 				F7A8D73C28F181BC008BBE1C /* NCBrand.swift in Sources */,
 				F7A8D74228F18261008BBE1C /* NCUtility.swift in Sources */,
 				F7A8D73A28F17E28008BBE1C /* NCManageDatabase+Video.swift in Sources */,
-				F7C9739D28F1733B002C43E2 /* Dashboard.intentdefinition in Sources */,
 				F7A8D73828F17E21008BBE1C /* NCManageDatabase+DashboardWidget.swift in Sources */,
 				F7A8D73928F17E25008BBE1C /* NCManageDatabase+Metadata.swift in Sources */,
 				F7A8D74128F18254008BBE1C /* UIColor+Extensions.swift in Sources */,
@@ -3196,6 +3153,15 @@
 			path = "Supporting Files";
 			sourceTree = "<group>";
 		};
+		F75DD769290ABB25002EB562 /* Intent.intentdefinition */ = {
+			isa = PBXVariantGroup;
+			children = (
+				F75DD768290ABB25002EB562 /* Base */,
+				F7BE7C25290AC8C9002ABB61 /* en */,
+			);
+			name = Intent.intentdefinition;
+			sourceTree = "<group>";
+		};
 		F7E70DE91A24DE4100E1B66A /* Localizable.strings */ = {
 			isa = PBXVariantGroup;
 			children = (
@@ -3248,58 +3214,6 @@
 			path = "Supporting Files";
 			sourceTree = "<group>";
 		};
-		F7FABE3928D1DAD00000A325 /* Dashboard.intentdefinition */ = {
-			isa = PBXVariantGroup;
-			children = (
-				F7FABE3828D1DAD00000A325 /* Base */,
-				F72653DA29097065001B9680 /* en */,
-				F72653DC29097071001B9680 /* tr */,
-				F72653DE29097072001B9680 /* sv */,
-				F72653E029097072001B9680 /* es-UY */,
-				F72653E229097073001B9680 /* es-PR */,
-				F72653E429097076001B9680 /* eu */,
-				F72653E629097077001B9680 /* ca */,
-				F72653E829097078001B9680 /* zh-Hans */,
-				F72653EA29097079001B9680 /* zh-Hant-TW */,
-				F72653EC29097079001B9680 /* cs-CZ */,
-				F72653EE2909707A001B9680 /* da */,
-				F72653F02909707B001B9680 /* nl */,
-				F72653F22909707C001B9680 /* en-GB */,
-				F72653F42909707E001B9680 /* es-CL */,
-				F72653F62909707F001B9680 /* fr */,
-				F72653F829097080001B9680 /* gl */,
-				F72653FA29097081001B9680 /* ka-GE */,
-				F72653FC29097082001B9680 /* de */,
-				F72653FE29097083001B9680 /* hu */,
-				F726540029097084001B9680 /* is */,
-				F726540229097084001B9680 /* it */,
-				F726540429097085001B9680 /* ja-JP */,
-				F726540629097086001B9680 /* ko */,
-				F726540829097087001B9680 /* nb-NO */,
-				F726540A29097089001B9680 /* sk-SK */,
-				F726540C29097089001B9680 /* sr */,
-				F726540E2909708A001B9680 /* ru */,
-				F72654102909708B001B9680 /* pt-PT */,
-				F72654122909708C001B9680 /* pt-BR */,
-				F72654142909708D001B9680 /* pl */,
-				F72654162909708E001B9680 /* es */,
-				F726541829097090001B9680 /* es-419 */,
-				F726541A29097091001B9680 /* es-HN */,
-				F726541C29097092001B9680 /* es-GT */,
-				F726541E29097093001B9680 /* es-SV */,
-				F726542029097095001B9680 /* es-EC */,
-				F726542229097095001B9680 /* es-DO */,
-				F726542429097096001B9680 /* es-CR */,
-				F726542629097097001B9680 /* es-CO */,
-				F726542829097098001B9680 /* es-PY */,
-				F726542A29097099001B9680 /* es-PA */,
-				F726542C2909709A001B9680 /* es-NI */,
-				F726542E2909709B001B9680 /* es-MX */,
-				F72654302909709C001B9680 /* es-PE */,
-			);
-			name = Dashboard.intentdefinition;
-			sourceTree = "<group>";
-		};
 /* End PBXVariantGroup section */
 
 /* Begin XCBuildConfiguration section */

+ 9 - 7
Widget/Dashboard/DashboardData.swift

@@ -22,6 +22,7 @@
 //
 
 import WidgetKit
+import Intents
 import NextcloudKit
 import RealmSwift
 import SVGKit
@@ -80,7 +81,7 @@ func getDashboardItems(displaySize: CGSize, withButton: Bool) -> Int {
     }
 }
 
-func getDashboardDataEntry(intent: DashboardIntent?, isPreview: Bool, displaySize: CGSize, completion: @escaping (_ entry: DashboardDataEntry) -> Void) {
+func getDashboardDataEntry(configuration: DashboardIntent?, isPreview: Bool, displaySize: CGSize, completion: @escaping (_ entry: DashboardDataEntry) -> Void) {
 
     let dashboardItems = getDashboardItems(displaySize: displaySize, withButton: false)
     let datasPlaceholder = Array(dashboardDatasTest[0...dashboardItems - 1])
@@ -90,7 +91,7 @@ func getDashboardDataEntry(intent: DashboardIntent?, isPreview: Bool, displaySiz
         return completion(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: nil, buttons: nil, isPlaceholder: true, isEmpty: false, titleImage: UIImage(named: "widget")!, title: "Dashboard", footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " dashboard"))
     }
 
-    let accountIdentifier: String = intent?.Accounts?.identifier ?? "active"
+    let accountIdentifier: String = configuration?.accounts?.identifier ?? "active"
     if accountIdentifier == "active" {
         account = NCManageDatabase.shared.getActiveAccount()
     } else {
@@ -103,7 +104,7 @@ func getDashboardDataEntry(intent: DashboardIntent?, isPreview: Bool, displaySiz
 
     // Default widget
     let result = NCManageDatabase.shared.getDashboardWidgetApplications(account: account.account).first
-    let id: String = intent?.Applications?.identifier ?? (result?.id ?? "recommendations")
+    let id: String = configuration?.applications?.identifier ?? (result?.id ?? "recommendations")
 
     let serverVersionMajor = NCManageDatabase.shared.getCapabilitiesServerInt(account: account.account, elements: NCElementsJSON.shared.capabilitiesVersionMajor)
     guard serverVersionMajor >= NCGlobal.shared.nextcloudVersion25 else {
@@ -151,7 +152,7 @@ func getDashboardDataEntry(intent: DashboardIntent?, isPreview: Bool, displaySiz
     }
     let titleImage = imagetmp
         
-    NextcloudKit.shared.getDashboardWidgetsApplication(id, options: options) { account, results, data, error in
+    NextcloudKit.shared.getDashboardWidgetsApplication(id, options: options) { _, results, data, error in
 
         Task {
             var datas = [DashboardData]()
@@ -231,12 +232,13 @@ func getDashboardDataEntry(intent: DashboardIntent?, isPreview: Bool, displaySiz
                 buttons = tableButton.filter(({ $0.type != "more" }))
             }
 
+            let alias = (account.alias.isEmpty) ? "" : (" (" + account.alias + ")")
+            let footerText = "Dashboard " + NSLocalizedString("_of_", comment: "") +  " " + account.displayName + alias
+
             if error != .success {
                 completion(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: tableDashboard, buttons: buttons, isPlaceholder: true, isEmpty: false, titleImage: titleImage, title: title, footerImage: "xmark.icloud", footerText: error.errorDescription))
-            } else if datas.isEmpty {
-                completion(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: tableDashboard, buttons: buttons, isPlaceholder: false, isEmpty: true, titleImage: titleImage, title: title, footerImage: "checkmark.icloud", footerText: NSLocalizedString("_no_data_available_", comment: "")))
             } else {
-                completion(DashboardDataEntry(date: Date(), datas: datas, dashboard: tableDashboard, buttons: buttons, isPlaceholder: false, isEmpty: false, titleImage: titleImage, title: title, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " dashboard"))
+                completion(DashboardDataEntry(date: Date(), datas: datas, dashboard: tableDashboard, buttons: buttons, isPlaceholder: false, isEmpty: datas.isEmpty, titleImage: titleImage, title: title, footerImage: "checkmark.icloud", footerText: footerText))
             }
         }
     }

+ 3 - 3
Widget/Dashboard/DashboardWidgetProvider.swift

@@ -22,8 +22,8 @@
 //
 
 import WidgetKit
-import SwiftUI
 import Intents
+import SwiftUI
 
 struct DashboardWidgetProvider: IntentTimelineProvider {
 
@@ -39,13 +39,13 @@ struct DashboardWidgetProvider: IntentTimelineProvider {
     }
 
     func getSnapshot(for configuration: DashboardIntent, in context: Context, completion: @escaping (DashboardDataEntry) -> Void) {
-        getDashboardDataEntry(intent: configuration, isPreview: false, displaySize: context.displaySize) { entry in
+        getDashboardDataEntry(configuration: configuration, isPreview: false, displaySize: context.displaySize) { entry in
             completion(entry)
         }
     }
 
     func getTimeline(for configuration: DashboardIntent, in context: Context, completion: @escaping (Timeline<DashboardDataEntry>) -> Void) {
-        getDashboardDataEntry(intent: configuration, isPreview: context.isPreview, displaySize: context.displaySize) { entry in
+        getDashboardDataEntry(configuration: configuration, isPreview: context.isPreview, displaySize: context.displaySize) { entry in
             let timeLine = Timeline(entries: [entry], policy: .atEnd)
             completion(timeLine)
         }

+ 0 - 16
Widget/Dashboard/Intent/ca.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/cs-CZ.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/da.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/de.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/en-GB.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/en.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es-419.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es-CL.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es-CO.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es-CR.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es-DO.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es-EC.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es-GT.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es-HN.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es-MX.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es-NI.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es-PA.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es-PE.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es-PR.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es-PY.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es-SV.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es-UY.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/es.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/eu.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/fr.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/gl.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/hu.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/is.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/it.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/ja-JP.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/ka-GE.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/ko.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/nb-NO.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/nl.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/pl.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/pt-BR.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/pt-PT.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/ru.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/sk-SK.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/sr.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/sv.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/tr.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/zh-Hans.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 0 - 16
Widget/Dashboard/Intent/zh-Hant-TW.lproj/Dashboard.strings

@@ -1,16 +0,0 @@
-"TRaTZg" = "Widget";
-
-"dLCeWT" = "Accounts";
-
-"gJ9MnX" = "There are ${count} options matching ‘${Accounts}’.";
-
-"gpCwrM" = "Dashboard";
-
-"jHO1Mn" = "Account";
-
-"l090JH" = "Applications";
-
-"tVvJ9c" = "Dashboard Widget";
-
-"y95pmY" = "Just to confirm, you wanted ‘${Accounts}’?";
-

+ 39 - 30
Widget/Files/FilesData.swift

@@ -22,12 +22,16 @@
 //
 
 import WidgetKit
+import Intents
 import NextcloudKit
 
 struct FilesDataEntry: TimelineEntry {
     let date: Date
     let datas: [FilesData]
     let isPlaceholder: Bool
+    let isEmpty: Bool
+    let userId: String
+    let url: String
     let tile: String
     let footerImage: String
     let footerText: String
@@ -54,7 +58,7 @@ let filesDatasTest: [FilesData] = [
     .init(id: "9", image: UIImage(named: "widget")!, title: "title4", subTitle: "subTitle-description4", url: URL(string: "https://nextcloud.com/")!)
 ]
 
-func getTitleFilesWidget() -> String {
+func getTitleFilesWidget(account: tableAccount?) -> String {
 
     let hour = Calendar.current.component(.hour, from: Date())
     var good = ""
@@ -67,7 +71,7 @@ func getTitleFilesWidget() -> String {
     default: good = NSLocalizedString("_good_night_", value: "Good night", comment: "")
     }
 
-    if let account = NCManageDatabase.shared.getActiveAccount() {
+    if let account = account {
         return good + ", " + account.displayName
     } else {
         return good
@@ -80,19 +84,25 @@ func getFilesItems(displaySize: CGSize) -> Int {
     return height
 }
 
-func getFilesDataEntry(isPreview: Bool, displaySize: CGSize, completion: @escaping (_ entry: FilesDataEntry) -> Void) {
+func getFilesDataEntry(configuration: AccountIntent?, isPreview: Bool, displaySize: CGSize, completion: @escaping (_ entry: FilesDataEntry) -> Void) {
 
     let filesItems = getFilesItems(displaySize: displaySize)
     let datasPlaceholder = Array(filesDatasTest[0...filesItems - 1])
-    let title = getTitleFilesWidget()
-    
-    
+    var account: tableAccount?
+
     if isPreview {
-        return completion(FilesDataEntry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, tile: title, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " files"))
+        return completion(FilesDataEntry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, isEmpty: false, userId: "", url: "", tile: getTitleFilesWidget(account: nil), footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " files"))
+    }
+
+    let accountIdentifier: String = configuration?.accounts?.identifier ?? "active"
+    if accountIdentifier == "active" {
+        account = NCManageDatabase.shared.getActiveAccount()
+    } else {
+        account = NCManageDatabase.shared.getAccount(predicate: NSPredicate(format: "account == %@", accountIdentifier))
     }
 
-    guard let account = NCManageDatabase.shared.getActiveAccount() else {
-        return completion(FilesDataEntry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, tile: title, footerImage: "xmark.icloud", footerText: NSLocalizedString("_no_active_account_", value: "No account found", comment: "")))
+    guard let account = account else {
+        return completion(FilesDataEntry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, isEmpty: false, userId: "", url: "", tile: getTitleFilesWidget(account: nil), footerImage: "xmark.icloud", footerText: NSLocalizedString("_no_active_account_", value: "No account found", comment: "")))
     }
 
     @Sendable func isLive(file: NKFile, files: [NKFile]) -> Bool {
@@ -204,32 +214,35 @@ func getFilesDataEntry(isPreview: Bool, displaySize: CGSize, completion: @escapi
         Task {
             var datas: [FilesData] = []
             var imageRecent = UIImage(named: "file")!
+            let title = getTitleFilesWidget(account: account)
 
             for file in files {
                 guard !file.directory else { continue }
                 guard !isLive(file: file, files: files) else { continue }
+                let isEncrypted = CCUtility.isFolderEncrypted(file.serverUrl, e2eEncrypted: file.e2eEncrypted, account: account.account, urlBase: file.urlBase)
+                let metadata = NCManageDatabase.shared.convertNCFileToMetadata(file, isEncrypted: isEncrypted, account: account.account)
 
                 // SUBTITLE
-                let subTitle = CCUtility.dateDiff(file.date as Date) + " · " + CCUtility.transformedSize(file.size)
+                let subTitle = CCUtility.dateDiff(metadata.date as Date) + " · " + CCUtility.transformedSize(metadata.size)
 
                 // URL: nextcloud://open-file?path=Talk/IMG_0000123.jpg&user=marinofaggiana&link=https://cloud.nextcloud.com/f/123
-                guard var path = NCUtilityFileSystem.shared.getPath(path: file.path, user: file.user, fileName: file.fileName).urlEncoded else { continue }
+                guard var path = NCUtilityFileSystem.shared.getPath(path: metadata.path, user: metadata.user, fileName: metadata.fileName).urlEncoded else { continue }
                 if path.first == "/" { path = String(path.dropFirst())}
-                guard let user = file.user.urlEncoded else { continue }
-                let link = file.urlBase + "/f/" + file.fileId
+                guard let user = metadata.user.urlEncoded else { continue }
+                let link = metadata.urlBase + "/f/" + metadata.fileId
                 let urlString = "nextcloud://open-file?path=\(path)&user=\(user)&link=\(link)"
                 guard let url = URL(string: urlString) else { continue }
 
                 // IMAGE
-                if !file.iconName.isEmpty {
-                    imageRecent = UIImage(named: file.iconName)!
+                if !metadata.iconName.isEmpty {
+                    imageRecent = UIImage(named: metadata.iconName)!
                 }
-                if let image = NCUtility.shared.createFilePreviewImage(ocId: file.ocId, etag: file.etag, fileNameView: file.fileName, classFile: file.classFile, status: 0, createPreviewMedia: false) {
+                if let image = NCUtility.shared.createFilePreviewImage(ocId: metadata.ocId, etag: metadata.etag, fileNameView: metadata.fileName, classFile: metadata.classFile, status: 0, createPreviewMedia: false) {
                     imageRecent = image
-                } else if file.hasPreview {
-                    let fileNamePathOrFileId = CCUtility.returnFileNamePath(fromFileName: file.fileName, serverUrl: file.serverUrl, urlBase: file.urlBase, account: account.account)!
-                    let fileNamePreviewLocalPath = CCUtility.getDirectoryProviderStoragePreviewOcId(file.ocId, etag: file.etag)!
-                    let fileNameIconLocalPath = CCUtility.getDirectoryProviderStorageIconOcId(file.ocId, etag: file.etag)!
+                } else if metadata.hasPreview {
+                    let fileNamePathOrFileId = CCUtility.returnFileNamePath(fromFileName: metadata.fileName, serverUrl: metadata.serverUrl, urlBase: metadata.urlBase, account: account.account)!
+                    let fileNamePreviewLocalPath = CCUtility.getDirectoryProviderStoragePreviewOcId(metadata.ocId, etag: metadata.etag)!
+                    let fileNameIconLocalPath = CCUtility.getDirectoryProviderStorageIconOcId(metadata.ocId, etag: metadata.etag)!
                     let (_, _, imageIcon, _, _, _) = await NextcloudKit.shared.downloadPreview(fileNamePathOrFileId: fileNamePathOrFileId, fileNamePreviewLocalPath: fileNamePreviewLocalPath, widthPreview: NCGlobal.shared.sizePreview, heightPreview: NCGlobal.shared.sizePreview, fileNameIconLocalPath: fileNameIconLocalPath, sizeIcon: NCGlobal.shared.sizeIcon)
                     if let image = imageIcon {
                         imageRecent = image
@@ -237,22 +250,18 @@ func getFilesDataEntry(isPreview: Bool, displaySize: CGSize, completion: @escapi
                 }
 
                 // DATA
-                let data = FilesData.init(id: file.ocId, image: imageRecent, title: file.fileName, subTitle: subTitle, url: url)
+                let data = FilesData.init(id: metadata.ocId, image: imageRecent, title: metadata.fileNameView, subTitle: subTitle, url: url)
                 datas.append(data)
                 if datas.count == filesItems { break}
             }
 
+            let alias = (account.alias.isEmpty) ? "" : (" (" + account.alias + ")")
+            let footerText = "Files " + NSLocalizedString("_of_", comment: "") +  " " + account.displayName + alias
+
             if error != .success {
-                completion(FilesDataEntry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, tile: title, footerImage: "xmark.icloud", footerText: error.errorDescription))
-            } else if datas.isEmpty {
-                var footerText = NSLocalizedString("_no_data_available_", comment: "")
-                let serverVersionMajor = NCManageDatabase.shared.getCapabilitiesServerInt(account: account.account, elements: NCElementsJSON.shared.capabilitiesVersionMajor)
-                if serverVersionMajor < NCGlobal.shared.nextcloudVersion25 {
-                    footerText = NSLocalizedString("_widget_available_nc25_", comment: "")
-                }
-                completion(FilesDataEntry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, tile: title, footerImage: "checkmark.icloud", footerText: footerText))
+                completion(FilesDataEntry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, isEmpty: false, userId: account.userId, url: account.urlBase, tile: title, footerImage: "xmark.icloud", footerText: error.errorDescription))
             } else {
-                completion(FilesDataEntry(date: Date(), datas: datas, isPlaceholder: false, tile: title, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " files"))
+                completion(FilesDataEntry(date: Date(), datas: datas, isPlaceholder: false, isEmpty: datas.isEmpty, userId: account.userId, url: account.urlBase, tile: title, footerImage: "checkmark.icloud", footerText: footerText))
             }
         }
     }

+ 9 - 7
Widget/Files/FilesWidgetProvider.swift

@@ -22,27 +22,29 @@
 //
 
 import WidgetKit
+import Intents
 import SwiftUI
 
-struct FilesWidgetProvider: TimelineProvider {
+struct FilesWidgetProvider: IntentTimelineProvider {
 
     typealias Entry = FilesDataEntry
+    typealias Intent = AccountIntent
 
     func placeholder(in context: Context) -> Entry {
         let filesItems = getFilesItems(displaySize: context.displaySize)
         let datasPlaceholder = Array(filesDatasTest[0...filesItems - 1])
-        let title = getTitleFilesWidget()
-        return Entry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, tile: title, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " files")
+        let title = getTitleFilesWidget(account: nil)
+        return Entry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, isEmpty: false, userId: "", url: "", tile: title, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " files")
     }
 
-    func getSnapshot(in context: Context, completion: @escaping (Entry) -> Void) {
-        getFilesDataEntry(isPreview: false, displaySize: context.displaySize) { entry in
+    func getSnapshot(for configuration: AccountIntent, in context: Context, completion: @escaping (Entry) -> Void) {
+        getFilesDataEntry(configuration: configuration, isPreview: false, displaySize: context.displaySize) { entry in
             completion(entry)
         }
     }
 
-    func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {
-        getFilesDataEntry(isPreview: context.isPreview, displaySize: context.displaySize) { entry in
+    func getTimeline(for configuration: AccountIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {
+        getFilesDataEntry(configuration: configuration, isPreview: context.isPreview, displaySize: context.displaySize) { entry in
             let timeLine = Timeline(entries: [entry], policy: .atEnd)
             completion(timeLine)
         }

+ 66 - 42
Widget/Files/FilesWidgetView.swift

@@ -27,11 +27,33 @@ import WidgetKit
 struct FilesWidgetView: View {
     
     var entry: FilesDataEntry
-    
+
     var body: some View {
-        
+
+        let parameterLink = "&user=\(entry.userId)&url=\(entry.url)"
+        let linkNoAction: URL = URL(string: NCGlobal.shared.widgetActionNoAction + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionNoAction + parameterLink)! : URL(string: NCGlobal.shared.widgetActionNoAction)!
+        let linkActionUploadAsset: URL = URL(string: NCGlobal.shared.widgetActionUploadAsset + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionUploadAsset + parameterLink)! : URL(string: NCGlobal.shared.widgetActionUploadAsset)!
+        let linkActionScanDocument: URL = URL(string: NCGlobal.shared.widgetActionScanDocument + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionScanDocument + parameterLink)! : URL(string: NCGlobal.shared.widgetActionScanDocument)!
+        let linkActionTextDocument: URL = URL(string: NCGlobal.shared.widgetActionTextDocument + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionTextDocument + parameterLink)! : URL(string: NCGlobal.shared.widgetActionTextDocument)!
+        let linkActionVoiceMemo: URL = URL(string: NCGlobal.shared.widgetActionVoiceMemo + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionVoiceMemo + parameterLink)! : URL(string: NCGlobal.shared.widgetActionVoiceMemo)!
+
         GeometryReader { geo in
-            
+
+            if entry.isEmpty {
+                VStack(alignment: .center) {
+                    Image(systemName: "checkmark")
+                        .resizable()
+                        .scaledToFit()
+                        .frame(width: 50, height: 50)
+                    Text(NSLocalizedString("_no_items_", comment: ""))
+                        .font(.system(size: 25))
+                        .padding()
+                    Text(NSLocalizedString("_check_back_late_", comment: ""))
+                        .font(.system(size: 15))
+                }
+                .frame(width: geo.size.width, height: geo.size.height)
+            }
+
             ZStack(alignment: .topLeading) {
                 
                 HStack() {
@@ -45,52 +67,54 @@ struct FilesWidgetView: View {
                 }
                 .frame(width: geo.size.width - 20)
                 .padding([.top, .leading, .trailing], 10)
-                
-                VStack(alignment: .leading) {
-                    
-                    VStack(spacing: 0) {
-                        
-                        ForEach(entry.datas, id: \.id) { element in
-                            
-                            Link(destination: element.url) {
-                                
-                                HStack {
-
-                                    Image(uiImage: element.image)
-                                        .resizable()
-                                        .scaledToFill()
-                                        .frame(width: 35, height: 35)
-                                        .clipped()
-                                        .cornerRadius(5)
-                                    
-                                    VStack(alignment: .leading, spacing: 2) {
-                                        
-                                        Text(element.title)
-                                            .font(.system(size: 12))
-                                            .fontWeight(.regular)
-                                        
-                                        Text(element.subTitle)
-                                            .font(.system(size: CGFloat(10)))
-                                            .foregroundColor(Color(.systemGray))
+
+                if !entry.isEmpty {
+                    VStack(alignment: .leading) {
+
+                        VStack(spacing: 0) {
+
+                            ForEach(entry.datas, id: \.id) { element in
+
+                                Link(destination: element.url) {
+
+                                    HStack {
+
+                                        Image(uiImage: element.image)
+                                            .resizable()
+                                            .scaledToFill()
+                                            .frame(width: 35, height: 35)
+                                            .clipped()
+                                            .cornerRadius(5)
+
+                                        VStack(alignment: .leading, spacing: 2) {
+
+                                            Text(element.title)
+                                                .font(.system(size: 12))
+                                                .fontWeight(.regular)
+
+                                            Text(element.subTitle)
+                                                .font(.system(size: CGFloat(10)))
+                                                .foregroundColor(Color(.systemGray))
+                                        }
+                                        Spacer()
                                     }
-                                    Spacer()
+                                    .padding(.leading, 10)
+                                    .frame(height: 50)
                                 }
-                                .padding(.leading, 10)
-                                .frame(height: 50)
+                                Divider()
+                                    .padding(.leading, 54)
                             }
-                            Divider()
-                                .padding(.leading, 54)
                         }
                     }
+                    .padding(.top, 30)
+                    .redacted(reason: entry.isPlaceholder ? .placeholder : [])
                 }
-                .padding(.top, 30)
-                .redacted(reason: entry.isPlaceholder ? .placeholder : [])
 
                 HStack(spacing: 0) {
 
                     let sizeButton: CGFloat = 40
 
-                    Link(destination: entry.isPlaceholder ? NCGlobal.shared.widgetActionNoAction : NCGlobal.shared.widgetActionUploadAsset, label: {
+                    Link(destination: entry.isPlaceholder ? linkNoAction : linkActionUploadAsset, label: {
                         Image("addImage")
                             .resizable()
                             .renderingMode(.template)
@@ -102,7 +126,7 @@ struct FilesWidgetView: View {
                             .frame(width: geo.size.width / 4, height: sizeButton)
                     })
 
-                    Link(destination: entry.isPlaceholder ? NCGlobal.shared.widgetActionNoAction : NCGlobal.shared.widgetActionScanDocument, label: {
+                    Link(destination: entry.isPlaceholder ? linkNoAction : linkActionScanDocument, label: {
                         Image("scan")
                             .resizable()
                             .renderingMode(.template)
@@ -114,7 +138,7 @@ struct FilesWidgetView: View {
                             .frame(width: geo.size.width / 4, height: sizeButton)
                     })
 
-                    Link(destination: entry.isPlaceholder ? NCGlobal.shared.widgetActionNoAction : NCGlobal.shared.widgetActionTextDocument, label: {
+                    Link(destination: entry.isPlaceholder ? linkNoAction : linkActionTextDocument, label: {
                         Image("note.text")
                             .resizable()
                             .renderingMode(.template)
@@ -126,7 +150,7 @@ struct FilesWidgetView: View {
                             .frame(width: geo.size.width / 4, height: sizeButton)
                     })
 
-                    Link(destination: entry.isPlaceholder ? NCGlobal.shared.widgetActionNoAction : NCGlobal.shared.widgetActionVoiceMemo, label: {
+                    Link(destination: entry.isPlaceholder ? linkNoAction : linkActionVoiceMemo, label: {
                         Image("microphone")
                             .resizable()
                             .renderingMode(.template)
@@ -163,7 +187,7 @@ struct FilesWidgetView: View {
 struct FilesWidget_Previews: PreviewProvider {
     static var previews: some View {
         let datas = Array(filesDatasTest[0...4])
-        let entry = FilesDataEntry(date: Date(), datas: datas, isPlaceholder: false, tile: "Good afternoon, Marino Faggiana", footerImage: "checkmark.icloud", footerText: "Nextcloud files")
+        let entry = FilesDataEntry(date: Date(), datas: datas, isPlaceholder: false, isEmpty: true, userId: "", url: "", tile: "Good afternoon, Marino Faggiana", footerImage: "checkmark.icloud", footerText: "Nextcloud files")
         FilesWidgetView(entry: entry).previewContext(WidgetPreviewContext(family: .systemLarge))
     }
 }

+ 158 - 20
Widget/Dashboard/Intent/Base.lproj/Dashboard.intentdefinition → Widget/Intent/Base.lproj/Intent.intentdefinition

@@ -7,7 +7,7 @@
 	<key>INIntentDefinitionModelVersion</key>
 	<string>1.2</string>
 	<key>INIntentDefinitionNamespace</key>
-	<string>88xZPY</string>
+	<string>4HSdD3</string>
 	<key>INIntentDefinitionSystemVersion</key>
 	<string>22A380</string>
 	<key>INIntentDefinitionToolsBuildVersion</key>
@@ -16,19 +16,119 @@
 	<string>14.0</string>
 	<key>INIntents</key>
 	<array>
+		<dict>
+			<key>INIntentCategory</key>
+			<string>information</string>
+			<key>INIntentDescription</key>
+			<string>Account</string>
+			<key>INIntentDescriptionID</key>
+			<string>VfbA9C</string>
+			<key>INIntentEligibleForWidgets</key>
+			<true/>
+			<key>INIntentIneligibleForSuggestions</key>
+			<true/>
+			<key>INIntentLastParameterTag</key>
+			<integer>2</integer>
+			<key>INIntentName</key>
+			<string>Account</string>
+			<key>INIntentParameters</key>
+			<array>
+				<dict>
+					<key>INIntentParameterConfigurable</key>
+					<true/>
+					<key>INIntentParameterDisplayName</key>
+					<string>Account</string>
+					<key>INIntentParameterDisplayNameID</key>
+					<string>13zjVT</string>
+					<key>INIntentParameterDisplayPriority</key>
+					<integer>1</integer>
+					<key>INIntentParameterName</key>
+					<string>accounts</string>
+					<key>INIntentParameterObjectType</key>
+					<string>Accounts</string>
+					<key>INIntentParameterObjectTypeNamespace</key>
+					<string>4HSdD3</string>
+					<key>INIntentParameterPromptDialogs</key>
+					<array>
+						<dict>
+							<key>INIntentParameterPromptDialogCustom</key>
+							<true/>
+							<key>INIntentParameterPromptDialogType</key>
+							<string>Configuration</string>
+						</dict>
+						<dict>
+							<key>INIntentParameterPromptDialogCustom</key>
+							<true/>
+							<key>INIntentParameterPromptDialogType</key>
+							<string>Primary</string>
+						</dict>
+						<dict>
+							<key>INIntentParameterPromptDialogCustom</key>
+							<true/>
+							<key>INIntentParameterPromptDialogFormatString</key>
+							<string>There are ${count} options matching ‘${accounts}’.</string>
+							<key>INIntentParameterPromptDialogFormatStringID</key>
+							<string>ObH8NN</string>
+							<key>INIntentParameterPromptDialogType</key>
+							<string>DisambiguationIntroduction</string>
+						</dict>
+						<dict>
+							<key>INIntentParameterPromptDialogCustom</key>
+							<true/>
+							<key>INIntentParameterPromptDialogFormatString</key>
+							<string>Just to confirm, you wanted ‘${accounts}’?</string>
+							<key>INIntentParameterPromptDialogFormatStringID</key>
+							<string>q5lvSu</string>
+							<key>INIntentParameterPromptDialogType</key>
+							<string>Confirmation</string>
+						</dict>
+					</array>
+					<key>INIntentParameterSupportsDynamicEnumeration</key>
+					<true/>
+					<key>INIntentParameterTag</key>
+					<integer>2</integer>
+					<key>INIntentParameterType</key>
+					<string>Object</string>
+				</dict>
+			</array>
+			<key>INIntentResponse</key>
+			<dict>
+				<key>INIntentResponseCodes</key>
+				<array>
+					<dict>
+						<key>INIntentResponseCodeName</key>
+						<string>success</string>
+						<key>INIntentResponseCodeSuccess</key>
+						<true/>
+					</dict>
+					<dict>
+						<key>INIntentResponseCodeName</key>
+						<string>failure</string>
+					</dict>
+				</array>
+			</dict>
+			<key>INIntentTitle</key>
+			<string>Account</string>
+			<key>INIntentTitleID</key>
+			<string>V3exc2</string>
+			<key>INIntentType</key>
+			<string>Custom</string>
+			<key>INIntentVerb</key>
+			<string>View</string>
+		</dict>
 		<dict>
 			<key>INIntentCategory</key>
 			<string>information</string>
 			<key>INIntentDescription</key>
 			<string>Dashboard Widget</string>
 			<key>INIntentDescriptionID</key>
-			<string>tVvJ9c</string>
+			<string>ZgvlYN</string>
 			<key>INIntentEligibleForWidgets</key>
 			<true/>
 			<key>INIntentIneligibleForSuggestions</key>
 			<true/>
 			<key>INIntentLastParameterTag</key>
-			<integer>9</integer>
+			<integer>4</integer>
 			<key>INIntentName</key>
 			<string>Dashboard</string>
 			<key>INIntentParameters</key>
@@ -39,15 +139,15 @@
 					<key>INIntentParameterDisplayName</key>
 					<string>Account</string>
 					<key>INIntentParameterDisplayNameID</key>
-					<string>jHO1Mn</string>
+					<string>DN8Bxl</string>
 					<key>INIntentParameterDisplayPriority</key>
 					<integer>1</integer>
 					<key>INIntentParameterName</key>
-					<string>Accounts</string>
+					<string>accounts</string>
 					<key>INIntentParameterObjectType</key>
 					<string>Accounts</string>
 					<key>INIntentParameterObjectTypeNamespace</key>
-					<string>88xZPY</string>
+					<string>4HSdD3</string>
 					<key>INIntentParameterPromptDialogs</key>
 					<array>
 						<dict>
@@ -62,11 +162,31 @@
 							<key>INIntentParameterPromptDialogType</key>
 							<string>Primary</string>
 						</dict>
+						<dict>
+							<key>INIntentParameterPromptDialogCustom</key>
+							<true/>
+							<key>INIntentParameterPromptDialogFormatString</key>
+							<string>There are ${count} options matching ‘${accounts}’.</string>
+							<key>INIntentParameterPromptDialogFormatStringID</key>
+							<string>296XDb</string>
+							<key>INIntentParameterPromptDialogType</key>
+							<string>DisambiguationIntroduction</string>
+						</dict>
+						<dict>
+							<key>INIntentParameterPromptDialogCustom</key>
+							<true/>
+							<key>INIntentParameterPromptDialogFormatString</key>
+							<string>Just to confirm, you wanted ‘${accounts}’?</string>
+							<key>INIntentParameterPromptDialogFormatStringID</key>
+							<string>TVGjNQ</string>
+							<key>INIntentParameterPromptDialogType</key>
+							<string>Confirmation</string>
+						</dict>
 					</array>
 					<key>INIntentParameterSupportsDynamicEnumeration</key>
 					<true/>
 					<key>INIntentParameterTag</key>
-					<integer>9</integer>
+					<integer>2</integer>
 					<key>INIntentParameterType</key>
 					<string>Object</string>
 				</dict>
@@ -76,15 +196,15 @@
 					<key>INIntentParameterDisplayName</key>
 					<string>Widget</string>
 					<key>INIntentParameterDisplayNameID</key>
-					<string>TRaTZg</string>
+					<string>LIw8E9</string>
 					<key>INIntentParameterDisplayPriority</key>
 					<integer>2</integer>
 					<key>INIntentParameterName</key>
-					<string>Applications</string>
+					<string>applications</string>
 					<key>INIntentParameterObjectType</key>
 					<string>Applications</string>
 					<key>INIntentParameterObjectTypeNamespace</key>
-					<string>88xZPY</string>
+					<string>4HSdD3</string>
 					<key>INIntentParameterPromptDialogs</key>
 					<array>
 						<dict>
@@ -99,11 +219,31 @@
 							<key>INIntentParameterPromptDialogType</key>
 							<string>Primary</string>
 						</dict>
+						<dict>
+							<key>INIntentParameterPromptDialogCustom</key>
+							<true/>
+							<key>INIntentParameterPromptDialogFormatString</key>
+							<string>There are ${count} options matching ‘${applications}’.</string>
+							<key>INIntentParameterPromptDialogFormatStringID</key>
+							<string>XjFf0X</string>
+							<key>INIntentParameterPromptDialogType</key>
+							<string>DisambiguationIntroduction</string>
+						</dict>
+						<dict>
+							<key>INIntentParameterPromptDialogCustom</key>
+							<true/>
+							<key>INIntentParameterPromptDialogFormatString</key>
+							<string>Just to confirm, you wanted ‘${applications}’?</string>
+							<key>INIntentParameterPromptDialogFormatStringID</key>
+							<string>Am6y6p</string>
+							<key>INIntentParameterPromptDialogType</key>
+							<string>Confirmation</string>
+						</dict>
 					</array>
 					<key>INIntentParameterSupportsDynamicEnumeration</key>
 					<true/>
 					<key>INIntentParameterTag</key>
-					<integer>7</integer>
+					<integer>4</integer>
 					<key>INIntentParameterType</key>
 					<string>Object</string>
 				</dict>
@@ -123,13 +263,11 @@
 						<string>failure</string>
 					</dict>
 				</array>
-				<key>INIntentResponseLastParameterTag</key>
-				<integer>1</integer>
 			</dict>
 			<key>INIntentTitle</key>
 			<string>Dashboard</string>
 			<key>INIntentTitleID</key>
-			<string>gpCwrM</string>
+			<string>NO1rJU</string>
 			<key>INIntentType</key>
 			<string>Custom</string>
 			<key>INIntentVerb</key>
@@ -140,13 +278,13 @@
 	<array>
 		<dict>
 			<key>INTypeDisplayName</key>
-			<string>Applications</string>
+			<string>Accounts</string>
 			<key>INTypeDisplayNameID</key>
-			<string>l090JH</string>
+			<string>tAlZ1R</string>
 			<key>INTypeLastPropertyTag</key>
 			<integer>99</integer>
 			<key>INTypeName</key>
-			<string>Applications</string>
+			<string>Accounts</string>
 			<key>INTypeProperties</key>
 			<array>
 				<dict>
@@ -203,13 +341,13 @@
 		</dict>
 		<dict>
 			<key>INTypeDisplayName</key>
-			<string>Accounts</string>
+			<string>Applications</string>
 			<key>INTypeDisplayNameID</key>
-			<string>dLCeWT</string>
+			<string>CAIVXf</string>
 			<key>INTypeLastPropertyTag</key>
 			<integer>99</integer>
 			<key>INTypeName</key>
-			<string>Accounts</string>
+			<string>Applications</string>
 			<key>INTypeProperties</key>
 			<array>
 				<dict>

+ 30 - 0
Widget/Intent/en.lproj/Intent.strings

@@ -0,0 +1,30 @@
+"13zjVT" = "Account";
+
+"296XDb" = "There are ${count} options matching ‘${accounts}’.";
+
+"Am6y6p" = "Just to confirm, you wanted ‘${applications}’?";
+
+"CAIVXf" = "Applications";
+
+"DN8Bxl" = "Account";
+
+"LIw8E9" = "Widget";
+
+"NO1rJU" = "Dashboard";
+
+"ObH8NN" = "There are ${count} options matching ‘${accounts}’.";
+
+"TVGjNQ" = "Just to confirm, you wanted ‘${accounts}’?";
+
+"V3exc2" = "Account";
+
+"VfbA9C" = "Account";
+
+"XjFf0X" = "There are ${count} options matching ‘${applications}’.";
+
+"ZgvlYN" = "Dashboard Widget";
+
+"q5lvSu" = "Just to confirm, you wanted ‘${accounts}’?";
+
+"tAlZ1R" = "Accounts";
+

+ 11 - 2
Widget/Lockscreen/LockscreenData.swift

@@ -34,13 +34,22 @@ struct LockscreenData: TimelineEntry {
     let quotaTotal: String
 }
 
-func getLockscreenDataEntry(isPreview: Bool, completion: @escaping (_ entry: LockscreenData) -> Void) {
+func getLockscreenDataEntry(configuration: AccountIntent?, isPreview: Bool, completion: @escaping (_ entry: LockscreenData) -> Void) {
+
+    var account: tableAccount?
 
     if isPreview {
         return completion(LockscreenData(date: Date(), isPlaceholder: true, activity: "", link: URL(string: "https://")!, quotaRelative: 0, quotaUsed: "", quotaTotal: ""))
     }
 
-    guard let account = NCManageDatabase.shared.getActiveAccount() else {
+    let accountIdentifier: String = configuration?.accounts?.identifier ?? "active"
+    if accountIdentifier == "active" {
+        account = NCManageDatabase.shared.getActiveAccount()
+    } else {
+        account = NCManageDatabase.shared.getAccount(predicate: NSPredicate(format: "account == %@", accountIdentifier))
+    }
+
+    guard let account = account else {
         return completion(LockscreenData(date: Date(), isPlaceholder: true, activity: "", link: URL(string: "https://")!, quotaRelative: 0, quotaUsed: "", quotaTotal: ""))
     }
 

+ 7 - 5
Widget/Lockscreen/LockscreenWidgetProvider.swift

@@ -22,24 +22,26 @@
 //
 
 import WidgetKit
+import Intents
 import SwiftUI
 
-struct LockscreenWidgetProvider: TimelineProvider {
+struct LockscreenWidgetProvider: IntentTimelineProvider {
 
     typealias Entry = LockscreenData
+    typealias Intent = AccountIntent
 
     func placeholder(in context: Context) -> Entry {
         return Entry(date: Date(), isPlaceholder: true, activity: "", link: URL(string: "https://")!, quotaRelative: 0, quotaUsed: "", quotaTotal: "")
     }
 
-    func getSnapshot(in context: Context, completion: @escaping (Entry) -> Void) {
-        getLockscreenDataEntry(isPreview: false) { entry in
+    func getSnapshot(for configuration: AccountIntent, in context: Context, completion: @escaping (Entry) -> Void) {
+        getLockscreenDataEntry(configuration: configuration, isPreview: false) { entry in
             completion(entry)
         }
     }
 
-    func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {
-        getLockscreenDataEntry(isPreview: context.isPreview) { entry in
+    func getTimeline(for configuration: AccountIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {
+        getLockscreenDataEntry(configuration: configuration, isPreview: context.isPreview) { entry in
             let timeLine = Timeline(entries: [entry], policy: .atEnd)
             completion(timeLine)
         }

+ 13 - 3
Widget/Toolbar/ToolbarData.swift

@@ -26,19 +26,29 @@ import WidgetKit
 struct ToolbarDataEntry: TimelineEntry {
     let date: Date
     let isPlaceholder: Bool
+    let userId: String
+    let url: String
     let footerImage: String
     let footerText: String
 }
 
 func getToolbarDataEntry(isPreview: Bool, completion: @escaping (_ entry: ToolbarDataEntry) -> Void) {
 
+    var userId = ""
+    var url = ""
+
+    if let account = NCManageDatabase.shared.getActiveAccount() {
+        userId = account.userId
+        url = account.urlBase
+    }
+
     if isPreview {
-        return completion(ToolbarDataEntry(date: Date(), isPlaceholder: true, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " toolbar"))
+        return completion(ToolbarDataEntry(date: Date(), isPlaceholder: true, userId: userId, url: url, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " toolbar"))
     }
 
     if NCManageDatabase.shared.getActiveAccount() == nil {
-        return completion(ToolbarDataEntry(date: Date(), isPlaceholder: true, footerImage: "xmark.icloud", footerText: NSLocalizedString("_no_active_account_", value: "No account found", comment: "")))
+        return completion(ToolbarDataEntry(date: Date(), isPlaceholder: true, userId: userId, url: url, footerImage: "xmark.icloud", footerText: NSLocalizedString("_no_active_account_", value: "No account found", comment: "")))
     }
 
-    completion(ToolbarDataEntry(date: Date(), isPlaceholder: false, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " toolbar"))
+    completion(ToolbarDataEntry(date: Date(), isPlaceholder: false, userId: userId, url: url, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " toolbar"))
 }

+ 1 - 1
Widget/Toolbar/ToolbarWidgetProvider.swift

@@ -29,7 +29,7 @@ struct ToolbarWidgetProvider: TimelineProvider {
     typealias Entry = ToolbarDataEntry
 
     func placeholder(in context: Context) -> Entry {
-        return Entry(date: Date(), isPlaceholder: true, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " toolbar")
+        return Entry(date: Date(), isPlaceholder: true, userId: "", url: "", footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " toolbar")
     }
 
     func getSnapshot(in context: Context, completion: @escaping (Entry) -> Void) {

+ 12 - 5
Widget/Toolbar/ToolbarWidgetView.swift

@@ -30,6 +30,13 @@ struct ToolbarWidgetView: View {
 
     var body: some View {
 
+        let parameterLink = "&user=\(entry.userId)&url=\(entry.url)"
+        let linkNoAction: URL = URL(string: NCGlobal.shared.widgetActionNoAction + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionNoAction + parameterLink)! : URL(string: NCGlobal.shared.widgetActionNoAction)!
+        let linkActionUploadAsset: URL = URL(string: NCGlobal.shared.widgetActionUploadAsset + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionUploadAsset + parameterLink)! : URL(string: NCGlobal.shared.widgetActionUploadAsset)!
+        let linkActionScanDocument: URL = URL(string: NCGlobal.shared.widgetActionScanDocument + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionScanDocument + parameterLink)! : URL(string: NCGlobal.shared.widgetActionScanDocument)!
+        let linkActionTextDocument: URL = URL(string: NCGlobal.shared.widgetActionTextDocument + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionTextDocument + parameterLink)! : URL(string: NCGlobal.shared.widgetActionTextDocument)!
+        let linkActionVoiceMemo: URL = URL(string: NCGlobal.shared.widgetActionVoiceMemo + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionVoiceMemo + parameterLink)! : URL(string: NCGlobal.shared.widgetActionVoiceMemo)!
+
         GeometryReader { geo in
 
             ZStack(alignment: .topLeading) {
@@ -41,7 +48,7 @@ struct ToolbarWidgetView: View {
 
                     let sizeButton: CGFloat = 65
 
-                    Link(destination: entry.isPlaceholder ? NCGlobal.shared.widgetActionNoAction : NCGlobal.shared.widgetActionUploadAsset, label: {
+                    Link(destination: entry.isPlaceholder ? linkNoAction : linkActionUploadAsset, label: {
                         Image("addImage")
                             .resizable()
                             .renderingMode(.template)
@@ -53,7 +60,7 @@ struct ToolbarWidgetView: View {
                             .frame(width: geo.size.width / 4, height: sizeButton)
                     })
 
-                    Link(destination: entry.isPlaceholder ? NCGlobal.shared.widgetActionNoAction : NCGlobal.shared.widgetActionScanDocument, label: {
+                    Link(destination: entry.isPlaceholder ? linkNoAction : linkActionScanDocument, label: {
                         Image("scan")
                             .resizable()
                             .renderingMode(.template)
@@ -65,7 +72,7 @@ struct ToolbarWidgetView: View {
                             .frame(width: geo.size.width / 4, height: sizeButton)
                     })
 
-                    Link(destination: entry.isPlaceholder ? NCGlobal.shared.widgetActionNoAction : NCGlobal.shared.widgetActionTextDocument, label: {
+                    Link(destination: entry.isPlaceholder ? linkNoAction : linkActionTextDocument, label: {
                         Image("note.text")
                             .resizable()
                             .renderingMode(.template)
@@ -77,7 +84,7 @@ struct ToolbarWidgetView: View {
                             .frame(width: geo.size.width / 4, height: sizeButton)
                     })
 
-                    Link(destination: entry.isPlaceholder ? NCGlobal.shared.widgetActionNoAction : NCGlobal.shared.widgetActionVoiceMemo, label: {
+                    Link(destination: entry.isPlaceholder ? linkNoAction : linkActionVoiceMemo, label: {
                         Image("microphone")
                             .resizable()
                             .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.brandText))
@@ -112,7 +119,7 @@ struct ToolbarWidgetView: View {
 
 struct ToolbarWidget_Previews: PreviewProvider {
     static var previews: some View {
-        let entry = ToolbarDataEntry(date: Date(), isPlaceholder: false, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " toolbar")
+        let entry = ToolbarDataEntry(date: Date(), isPlaceholder: false, userId: "", url: "",  footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " toolbar")
         ToolbarWidgetView(entry: entry).previewContext(WidgetPreviewContext(family: .systemMedium))
     }
 }

+ 3 - 2
Widget/Widget.swift

@@ -22,6 +22,7 @@
 //
 
 import WidgetKit
+import Intents
 import SwiftUI
 
 @main
@@ -53,7 +54,7 @@ struct FilesWidget: Widget {
     let kind: String = "FilesWidget"
 
     var body: some WidgetConfiguration {
-        StaticConfiguration(kind: kind, provider: FilesWidgetProvider()) { entry in
+        IntentConfiguration(kind: kind, intent: AccountIntent.self, provider: FilesWidgetProvider()) { entry in
             FilesWidgetView(entry: entry)
         }
         .supportedFamilies([.systemLarge])
@@ -80,7 +81,7 @@ struct LockscreenWidget: Widget {
 
     var body: some WidgetConfiguration {
         if #available(iOSApplicationExtension 16.0, *) {
-            return StaticConfiguration(kind: kind, provider: LockscreenWidgetProvider()) { entry in
+            return IntentConfiguration(kind: kind, intent: AccountIntent.self, provider: LockscreenWidgetProvider()) { entry in
                 LockscreenWidgetView(entry: entry)
             }
             .supportedFamilies([.accessoryRectangular, .accessoryCircular])

+ 49 - 4
WidgetDashboardIntentHandler/IntentHandler.swift

@@ -9,15 +9,59 @@
 import Intents
 import RealmSwift
 
-class IntentHandler: INExtension, DashboardIntentHandling {
+class IntentHandler: INExtension, DashboardIntentHandling, AccountIntentHandling {
+
+    // MARK: - Account
+
+    // Account
+
+    func provideAccountsOptionsCollection(for intent: AccountIntent, with completion: @escaping (INObjectCollection<Accounts>?, Error?) -> Void) {
+
+        var accounts: [Accounts] = []
+        let results = NCManageDatabase.shared.getAllAccount()
+
+        accounts.append(Accounts(identifier: "active", display: "Active account"))
+
+        if results.isEmpty {
+            return completion(nil, nil)
+        } else if results.count == 1 {
+            return completion(INObjectCollection(items: accounts), nil)
+        }
+        for result in results {
+            let display = (result.alias.isEmpty) ? result.account : result.alias
+            let account = Accounts(identifier: result.account, display: display)
+            accounts.append(account)
+        }
+
+        completion(INObjectCollection(items: accounts), nil)
+    }
+
+    func defaultAccounts(for intent: AccountIntent) -> Accounts? {
+
+        if NCManageDatabase.shared.getActiveAccount() == nil {
+            return nil
+        } else {
+            return Accounts(identifier: "active", display: "Active account")
+        }
+    }
+
+    // MARK: - Dashboard
 
     // Application
 
     func provideApplicationsOptionsCollection(for intent: DashboardIntent, with completion: @escaping (INObjectCollection<Applications>?, Error?) -> Void) {
 
         var applications: [Applications] = []
+        var account: tableAccount?
 
-        guard let account = NCManageDatabase.shared.getActiveAccount() else {
+        let accountIdentifier: String = intent.accounts?.identifier ?? "active"
+        if accountIdentifier == "active" {
+            account = NCManageDatabase.shared.getActiveAccount()
+        } else {
+            account = NCManageDatabase.shared.getAccount(predicate: NSPredicate(format: "account == %@", accountIdentifier))
+        }
+
+        guard let account = account else {
             return completion(nil, nil)
         }
 
@@ -48,10 +92,11 @@ class IntentHandler: INExtension, DashboardIntentHandling {
         var accounts: [Accounts] = []
         let results = NCManageDatabase.shared.getAllAccount()
 
+        accounts.append(Accounts(identifier: "active", display: "Active account"))
+
         if results.isEmpty {
             return completion(nil, nil)
         } else if results.count == 1 {
-            accounts.append(Accounts(identifier: "active", display: NSLocalizedString("_account_active_", comment: "")))
             return completion(INObjectCollection(items: accounts), nil)
         }
         for result in results {
@@ -68,7 +113,7 @@ class IntentHandler: INExtension, DashboardIntentHandling {
         if NCManageDatabase.shared.getActiveAccount() == nil {
             return nil
         } else {
-            return Accounts(identifier: "active", display: NSLocalizedString("_account_active_", comment: ""))
+            return Accounts(identifier: "active", display: "Active account")
         }
     }
 }

+ 55 - 44
iOSClient/AppDelegate.swift

@@ -782,19 +782,32 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
         let action = url.host
         var fileName: String = ""
         var serverUrl: String = ""
-        var matchedAccount: tableAccount?
 
         /*
          Example:
-         nextcloud://open-action?action=create-voice-memo
+         nextcloud://open-action?action=create-voice-memo&&user=marinofaggiana&url=https://cloud.nextcloud.com
          */
 
         if scheme == "nextcloud" && action == "open-action" {
 
             if let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false) {
+
                 let queryItems = urlComponents.queryItems
                 guard let actionScheme = CCUtility.value(forKey: "action", fromQueryItems: queryItems), let rootViewController = window?.rootViewController else { return false }
-                
+                guard let userScheme = CCUtility.value(forKey: "user", fromQueryItems: queryItems) else { return false }
+                guard let urlScheme = CCUtility.value(forKey: "url", fromQueryItems: queryItems) else { return false }
+                if getMatchedAccount(userId: userScheme, url: urlScheme) == nil {
+                    let message = String(format: NSLocalizedString("_account_not_exists_", comment: ""), userScheme, urlScheme)
+
+                    let alertController = UIAlertController(title: NSLocalizedString("_info_", comment: ""), message: message, preferredStyle: .alert)
+                    alertController.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default, handler: { _ in }))
+
+                    window?.rootViewController?.present(alertController, animated: true, completion: { })
+
+                    return false
+                }
+
+
                 switch actionScheme {
                 case NCGlobal.shared.actionUploadAsset:
 
@@ -858,52 +871,30 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
                 guard let userScheme = CCUtility.value(forKey: "user", fromQueryItems: queryItems) else { return false }
                 guard let pathScheme = CCUtility.value(forKey: "path", fromQueryItems: queryItems) else { return false }
                 guard let linkScheme = CCUtility.value(forKey: "link", fromQueryItems: queryItems) else { return false }
+                guard let matchedAccount = getMatchedAccount(userId: userScheme, url: linkScheme) else {
+                    guard let domain = URL(string: linkScheme)?.host else { return true }
+                    fileName = (pathScheme as NSString).lastPathComponent
+                    let message = String(format: NSLocalizedString("_account_not_available_", comment: ""), userScheme, domain, fileName)
 
-                if let activeAccount = NCManageDatabase.shared.getActiveAccount() {
-
-                    let urlBase = URL(string: activeAccount.urlBase)
-                    if linkScheme.contains(urlBase?.host ?? "") && userScheme == activeAccount.userId {
-                        matchedAccount = activeAccount
-                    } else {
-                        let accounts = NCManageDatabase.shared.getAllAccount()
-                        for account in accounts {
-                            let urlBase = URL(string: account.urlBase)
-                            if linkScheme.contains(urlBase?.host ?? "") && userScheme == account.userId {
-                                changeAccount(account.account)
-                                matchedAccount = account
-                                break
-                            }
-                        }
-                    }
-
-                    if matchedAccount != nil {
-
-                        let webDAV = NCUtilityFileSystem.shared.getWebDAV(account: self.account) + "/files/" + self.userId
-                        if pathScheme.contains("/") {
-                            fileName = (pathScheme as NSString).lastPathComponent
-                            serverUrl = matchedAccount!.urlBase + "/" + webDAV + "/" + (pathScheme as NSString).deletingLastPathComponent
-                        } else {
-                            fileName = pathScheme
-                            serverUrl = matchedAccount!.urlBase + "/" + webDAV
-                        }
-
-                        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
-                            NCFunctionCenter.shared.openFileViewInFolder(serverUrl: serverUrl, fileNameBlink: nil, fileNameOpen: fileName)
-                        }
-
-                    } else {
+                    let alertController = UIAlertController(title: NSLocalizedString("_info_", comment: ""), message: message, preferredStyle: .alert)
+                    alertController.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default, handler: { _ in }))
 
-                        guard let domain = URL(string: linkScheme)?.host else { return true }
-                        fileName = (pathScheme as NSString).lastPathComponent
-                        let message = String(format: NSLocalizedString("_account_not_available_", comment: ""), userScheme, domain, fileName)
+                    window?.rootViewController?.present(alertController, animated: true, completion: { })
 
-                        let alertController = UIAlertController(title: NSLocalizedString("_info_", comment: ""), message: message, preferredStyle: .alert)
-                        alertController.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default, handler: { _ in }))
+                    return false
+                }
 
-                        window?.rootViewController?.present(alertController, animated: true, completion: { })
+                let webDAV = NCUtilityFileSystem.shared.getWebDAV(account: self.account) + "/files/" + self.userId
+                if pathScheme.contains("/") {
+                    fileName = (pathScheme as NSString).lastPathComponent
+                    serverUrl = matchedAccount.urlBase + "/" + webDAV + "/" + (pathScheme as NSString).deletingLastPathComponent
+                } else {
+                    fileName = pathScheme
+                    serverUrl = matchedAccount.urlBase + "/" + webDAV
+                }
 
-                        return false
-                    }
+                DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
+                    NCFunctionCenter.shared.openFileViewInFolder(serverUrl: serverUrl, fileNameBlink: nil, fileNameOpen: fileName)
                 }
             }
         } else {
@@ -912,6 +903,26 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
 
         return true
     }
+
+    func getMatchedAccount(userId: String, url: String) -> tableAccount? {
+
+        if let activeAccount = NCManageDatabase.shared.getActiveAccount() {
+            let urlBase = URL(string: activeAccount.urlBase)
+            if url.contains(urlBase?.host ?? "") && userId == activeAccount.userId {
+               return activeAccount
+            } else {
+                let accounts = NCManageDatabase.shared.getAllAccount()
+                for account in accounts {
+                    let urlBase = URL(string: account.urlBase)
+                    if url.contains(urlBase?.host ?? "") && userId == account.userId {
+                        changeAccount(account.account)
+                        return account
+                    }
+                }
+            }
+        }
+        return nil
+    }
 }
 
 // MARK: - NCAudioRecorder ViewController Delegate

+ 1 - 1
iOSClient/Brand/WidgetDashboardIntentHandler.plist

@@ -17,8 +17,8 @@
 			<array/>
 			<key>IntentsSupported</key>
 			<array>
+				<string>AccountIntent</string>
 				<string>DashboardIntent</string>
-				<string>IntentIntent</string>
 			</array>
 		</dict>
 		<key>NSExtensionPointIdentifier</key>

+ 1 - 1
iOSClient/Brand/iOSClient.plist

@@ -77,8 +77,8 @@
 	<string>Photo library access is required to upload your photos and videos to your cloud.</string>
 	<key>NSUserActivityTypes</key>
 	<array>
+		<string>AccountIntent</string>
 		<string>DashboardIntent</string>
-		<string>IntentIntent</string>
 	</array>
 	<key>PHPhotoLibraryPreventAutomaticLimitedAccessAlert</key>
 	<true/>

+ 5 - 5
iOSClient/NCGlobal.swift

@@ -395,11 +395,11 @@ class NCGlobal: NSObject {
     
     // WIDGET ACTION
     //
-    let widgetActionNoAction                                    = URL(string: "nextcloud://open-action?action=no-action")!
-    let widgetActionUploadAsset                                 = URL(string: "nextcloud://open-action?action=upload-asset")!
-    let widgetActionScanDocument                                = URL(string: "nextcloud://open-action?action=add-scan-document")!
-    let widgetActionTextDocument                                = URL(string: "nextcloud://open-action?action=create-text-document")!
-    let widgetActionVoiceMemo                                   = URL(string: "nextcloud://open-action?action=create-voice-memo")!
+    let widgetActionNoAction                                    = "nextcloud://open-action?action=no-action"
+    let widgetActionUploadAsset                                 = "nextcloud://open-action?action=upload-asset"
+    let widgetActionScanDocument                                = "nextcloud://open-action?action=add-scan-document"
+    let widgetActionTextDocument                                = "nextcloud://open-action?action=create-text-document"
+    let widgetActionVoiceMemo                                   = "nextcloud://open-action?action=create-voice-memo"
     
     // APPCONFIG
     //

+ 1 - 1
iOSClient/Supporting Files/en.lproj/Localizable.strings

@@ -111,6 +111,7 @@
 "_force_start_"             = "Force the start";
 "_purchase_"                = "Purchase";
 "_account_not_available_"   = "The account %@ of %@ does not exist, please add it to be able to read the file %@";
+"_account_not_exists_"      = "The account %@ of %@ does not exist";
 "_error_parameter_schema_"  = "Wrong parameters, impossible to continue";
 "_comments_"                = "Comments";
 "_sharing_"                 = "Sharing";
@@ -896,7 +897,6 @@
 "_description_lockscreenwidget_" = "Keep an eye on available space and recent activity";
 "_no_items_"                = "No items";
 "_check_back_late_"         = "Check back late";
-"_account_active_"          = "Account active";
 
 // Video
 "_select_trace_"            = "Select the trace";