浏览代码

Merge pull request #2220 from nextcloud/widget-improvements

Widget improvements
Marino Faggiana 2 年之前
父节点
当前提交
c7a4b77221
共有 54 个文件被更改,包括 693 次插入175 次删除
  1. 88 88
      Nextcloud.xcodeproj/project.pbxproj
  2. 18 9
      Widget/Dashboard/DashboardData.swift
  3. 3 3
      Widget/Dashboard/DashboardWidgetProvider.swift
  4. 87 69
      Widget/Dashboard/DashboardWidgetView.swift
  5. 103 3
      Widget/Dashboard/Intent/Base.lproj/Dashboard.intentdefinition
  6. 8 0
      Widget/Dashboard/Intent/ca.lproj/Dashboard.strings
  7. 8 0
      Widget/Dashboard/Intent/cs-CZ.lproj/Dashboard.strings
  8. 8 0
      Widget/Dashboard/Intent/da.lproj/Dashboard.strings
  9. 8 0
      Widget/Dashboard/Intent/de.lproj/Dashboard.strings
  10. 8 0
      Widget/Dashboard/Intent/en-GB.lproj/Dashboard.strings
  11. 8 0
      Widget/Dashboard/Intent/en.lproj/Dashboard.strings
  12. 8 0
      Widget/Dashboard/Intent/es-419.lproj/Dashboard.strings
  13. 8 0
      Widget/Dashboard/Intent/es-CL.lproj/Dashboard.strings
  14. 8 0
      Widget/Dashboard/Intent/es-CO.lproj/Dashboard.strings
  15. 8 0
      Widget/Dashboard/Intent/es-CR.lproj/Dashboard.strings
  16. 8 0
      Widget/Dashboard/Intent/es-DO.lproj/Dashboard.strings
  17. 8 0
      Widget/Dashboard/Intent/es-EC.lproj/Dashboard.strings
  18. 8 0
      Widget/Dashboard/Intent/es-GT.lproj/Dashboard.strings
  19. 8 0
      Widget/Dashboard/Intent/es-HN.lproj/Dashboard.strings
  20. 8 0
      Widget/Dashboard/Intent/es-MX.lproj/Dashboard.strings
  21. 8 0
      Widget/Dashboard/Intent/es-NI.lproj/Dashboard.strings
  22. 8 0
      Widget/Dashboard/Intent/es-PA.lproj/Dashboard.strings
  23. 8 0
      Widget/Dashboard/Intent/es-PE.lproj/Dashboard.strings
  24. 8 0
      Widget/Dashboard/Intent/es-PR.lproj/Dashboard.strings
  25. 8 0
      Widget/Dashboard/Intent/es-PY.lproj/Dashboard.strings
  26. 8 0
      Widget/Dashboard/Intent/es-SV.lproj/Dashboard.strings
  27. 8 0
      Widget/Dashboard/Intent/es-UY.lproj/Dashboard.strings
  28. 8 0
      Widget/Dashboard/Intent/es.lproj/Dashboard.strings
  29. 8 0
      Widget/Dashboard/Intent/eu.lproj/Dashboard.strings
  30. 8 0
      Widget/Dashboard/Intent/fr.lproj/Dashboard.strings
  31. 8 0
      Widget/Dashboard/Intent/gl.lproj/Dashboard.strings
  32. 8 0
      Widget/Dashboard/Intent/hu.lproj/Dashboard.strings
  33. 8 0
      Widget/Dashboard/Intent/is.lproj/Dashboard.strings
  34. 8 0
      Widget/Dashboard/Intent/it.lproj/Dashboard.strings
  35. 8 0
      Widget/Dashboard/Intent/ja-JP.lproj/Dashboard.strings
  36. 8 0
      Widget/Dashboard/Intent/ka-GE.lproj/Dashboard.strings
  37. 8 0
      Widget/Dashboard/Intent/ko.lproj/Dashboard.strings
  38. 8 0
      Widget/Dashboard/Intent/nb-NO.lproj/Dashboard.strings
  39. 8 0
      Widget/Dashboard/Intent/nl.lproj/Dashboard.strings
  40. 8 0
      Widget/Dashboard/Intent/pl.lproj/Dashboard.strings
  41. 8 0
      Widget/Dashboard/Intent/pt-BR.lproj/Dashboard.strings
  42. 8 0
      Widget/Dashboard/Intent/pt-PT.lproj/Dashboard.strings
  43. 8 0
      Widget/Dashboard/Intent/ru.lproj/Dashboard.strings
  44. 8 0
      Widget/Dashboard/Intent/sk-SK.lproj/Dashboard.strings
  45. 8 0
      Widget/Dashboard/Intent/sr.lproj/Dashboard.strings
  46. 8 0
      Widget/Dashboard/Intent/sv.lproj/Dashboard.strings
  47. 8 0
      Widget/Dashboard/Intent/tr.lproj/Dashboard.strings
  48. 8 0
      Widget/Dashboard/Intent/zh-Hans.lproj/Dashboard.strings
  49. 8 0
      Widget/Dashboard/Intent/zh-Hant-TW.lproj/Dashboard.strings
  50. 34 2
      WidgetDashboardIntentHandler/IntentHandler.swift
  51. 1 0
      iOSClient/Brand/WidgetDashboardIntentHandler.plist
  52. 1 0
      iOSClient/Brand/iOSClient.plist
  53. 3 1
      iOSClient/More/NCMore.swift
  54. 3 0
      iOSClient/Supporting Files/en.lproj/Localizable.strings

+ 88 - 88
Nextcloud.xcodeproj/project.pbxproj

@@ -712,7 +712,6 @@
 		F710D1F42405770F00A6033D /* NCViewerPDF.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCViewerPDF.swift; sourceTree = "<group>"; };
 		F710D2012405826100A6033D /* NCViewer+Menu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCViewer+Menu.swift"; sourceTree = "<group>"; };
 		F710E80F1EF95C9C00DC2427 /* ImagesIntro.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = ImagesIntro.xcassets; sourceTree = "<group>"; };
-		F711D63328F47A66003F43C8 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Dashboard.strings; sourceTree = "<group>"; };
 		F7134184259747BA00768D21 /* NCPushNotification.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NCPushNotification.h; sourceTree = "<group>"; };
 		F7134185259747BA00768D21 /* NCPushNotification.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NCPushNotification.m; sourceTree = "<group>"; };
 		F713FEFE2472764000214AF6 /* UIImage+animatedGIF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+animatedGIF.h"; sourceTree = "<group>"; };
@@ -749,6 +748,50 @@
 		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>"; };
@@ -1036,49 +1079,6 @@
 		F7CB689F254169530050EC94 /* NCSettings.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = NCSettings.storyboard; sourceTree = "<group>"; };
 		F7CBC31B24F78E79004D3812 /* NCSortMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCSortMenu.swift; sourceTree = "<group>"; };
 		F7CC04E61F5AD50D00378CEF /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = "<group>"; };
-		F7CD836428F6B4DA00E93B11 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F7CD836628F6B4DA00E93B11 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F7CD836828F6B4DB00E93B11 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD836A28F6B4DC00E93B11 /* zh-Hant-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant-TW"; path = "zh-Hant-TW.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD836C28F6B4DC00E93B11 /* cs-CZ */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "cs-CZ"; path = "cs-CZ.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD836E28F6B4DD00E93B11 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F7CD837028F6B4E100E93B11 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F7CD837228F6B4E300E93B11 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD837428F6B4E700E93B11 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F7CD837628F6B4E800E93B11 /* gl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = gl; path = gl.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F7CD837828F6B4EA00E93B11 /* ka-GE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ka-GE"; path = "ka-GE.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD837A28F6B4EC00E93B11 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F7CD837C28F6B4ED00E93B11 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F7CD837E28F6B4EE00E93B11 /* is */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = is; path = is.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F7CD838028F6B4EF00E93B11 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F7CD838228F6B4F000E93B11 /* ja-JP */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ja-JP"; path = "ja-JP.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD838428F6B4F200E93B11 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F7CD838628F6B4F300E93B11 /* nb-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "nb-NO"; path = "nb-NO.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD838828F6B4F400E93B11 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F7CD838A28F6B4F800E93B11 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD838C28F6B4F900E93B11 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD838E28F6B4F900E93B11 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F7CD839028F6B4FA00E93B11 /* sr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sr; path = sr.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F7CD839228F6B4FB00E93B11 /* sk-SK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sk-SK"; path = "sk-SK.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD839428F6B4FC00E93B11 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F7CD839628F6B4FC00E93B11 /* es-CL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CL"; path = "es-CL.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD839828F6B4FD00E93B11 /* es-CO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CO"; path = "es-CO.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD839A28F6B4FE00E93B11 /* es-CR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CR"; path = "es-CR.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD839C28F6B4FF00E93B11 /* es-DO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-DO"; path = "es-DO.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD839E28F6B4FF00E93B11 /* es-EC */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-EC"; path = "es-EC.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD83A028F6B50000E93B11 /* es-SV */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-SV"; path = "es-SV.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD83A228F6B50100E93B11 /* es-GT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-GT"; path = "es-GT.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD83A428F6B50100E93B11 /* es-HN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-HN"; path = "es-HN.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD83A628F6B50200E93B11 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD83A828F6B50300E93B11 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD83AA28F6B50400E93B11 /* es-NI */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-NI"; path = "es-NI.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD83AC28F6B50400E93B11 /* es-PA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PA"; path = "es-PA.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD83AE28F6B50500E93B11 /* es-PY */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PY"; path = "es-PY.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD83B028F6B50600E93B11 /* es-PE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PE"; path = "es-PE.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD83B228F6B50700E93B11 /* es-PR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PR"; path = "es-PR.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD83B428F6B50700E93B11 /* es-UY */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-UY"; path = "es-UY.lproj/Dashboard.strings"; sourceTree = "<group>"; };
-		F7CD83B628F6B50800E93B11 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Dashboard.strings; sourceTree = "<group>"; };
-		F7CD83B828F6B50800E93B11 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Dashboard.strings; sourceTree = "<group>"; };
 		F7CE8AFA1DC1F8D8009CAE48 /* Nextcloud.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Nextcloud.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		F7CE8AFB1DC1F8D8009CAE48 /* Share.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = Share.appex; sourceTree = BUILT_PRODUCTS_DIR; };
 		F7D0F33D264144FC0097D4A3 /* Background.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Background.xcassets; sourceTree = "<group>"; };
@@ -3252,50 +3252,50 @@
 			isa = PBXVariantGroup;
 			children = (
 				F7FABE3828D1DAD00000A325 /* Base */,
-				F711D63328F47A66003F43C8 /* en */,
-				F7CD836428F6B4DA00E93B11 /* eu */,
-				F7CD836628F6B4DA00E93B11 /* ca */,
-				F7CD836828F6B4DB00E93B11 /* zh-Hans */,
-				F7CD836A28F6B4DC00E93B11 /* zh-Hant-TW */,
-				F7CD836C28F6B4DC00E93B11 /* cs-CZ */,
-				F7CD836E28F6B4DD00E93B11 /* da */,
-				F7CD837028F6B4E100E93B11 /* nl */,
-				F7CD837228F6B4E300E93B11 /* en-GB */,
-				F7CD837428F6B4E700E93B11 /* fr */,
-				F7CD837628F6B4E800E93B11 /* gl */,
-				F7CD837828F6B4EA00E93B11 /* ka-GE */,
-				F7CD837A28F6B4EC00E93B11 /* de */,
-				F7CD837C28F6B4ED00E93B11 /* hu */,
-				F7CD837E28F6B4EE00E93B11 /* is */,
-				F7CD838028F6B4EF00E93B11 /* it */,
-				F7CD838228F6B4F000E93B11 /* ja-JP */,
-				F7CD838428F6B4F200E93B11 /* ko */,
-				F7CD838628F6B4F300E93B11 /* nb-NO */,
-				F7CD838828F6B4F400E93B11 /* pl */,
-				F7CD838A28F6B4F800E93B11 /* pt-BR */,
-				F7CD838C28F6B4F900E93B11 /* pt-PT */,
-				F7CD838E28F6B4F900E93B11 /* ru */,
-				F7CD839028F6B4FA00E93B11 /* sr */,
-				F7CD839228F6B4FB00E93B11 /* sk-SK */,
-				F7CD839428F6B4FC00E93B11 /* es */,
-				F7CD839628F6B4FC00E93B11 /* es-CL */,
-				F7CD839828F6B4FD00E93B11 /* es-CO */,
-				F7CD839A28F6B4FE00E93B11 /* es-CR */,
-				F7CD839C28F6B4FF00E93B11 /* es-DO */,
-				F7CD839E28F6B4FF00E93B11 /* es-EC */,
-				F7CD83A028F6B50000E93B11 /* es-SV */,
-				F7CD83A228F6B50100E93B11 /* es-GT */,
-				F7CD83A428F6B50100E93B11 /* es-HN */,
-				F7CD83A628F6B50200E93B11 /* es-419 */,
-				F7CD83A828F6B50300E93B11 /* es-MX */,
-				F7CD83AA28F6B50400E93B11 /* es-NI */,
-				F7CD83AC28F6B50400E93B11 /* es-PA */,
-				F7CD83AE28F6B50500E93B11 /* es-PY */,
-				F7CD83B028F6B50600E93B11 /* es-PE */,
-				F7CD83B228F6B50700E93B11 /* es-PR */,
-				F7CD83B428F6B50700E93B11 /* es-UY */,
-				F7CD83B628F6B50800E93B11 /* sv */,
-				F7CD83B828F6B50800E93B11 /* tr */,
+				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>";

+ 18 - 9
Widget/Dashboard/DashboardData.swift

@@ -32,6 +32,7 @@ struct DashboardDataEntry: TimelineEntry {
     let dashboard: tableDashboardWidget?
     let buttons: [tableDashboardWidgetButton]?
     let isPlaceholder: Bool
+    let isEmpty: Bool
     let titleImage: UIImage
     let title: String
     let footerImage: String
@@ -79,26 +80,34 @@ func getDashboardItems(displaySize: CGSize, withButton: Bool) -> Int {
     }
 }
 
-func getDashboardDataEntry(intent: Applications?, isPreview: Bool, displaySize: CGSize, completion: @escaping (_ entry: DashboardDataEntry) -> Void) {
+func getDashboardDataEntry(intent: DashboardIntent?, isPreview: Bool, displaySize: CGSize, completion: @escaping (_ entry: DashboardDataEntry) -> Void) {
 
     let dashboardItems = getDashboardItems(displaySize: displaySize, withButton: false)
     let datasPlaceholder = Array(dashboardDatasTest[0...dashboardItems - 1])
+    var account: tableAccount?
 
     if isPreview {
-        return completion(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: nil, buttons: nil, isPlaceholder: true, titleImage: UIImage(named: "widget")!, title: "Dashboard", footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " dashboard"))
+        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"))
     }
 
-    guard let account = NCManageDatabase.shared.getActiveAccount() else {
-        return completion(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: nil, buttons: nil, isPlaceholder: true, titleImage: UIImage(named: "widget")!, title: "Dashboard", footerImage: "xmark.icloud", footerText: NSLocalizedString("_no_active_account_", comment: "")))
+    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(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: nil, buttons: nil, isPlaceholder: true, isEmpty: false, titleImage: UIImage(named: "widget")!, title: "Dashboard", footerImage: "xmark.icloud", footerText: NSLocalizedString("_no_active_account_", comment: "")))
     }
 
     // Default widget
     let result = NCManageDatabase.shared.getDashboardWidgetApplications(account: account.account).first
-    let id: String = intent?.identifier ?? (result?.id ?? "recommendations")
+    let id: String = intent?.Applications?.identifier ?? (result?.id ?? "recommendations")
 
     let serverVersionMajor = NCManageDatabase.shared.getCapabilitiesServerInt(account: account.account, elements: NCElementsJSON.shared.capabilitiesVersionMajor)
     guard serverVersionMajor >= NCGlobal.shared.nextcloudVersion25 else {
-        return completion(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: nil, buttons: nil, isPlaceholder: true, titleImage: UIImage(named: "widget")!, title: "Dashboard", footerImage: "xmark.icloud", footerText: NSLocalizedString("_widget_available_nc25_", comment: "")))
+        return completion(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: nil, buttons: nil, isPlaceholder: true, isEmpty: false, titleImage: UIImage(named: "widget")!, title: "Dashboard", footerImage: "xmark.icloud", footerText: NSLocalizedString("_widget_available_nc25_", comment: "")))
     }
         
     // NETWORKING
@@ -223,11 +232,11 @@ func getDashboardDataEntry(intent: Applications?, isPreview: Bool, displaySize:
             }
 
             if error != .success {
-                completion(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: tableDashboard, buttons: buttons, isPlaceholder: true, titleImage: titleImage, title: title, footerImage: "xmark.icloud", footerText: error.errorDescription))
+                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: true, titleImage: titleImage, title: title, footerImage: "checkmark.icloud", footerText: NSLocalizedString("_no_data_available_", comment: "")))
+                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, 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: false, titleImage: titleImage, title: title, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " dashboard"))
             }
         }
     }

+ 3 - 3
Widget/Dashboard/DashboardWidgetProvider.swift

@@ -35,17 +35,17 @@ struct DashboardWidgetProvider: IntentTimelineProvider {
         let datasPlaceholder = Array(dashboardDatasTest[0...dashboardItems])
         let title = "Dashboard"
         let titleImage = UIImage(named: "widget")!
-        return Entry(date: Date(), datas: datasPlaceholder, dashboard: nil, buttons: nil, isPlaceholder: true, titleImage: titleImage, title: title, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " widget")
+        return Entry(date: Date(), datas: datasPlaceholder, dashboard: nil, buttons: nil, isPlaceholder: true, isEmpty: false, titleImage: titleImage, title: title, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " widget")
     }
 
     func getSnapshot(for configuration: DashboardIntent, in context: Context, completion: @escaping (DashboardDataEntry) -> Void) {
-        getDashboardDataEntry(intent: configuration.Applications, isPreview: false, displaySize: context.displaySize) { entry in
+        getDashboardDataEntry(intent: 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.Applications, isPreview: context.isPreview, displaySize: context.displaySize) { entry in
+        getDashboardDataEntry(intent: configuration, isPreview: context.isPreview, displaySize: context.displaySize) { entry in
             let timeLine = Timeline(entries: [entry], policy: .atEnd)
             completion(timeLine)
         }

+ 87 - 69
Widget/Dashboard/DashboardWidgetView.swift

@@ -32,10 +32,25 @@ struct DashboardWidgetView: View {
         
         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() {
-                    
+
                     Image(uiImage: entry.titleImage)
                         .renderingMode(.template)
                         .resizable()
@@ -51,88 +66,91 @@ struct DashboardWidgetView: 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.link) {
-                                
-                                HStack {
-                                    
-                                    let subTitleColor = Color(white: 0.5)
-
-                                    if entry.isPlaceholder {
-                                        Circle()
-                                            .fill(Color(.systemGray4))
-                                            .frame(width: 35, height: 35)
-                                    } else if let color = element.imageColor {
-                                        Image(uiImage: element.icon)
-                                            .renderingMode(.template)
-                                            .resizable()
-                                            .frame(width: 20, height: 20)
-                                            .foregroundColor(Color(color))
-                                    } else if element.template {
-                                        if entry.dashboard?.itemIconsRound ?? false {
+
+                if !entry.isEmpty {
+
+                    VStack(alignment: .leading) {
+
+                        VStack(spacing: 0) {
+
+                            ForEach(entry.datas, id: \.id) { element in
+
+                                Link(destination: element.link) {
+
+                                    HStack {
+
+                                        let subTitleColor = Color(white: 0.5)
+
+                                        if entry.isPlaceholder {
+                                            Circle()
+                                                .fill(Color(.systemGray4))
+                                                .frame(width: 35, height: 35)
+                                        } else if let color = element.imageColor {
                                             Image(uiImage: element.icon)
                                                 .renderingMode(.template)
                                                 .resizable()
-                                                .scaledToFill()
                                                 .frame(width: 20, height: 20)
-                                                .foregroundColor(.white)
-                                                .padding(8)
-                                                .background(Color(.systemGray4))
-                                                .clipShape(Circle())
-                                        } else {
-                                            Image(uiImage: element.icon)
-                                                .renderingMode(.template)
-                                                .resizable()
-                                                .scaledToFill()
-                                                .frame(width: 25, height: 25)
-                                                .clipped()
-                                                .cornerRadius(5)
-                                        }
-                                    } else {
-                                        if entry.dashboard?.itemIconsRound ?? false || element.avatar {
-                                            Image(uiImage: element.icon)
-                                                .resizable()
-                                                .scaledToFill()
-                                                .frame(width: 35, height: 35)
-                                                .clipShape(Circle())
+                                                .foregroundColor(Color(color))
+                                        } else if element.template {
+                                            if entry.dashboard?.itemIconsRound ?? false {
+                                                Image(uiImage: element.icon)
+                                                    .renderingMode(.template)
+                                                    .resizable()
+                                                    .scaledToFill()
+                                                    .frame(width: 20, height: 20)
+                                                    .foregroundColor(.white)
+                                                    .padding(8)
+                                                    .background(Color(.systemGray4))
+                                                    .clipShape(Circle())
+                                            } else {
+                                                Image(uiImage: element.icon)
+                                                    .renderingMode(.template)
+                                                    .resizable()
+                                                    .scaledToFill()
+                                                    .frame(width: 25, height: 25)
+                                                    .clipped()
+                                                    .cornerRadius(5)
+                                            }
                                         } else {
-                                            Image(uiImage: element.icon)
-                                                .resizable()
-                                                .scaledToFill()
-                                                .frame(width: 35, height: 35)
-                                                .clipped()
-                                                .cornerRadius(5)
+                                            if entry.dashboard?.itemIconsRound ?? false || element.avatar {
+                                                Image(uiImage: element.icon)
+                                                    .resizable()
+                                                    .scaledToFill()
+                                                    .frame(width: 35, height: 35)
+                                                    .clipShape(Circle())
+                                            } else {
+                                                Image(uiImage: element.icon)
+                                                    .resizable()
+                                                    .scaledToFill()
+                                                    .frame(width: 35, height: 35)
+                                                    .clipped()
+                                                    .cornerRadius(5)
+                                            }
                                         }
-                                    }
 
-                                    VStack(alignment: .leading, spacing: 2) {
+                                        VStack(alignment: .leading, spacing: 2) {
 
-                                        Text(element.title)
-                                            .font(.system(size: 12))
-                                            .fontWeight(.regular)
+                                            Text(element.title)
+                                                .font(.system(size: 12))
+                                                .fontWeight(.regular)
 
-                                        Text(element.subTitle)
-                                            .font(.system(size: CGFloat(10)))
-                                            .foregroundColor(subTitleColor)
+                                            Text(element.subTitle)
+                                                .font(.system(size: CGFloat(10)))
+                                                .foregroundColor(subTitleColor)
+                                        }
+                                        Spacer()
                                     }
-                                    Spacer()
+                                    .padding(.leading, 10)
+                                    .frame(height: 50)
                                 }
-                                .padding(.leading, 10)
-                                .frame(height: 50)
+                                Divider()
+                                    .padding(.leading, 54)
                             }
-                            Divider()
-                                .padding(.leading, 54)
                         }
                     }
+                    .padding(.top, 35)
+                    .redacted(reason: entry.isPlaceholder ? .placeholder : [])
                 }
-                .padding(.top, 35)
-                .redacted(reason: entry.isPlaceholder ? .placeholder : [])
 
                 if let buttons = entry.buttons, !buttons.isEmpty, !entry.isPlaceholder {
 
@@ -181,7 +199,7 @@ struct DashboardWidget_Previews: PreviewProvider {
         let datas = Array(dashboardDatasTest[0...4])
         let title = "Dashboard"
         let titleImage = UIImage(named: "widget")!
-        let entry = DashboardDataEntry(date: Date(), datas: datas, dashboard: nil, buttons: nil, isPlaceholder: false, titleImage: titleImage, title: title, footerImage: "checkmark.icloud", footerText: "Nextcloud widget")
+        let entry = DashboardDataEntry(date: Date(), datas: datas, dashboard: nil, buttons: nil, isPlaceholder: false, isEmpty: true, titleImage: titleImage, title: title, footerImage: "checkmark.icloud", footerText: "Nextcloud widget")
         DashboardWidgetView(entry: entry).previewContext(WidgetPreviewContext(family: .systemLarge))
     }
 }

+ 103 - 3
Widget/Dashboard/Intent/Base.lproj/Dashboard.intentdefinition

@@ -9,7 +9,7 @@
 	<key>INIntentDefinitionNamespace</key>
 	<string>88xZPY</string>
 	<key>INIntentDefinitionSystemVersion</key>
-	<string>21G115</string>
+	<string>22A380</string>
 	<key>INIntentDefinitionToolsBuildVersion</key>
 	<string>14A309</string>
 	<key>INIntentDefinitionToolsVersion</key>
@@ -28,11 +28,48 @@
 			<key>INIntentIneligibleForSuggestions</key>
 			<true/>
 			<key>INIntentLastParameterTag</key>
-			<integer>7</integer>
+			<integer>9</integer>
 			<key>INIntentName</key>
 			<string>Dashboard</string>
 			<key>INIntentParameters</key>
 			<array>
+				<dict>
+					<key>INIntentParameterConfigurable</key>
+					<true/>
+					<key>INIntentParameterDisplayName</key>
+					<string>Account</string>
+					<key>INIntentParameterDisplayNameID</key>
+					<string>jHO1Mn</string>
+					<key>INIntentParameterDisplayPriority</key>
+					<integer>1</integer>
+					<key>INIntentParameterName</key>
+					<string>Accounts</string>
+					<key>INIntentParameterObjectType</key>
+					<string>Accounts</string>
+					<key>INIntentParameterObjectTypeNamespace</key>
+					<string>88xZPY</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>
+					</array>
+					<key>INIntentParameterSupportsDynamicEnumeration</key>
+					<true/>
+					<key>INIntentParameterTag</key>
+					<integer>9</integer>
+					<key>INIntentParameterType</key>
+					<string>Object</string>
+				</dict>
 				<dict>
 					<key>INIntentParameterConfigurable</key>
 					<true/>
@@ -41,7 +78,7 @@
 					<key>INIntentParameterDisplayNameID</key>
 					<string>TRaTZg</string>
 					<key>INIntentParameterDisplayPriority</key>
-					<integer>1</integer>
+					<integer>2</integer>
 					<key>INIntentParameterName</key>
 					<string>Applications</string>
 					<key>INIntentParameterObjectType</key>
@@ -164,6 +201,69 @@
 				</dict>
 			</array>
 		</dict>
+		<dict>
+			<key>INTypeDisplayName</key>
+			<string>Accounts</string>
+			<key>INTypeDisplayNameID</key>
+			<string>dLCeWT</string>
+			<key>INTypeLastPropertyTag</key>
+			<integer>99</integer>
+			<key>INTypeName</key>
+			<string>Accounts</string>
+			<key>INTypeProperties</key>
+			<array>
+				<dict>
+					<key>INTypePropertyDefault</key>
+					<true/>
+					<key>INTypePropertyDisplayPriority</key>
+					<integer>1</integer>
+					<key>INTypePropertyName</key>
+					<string>identifier</string>
+					<key>INTypePropertyTag</key>
+					<integer>1</integer>
+					<key>INTypePropertyType</key>
+					<string>String</string>
+				</dict>
+				<dict>
+					<key>INTypePropertyDefault</key>
+					<true/>
+					<key>INTypePropertyDisplayPriority</key>
+					<integer>2</integer>
+					<key>INTypePropertyName</key>
+					<string>displayString</string>
+					<key>INTypePropertyTag</key>
+					<integer>2</integer>
+					<key>INTypePropertyType</key>
+					<string>String</string>
+				</dict>
+				<dict>
+					<key>INTypePropertyDefault</key>
+					<true/>
+					<key>INTypePropertyDisplayPriority</key>
+					<integer>3</integer>
+					<key>INTypePropertyName</key>
+					<string>pronunciationHint</string>
+					<key>INTypePropertyTag</key>
+					<integer>3</integer>
+					<key>INTypePropertyType</key>
+					<string>String</string>
+				</dict>
+				<dict>
+					<key>INTypePropertyDefault</key>
+					<true/>
+					<key>INTypePropertyDisplayPriority</key>
+					<integer>4</integer>
+					<key>INTypePropertyName</key>
+					<string>alternativeSpeakableMatches</string>
+					<key>INTypePropertySupportsMultipleValues</key>
+					<true/>
+					<key>INTypePropertyTag</key>
+					<integer>4</integer>
+					<key>INTypePropertyType</key>
+					<string>SpeakableString</string>
+				</dict>
+			</array>
+		</dict>
 	</array>
 </dict>
 </plist>

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

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

@@ -1,8 +1,16 @@
 "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}’?";
+

+ 34 - 2
WidgetDashboardIntentHandler/IntentHandler.swift

@@ -11,13 +11,14 @@ import RealmSwift
 
 class IntentHandler: INExtension, DashboardIntentHandling {
 
+    // Application
+
     func provideApplicationsOptionsCollection(for intent: DashboardIntent, with completion: @escaping (INObjectCollection<Applications>?, Error?) -> Void) {
 
         var applications: [Applications] = []
 
         guard let account = NCManageDatabase.shared.getActiveAccount() else {
-            completion(nil, nil)
-            return
+            return completion(nil, nil)
         }
 
         let results = NCManageDatabase.shared.getDashboardWidgetApplications(account: account.account)
@@ -39,4 +40,35 @@ class IntentHandler: INExtension, DashboardIntentHandling {
         }
         return nil
     }
+
+    // Account
+
+    func provideAccountsOptionsCollection(for intent: DashboardIntent, with completion: @escaping (INObjectCollection<Accounts>?, Error?) -> Void) {
+
+        var accounts: [Accounts] = []
+        let results = NCManageDatabase.shared.getAllAccount()
+
+        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 {
+            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: DashboardIntent) -> Accounts? {
+
+        if NCManageDatabase.shared.getActiveAccount() == nil {
+            return nil
+        } else {
+            return Accounts(identifier: "active", display: NSLocalizedString("_account_active_", comment: ""))
+        }
+    }
 }

+ 1 - 0
iOSClient/Brand/WidgetDashboardIntentHandler.plist

@@ -18,6 +18,7 @@
 			<key>IntentsSupported</key>
 			<array>
 				<string>DashboardIntent</string>
+				<string>IntentIntent</string>
 			</array>
 		</dict>
 		<key>NSExtensionPointIdentifier</key>

+ 1 - 0
iOSClient/Brand/iOSClient.plist

@@ -78,6 +78,7 @@
 	<key>NSUserActivityTypes</key>
 	<array>
 		<string>DashboardIntent</string>
+		<string>IntentIntent</string>
 	</array>
 	<key>PHPhotoLibraryPreventAutomaticLimitedAccessAlert</key>
 	<true/>

+ 3 - 1
iOSClient/More/NCMore.swift

@@ -167,6 +167,7 @@ class NCMore: UIViewController, UITableViewDelegate, UITableViewDataSource {
         settingsMenu.append(item)
 
         // ITEM: Test API
+        /*
         if NCUtility.shared.isSimulator() {
             item = NKExternalSite()
             item.name = "Test API"
@@ -174,7 +175,8 @@ class NCMore: UIViewController, UITableViewDelegate, UITableViewDataSource {
             item.url = "test"
             settingsMenu.append(item)
         }
-
+        */
+        
         if quotaMenu.count > 0 {
             let item = quotaMenu[0]
             labelQuotaExternalSite.text = item.name

+ 3 - 0
iOSClient/Supporting Files/en.lproj/Localizable.strings

@@ -894,6 +894,9 @@
 "_recent_activity_"         = "Recent activity";
 "_title_lockscreenwidget_"  = "Status";
 "_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";