[DataHolder]: Fixes for out-of-bounds condition and revert back to if-else instead of guard-else for better representation of logic

This commit is contained in:
Magesh K
2025-01-12 00:03:25 +05:30
parent d13e469cf2
commit 61989e7d40
2 changed files with 36 additions and 40 deletions

View File

@@ -41,49 +41,39 @@ class ActiveAppsTimelineProvider<T: WidgetInfo>: AppsTimelineProviderBase<Widge
apps = getSimulatedData(apps: apps) apps = getSimulatedData(apps: apps)
#endif #endif
// always first page since this is never updated // always start with first page since defaultDataHolder is never updated
var currentPageApps = defaultDataHolder.currentPage(inItems: apps) var currentPageApps = defaultDataHolder.currentPage(inItems: apps)
guard let widgetInfo = context,
let widgetID = widgetInfo.ID else
{
return currentPageApps
}
let navEvent = getPageInfo(widgetID: widgetID) if let widgetInfo = context,
guard var navEvent = navEvent, let widgetID = widgetInfo.ID {
let direction = navEvent.direction else
{ var navEvent = getPageInfo(widgetID: widgetID)
// when widget is edited for new ID than the current, if let event = navEvent,
// buttons were never triggered for this ID, let direction = event.direction
// hence nav-event or direction wasn't set yet {
updatePageInfo( let dataHolder = event.dataHolder!
widgetID: widgetID, currentPageApps = dataHolder.currentPage(inItems: apps)
navEvent: NavigationEvent(direction: nil, consumed: true, dataHolder: PaginationDataHolder(other: defaultDataHolder))
) // process navigation request only if event wasn't consumed yet
return currentPageApps if !event.consumed {
} switch (direction){
case Direction.up:
let dataHolder = navEvent.dataHolder! currentPageApps = dataHolder.prevPage(inItems: apps, whenUnavailable: .current)!
case Direction.down:
// process navigation request only if event wasn't consumed yet currentPageApps = dataHolder.nextPage(inItems: apps, whenUnavailable: .current)!
if !navEvent.consumed { }
switch (direction){ // mark the event as consumed
case Direction.up: // this prevents duplicate getUpdatedData() requests for same navigation event
currentPageApps = dataHolder.prevPage(inItems: apps, whenUnavailable: .current)! navEvent!.consumed = true
case Direction.down: }
currentPageApps = dataHolder.nextPage(inItems: apps, whenUnavailable: .current)! }else{
// construct fresh/replace existing
navEvent = NavigationEvent(direction: nil, consumed: true, dataHolder: PaginationDataHolder(other: defaultDataHolder))
} }
// mark the event as consumed // put back the data
// this prevents duplicate getUpdatedData() requests for same navigation event updatePageInfo(widgetID: widgetID, navEvent: navEvent)
navEvent.consumed = true
}else{
// since the event was consumed, get the current page as-is for this dataholder
currentPageApps = dataHolder.currentPage(inItems: apps)
} }
// put back the data
updatePageInfo(widgetID: widgetID, navEvent: navEvent)
return currentPageApps return currentPageApps
} }

View File

@@ -77,7 +77,13 @@ public class PaginationDataHolder {
let count = UInt(items.count) let count = UInt(items.count)
if(count == 0) { return items } if(count == 0) { return items }
// since we operate on any input items list at any time,
// we set currentPageIndex as last availablePage if out of bounds
let availablePages = UInt(ceil(Double(count) / Double(itemsPerPage)))
self.currentPageindex = min(availablePages-1, currentPageindex)
let startIndex = currentPageindex * itemsPerPage let startIndex = currentPageindex * itemsPerPage
let estimatedEndIndex = startIndex + (itemsPerPage-1) let estimatedEndIndex = startIndex + (itemsPerPage-1)
let endIndex: UInt = min(count-1, estimatedEndIndex) let endIndex: UInt = min(count-1, estimatedEndIndex)