Skip to content

Commit b8d4fe1

Browse files
authored
Merge pull request #100 from NordicSemiconductor/hotfix/dfu_delete_files
completed deleting items from DFU directory
2 parents 8f096b1 + 52b081d commit b8d4fe1

File tree

5 files changed

+84
-9
lines changed

5 files changed

+84
-9
lines changed

Podfile.lock

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,4 @@ SPEC CHECKSUMS:
4343

4444
PODFILE CHECKSUM: 231a987b95c8a931837051e6800bdf1778d188ee
4545

46-
COCOAPODS: 1.9.1
46+
COCOAPODS: 1.9.3

nRF Toolbox/Profiles/DeviceFirmwareUpdate/ViewConrollers/DFUFileSelector/FileSelectorViewController.swift

+75-5
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,11 @@ class FileSelectorViewController<T>: UIViewController, AlertPresenter, UITableVi
6565
tableView.registerCellNib(cell: FileTableViewCell.self)
6666
tableView.registerCellClass(cell: NordicActionTableViewCell.self)
6767

68-
NotificationCenter.default.addObserver(self, selector: #selector(reloadList), name: UIApplication.willEnterForegroundNotification, object: nil)
68+
NotificationCenter.default.addObserver(self, selector: #selector(reloadData), name: UIApplication.willEnterForegroundNotification, object: nil)
6969

7070
selectButton.style = .mainAction
7171

72-
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .refresh, target: self, action: #selector(reloadList))
72+
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .refresh, target: self, action: #selector(reloadData))
7373

7474
if #available(iOS 13, *) {
7575
UIImage(systemName: "doc").map { self.docImage.image = $0 }
@@ -82,18 +82,22 @@ class FileSelectorViewController<T>: UIViewController, AlertPresenter, UITableVi
8282

8383
override func viewWillAppear(_ animated: Bool) {
8484
super.viewWillAppear(animated)
85-
reloadList()
85+
reloadData()
8686
}
8787

88-
@objc
89-
func reloadList() {
88+
private func reloadItemList() {
9089
do {
9190
let directory = try documentFileManager.buildDocumentDir()
9291
dataSource.updateItems(directory)
9392
} catch let error {
9493
displayErrorAlert(error: error)
9594
return
9695
}
96+
}
97+
98+
@objc
99+
func reloadData() {
100+
reloadItemList()
97101

98102
if !dataSource.items.isEmpty {
99103
view = tableView
@@ -158,12 +162,78 @@ class FileSelectorViewController<T>: UIViewController, AlertPresenter, UITableVi
158162
} else if let file = dataSource.items[indexPath.row].node as? File, dataSource.items[indexPath.row].valid {
159163
fileWasSelected(file: file)
160164
}
165+
166+
tableView.deselectRow(at: indexPath, animated: true)
161167
}
162168

163169
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
164170
section == 0 ? "Documents Directory" : ""
165171
}
166172

173+
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
174+
indexPath.section == 0
175+
}
176+
177+
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
178+
guard editingStyle == .delete else { return }
179+
let item = self.dataSource.items[indexPath.row]
180+
181+
let deleteItem: (FSNode) -> (Error?) = { [weak self] node in
182+
guard let `self` = self else { return QuickError(message: "Unknown Error") }
183+
184+
do {
185+
try self.documentFileManager.deleteNode(node)
186+
} catch let error {
187+
return error
188+
}
189+
return nil
190+
}
191+
192+
if let directory = item.node as? Directory {
193+
let alert = UIAlertController(title: "Remove Directory", message: "Do you want to delete entire directory with all nested items?", preferredStyle: .alert)
194+
let delete = UIAlertAction(title: "Delete", style: .destructive, handler: { _ in
195+
self.removeDirectory(directory, rootItem: item, deleteAction: deleteItem)
196+
})
197+
let cancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
198+
199+
alert.addAction(delete)
200+
alert.addAction(cancel)
201+
202+
self.present(alert, animated: true, completion: nil)
203+
} else {
204+
deleteFile(item.node, deleteAction: deleteItem)
205+
}
206+
207+
}
208+
209+
private func removeDirectory(_ dir: Directory, rootItem: FSNodeRepresentation, deleteAction: (FSNode) -> (Error?)) {
210+
let indexPaths = ([rootItem] + dataSource.items(dir))
211+
.compactMap { item in
212+
self.dataSource.items.firstIndex { item.node.url == $0.node.url }
213+
}
214+
.map { IndexPath(row: $0, section: 0)}
215+
if let error = deleteAction(rootItem.node) {
216+
displayErrorAlert(error: error)
217+
return
218+
}
219+
self.reloadItemList()
220+
tableView.deleteRows(at: indexPaths, with: .automatic)
221+
}
222+
223+
private func deleteFile(_ item: FSNode, deleteAction: (FSNode) -> (Error?)) {
224+
guard let ip = self.dataSource.items
225+
.firstIndex (where: { item.url == $0.node.url })
226+
.map ({ IndexPath(row: $0, section: 0) }) else {
227+
return
228+
}
229+
230+
if let error = deleteAction(item) {
231+
displayErrorAlert(error: error)
232+
return
233+
}
234+
self.reloadItemList()
235+
tableView.deleteRows(at: [ip], with: .automatic)
236+
}
167237
}
168238

169239
class DFUFileSelectorViewController: FileSelectorViewController<DFUFirmware> {

nRF Toolbox/Profiles/DeviceFirmwareUpdate/ViewConrollers/DFUFileSelector/Utils/DocumentFileManager.swift

+4
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,8 @@ class DocumentFileManager: FileManager {
6868
return []
6969
}
7070
}
71+
72+
func deleteNode(_ node: FSNode) throws {
73+
try removeItem(at: node.url)
74+
}
7175
}

nRF Toolbox/Profiles/DeviceFirmwareUpdate/ViewConrollers/DFUFileSelector/Utils/FSDataSource.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ struct FSNodeRepresentation {
4545
var modificationDate: Date?
4646
var sizeInfo: String
4747
var valid: Bool
48+
var isDirectory: Bool
4849
}
4950

5051
struct FSDataSource {
@@ -76,7 +77,7 @@ struct FSDataSource {
7677
infoText = ByteCountFormatter().string(fromByteCount: Int64((node as! File).size))
7778
}
7879

79-
res.append(FSNodeRepresentation(node: node, level: level, name: node.name, collapsed: false, size: 0, image: image!, modificationDate: node.resourceModificationDate, sizeInfo: infoText, valid: valid))
80+
res.append(FSNodeRepresentation(node: node, level: level, name: node.name, collapsed: false, size: 0, image: image!, modificationDate: node.resourceModificationDate, sizeInfo: infoText, valid: valid, isDirectory: (node is Directory)))
8081
if let dir = node as? Directory {
8182
res.append(contentsOf: self.items(dir, level: level + 1))
8283
}

nRF Toolbox/Profiles/DeviceFirmwareUpdate/ViewConrollers/DFUFileSelector/Utils/UIImage+File.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ extension UIImage {
4444

4545
// allIcons is guaranteed to have at least one image
4646
switch preferredSize {
47-
case .smallest: return allIcons.first!
48-
case .largest: return allIcons.last!
47+
case .smallest: return allIcons.first ?? UIImage()
48+
case .largest: return allIcons.last ?? UIImage()
4949
}
5050
}
5151
}

0 commit comments

Comments
 (0)