Skip to content

Commit 1da973d

Browse files
author
Alexander Vakrilov
committed
Merge pull request NativeScript#134 from NativeScript/feature/cuteness-tab-fix
Fix tabs when pageCache is enabled
2 parents 5294b9b + 5588250 commit 1da973d

File tree

2 files changed

+74
-42
lines changed

2 files changed

+74
-42
lines changed

apps/tests/ui/tab-view/tab-view-tests.ts

Lines changed: 69 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -408,62 +408,89 @@ export function testBindingIsRefreshedWhenTabViewItemIsUnselectedAndThenSelected
408408
});
409409
}
410410

411-
export function testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBack() {
411+
export function testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBack_NoPageCaching() {
412+
testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBackg(false);
413+
}
414+
export function testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBack_WithPageCaching() {
415+
testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBackg(true);
416+
}
417+
418+
function testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBackg(enablePageCache: boolean) {
412419
var i: number;
413420
var itemCount = 3;
414421
var loadedItems = [0, 0, 0];
415422
var unloadedItems = [0, 0, 0];
416423

417-
var tabView = _createTabView();
418-
var items = _createItems(itemCount);
419-
tabView.items = items;
424+
var topFrame = frameModule.topmost();
425+
var oldChache;
420426

421-
function createLoadedFor(itemIndex: number) {
422-
return function () {
423-
loadedItems[itemIndex] = loadedItems[itemIndex] + 1;
424-
}
427+
if (topFrame.android) {
428+
oldChache = topFrame.android.cachePagesOnNavigate;
429+
topFrame.android.cachePagesOnNavigate = enablePageCache;
425430
}
426431

427-
function createUnloadedFor(itemIndex: number) {
428-
return function () {
429-
unloadedItems[itemIndex] = unloadedItems[itemIndex] + 1;
432+
try {
433+
var tabView = _createTabView();
434+
var items = _createItems(itemCount);
435+
tabView.items = items;
436+
437+
function createLoadedFor(itemIndex: number) {
438+
return function () {
439+
loadedItems[itemIndex] = loadedItems[itemIndex] + 1;
440+
}
430441
}
431-
}
432442

433-
helper.buildUIAndRunTest(tabView, function () {
434-
try {
435-
// Attach to loaded/unloaded events
436-
for (i = 0; i < itemCount; i++) {
437-
items[i].view.on("loaded", createLoadedFor(i));
438-
items[i].view.on("unloaded", createUnloadedFor(i));
443+
function createUnloadedFor(itemIndex: number) {
444+
return function () {
445+
unloadedItems[itemIndex] = unloadedItems[itemIndex] + 1;
439446
}
447+
}
440448

441-
var detailsPageFactory = function (): pageModule.Page {
442-
var detailsPage = new pageModule.Page();
443-
detailsPage.content = new labelModule.Label();
444-
return detailsPage;
445-
};
449+
helper.buildUIAndRunTest(tabView, function () {
450+
try {
451+
TKUnit.waitUntilReady(() => { return items[0].view.isLoaded; }, ASYNC);
446452

447-
helper.navigate(detailsPageFactory);
448-
}
449-
finally {
450-
// Go back to the test page.
451-
helper.goBack();
452-
}
453-
454-
//console.log("loaded items: " + loadedItems.join(", "));
455-
//console.log("unloadedItems items: " + unloadedItems.join(", "));
456-
457-
// Check that at least the first item is loaded and unloaded
458-
TKUnit.assertEqual(loadedItems[0], 1, "loaded count for 1st item");
459-
TKUnit.assertEqual(unloadedItems[0], 1, "unloaded count for 1st item");
460-
461-
// Check that loaded/unloaded coutns are equal for all tabs
462-
for (i = 0; i < itemCount; i++) {
463-
TKUnit.assert(loadedItems[i] === unloadedItems[i],
464-
"Loaded and unloaded calls are not equal for item " + i + " loaded: " + loadedItems[i] + " unloaded: " + unloadedItems[i]);
453+
// Attach to loaded/unloaded events
454+
for (i = 0; i < itemCount; i++) {
455+
items[i].view.on("loaded", createLoadedFor(i));
456+
items[i].view.on("unloaded", createUnloadedFor(i));
457+
}
458+
459+
var detailsPageFactory = function (): pageModule.Page {
460+
var detailsPage = new pageModule.Page();
461+
detailsPage.content = new labelModule.Label();
462+
return detailsPage;
463+
};
464+
465+
helper.navigate(detailsPageFactory);
466+
}
467+
finally {
468+
// Go back to the test page.
469+
helper.goBack();
470+
}
471+
TKUnit.waitUntilReady(() => { return items[0].view.isLoaded; }, ASYNC);
472+
473+
//console.log("loaded items: " + loadedItems.join(", "));
474+
//console.log("unloadedItems items: " + unloadedItems.join(", "));
475+
476+
// Check that at least the first item is loaded and unloaded
477+
TKUnit.assert(items[0].view.isLoaded, "Thecontent of the first tab should be loaded.");
478+
TKUnit.assertEqual(loadedItems[0], 1, "loaded count for 1st item");
479+
TKUnit.assertEqual(unloadedItems[0], 1, "unloaded count for 1st item");
480+
481+
// Check that loaded/unloaded coutns are equal for all tabs
482+
for (i = 0; i < itemCount; i++) {
483+
TKUnit.assert(loadedItems[i] === unloadedItems[i],
484+
"Loaded and unloaded calls are not equal for item " + i + " loaded: " + loadedItems[i] + " unloaded: " + unloadedItems[i]);
485+
}
486+
});
487+
}
488+
finally {
489+
// Return original page cache value
490+
if (topFrame.android) {
491+
topFrame.android.cachePagesOnNavigate = oldChache;
465492
}
466-
});
493+
}
467494
}
468495

469496
function _clickTheFirstButtonInTheListViewNatively(tabView: tabViewModule.TabView) {

ui/tab-view/tab-view.android.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,11 @@ export class TabView extends common.TabView {
273273

274274
// If we are loading a TabView inside a hidden fragment this check will prevent it from polluting the action bar.
275275
if (this.android && this.android.isShown()) {
276+
// Cover the case when pageCacheOnNavigate is enabled - set adapter in loaded as the TabView is already
277+
// attached and _onItemsPropertyChangedSetNativeValue will not be called
278+
if (!this._pagerAdapter && this.items) {
279+
this._setAdapter(this.items);
280+
}
276281
this._addTabsIfNeeded();
277282
this._setNativeSelectedIndex(this.selectedIndex);
278283
}

0 commit comments

Comments
 (0)