From c5d34c3dd4379c6f9e9f5e0b16c7f184904f9e9d Mon Sep 17 00:00:00 2001 From: Hristo Hristov Date: Wed, 2 Nov 2016 16:57:01 +0200 Subject: [PATCH] Image loading is done through native imageView so that once it is removed from window the bitmap is cleared. --- tests/.vscode/settings.json | 3 ++ tests/app/testRunner.ts | 32 ++++++++++++------- tests/app/ui/image/image-tests.ts | 4 +-- tns-core-modules/ui/image/image.android.ts | 11 ++++--- .../android/org.nativescript.widgets.d.ts | 12 ++++--- 5 files changed, 40 insertions(+), 22 deletions(-) create mode 100644 tests/.vscode/settings.json diff --git a/tests/.vscode/settings.json b/tests/.vscode/settings.json new file mode 100644 index 000000000..c7c1623bc --- /dev/null +++ b/tests/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "./node_modules/typescript/lib" +} \ No newline at end of file diff --git a/tests/app/testRunner.ts b/tests/app/testRunner.ts index 9a608ab66..771ce5fa7 100644 --- a/tests/app/testRunner.ts +++ b/tests/app/testRunner.ts @@ -1,8 +1,10 @@ /* tslint:disable */ -import * as TKUnit from"./TKUnit"; -import {messageType} from "trace"; -import {topmost, Frame} from "ui/frame"; -import {TextView} from "ui/text-view"; +import * as TKUnit from "./TKUnit"; +import { messageType } from "trace"; +import { topmost, Frame } from "ui/frame"; +import { TextView } from "ui/text-view"; +import { Button } from "ui/button"; +import { StackLayout } from "ui/layouts/stack-layout"; import * as platform from "platform"; import "./ui-test"; import fs = require("file-system"); @@ -132,14 +134,14 @@ function printRunTestStats() { var failedTestCount = 0; var failedTestInfo = []; - let allTests = testsQueue.filter(t=> t.isTest); + let allTests = testsQueue.filter(t => t.isTest); testFileContent.push(""); for (j = 0; j < allTests.length; j++) { let testName = allTests[j].testName; let duration = (allTests[j].duration / 1000).toFixed(2); - + if (!allTests[j].isPassed) { failedTestCount++; @@ -153,17 +155,17 @@ function printRunTestStats() { testCases.push(``); } } - + var totalTime = (TKUnit.time() - startTime).toFixed(2); - + testFileContent.push(``); testFileContent = testFileContent.concat(testCases); let finalMessage = `\n=== ALL TESTS COMPLETE ===\n` + - `${(allTests.length - failedTestCount)} OK, ${failedTestCount} failed\n` + + `${(allTests.length - failedTestCount)} OK, ${failedTestCount} failed\n` + `DURATION: ${totalTime} ms\n`; - TKUnit.write(finalMessage, messageType.info); + TKUnit.write(finalMessage, messageType.info); for (j = 0; j < failedTestInfo.length; j++) { let failureMessage = failedTestInfo[j]; @@ -183,9 +185,15 @@ function printRunTestStats() { finalMessage += "\n" + "Test results: " + testFilePath; + let stack = new StackLayout(); + let btn = new Button(); + btn.text = "Rerun tests"; + btn.on("tap", () => runAll(testsSelector)); + stack.addChild(btn); let messageContainer = new TextView(); messageContainer.text = finalMessage; - topmost().currentPage.content = messageContainer; + stack.addChild(messageContainer); + topmost().currentPage.content = stack; } function startLog(): void { @@ -200,7 +208,9 @@ function log(): void { TKUnit.write(testsName + " COMPLETED for " + duration + " BACKSTACK DEPTH: " + topmost().backStack.length, messageType.info); } +let testsSelector: string export var runAll = function (testSelector?: string) { + testsSelector = testSelector; if (running) { // TODO: We may schedule pending run requests return; diff --git a/tests/app/ui/image/image-tests.ts b/tests/app/ui/image/image-tests.ts index 68c1a3180..b0168bc1c 100644 --- a/tests/app/ui/image/image-tests.ts +++ b/tests/app/ui/image/image-tests.ts @@ -69,8 +69,8 @@ function runImageTest(done, image: ImageModule.Image, src: string) { try { let imageIsLoaded = isIOS ? !!image.imageSource : true; - TKUnit.assertTrue(!image.isLoading, "Image.isLoading should be false."); - TKUnit.assertTrue(!testModel.get("imageIsLoading"), "imageIsLoading on viewModel should be false."); + TKUnit.assertFalse(image.isLoading, "Image.isLoading should be false."); + TKUnit.assertFalse(testModel.get("imageIsLoading"), "imageIsLoading on viewModel should be false."); TKUnit.assertTrue(imageIsLoaded, "imageSource should be set."); if (done) { done(null); diff --git a/tns-core-modules/ui/image/image.android.ts b/tns-core-modules/ui/image/image.android.ts index 802abfb45..c0061a1e2 100644 --- a/tns-core-modules/ui/image/image.android.ts +++ b/tns-core-modules/ui/image/image.android.ts @@ -63,7 +63,7 @@ export function initImageCache(context: android.content.Context, mode = CacheMod currentCacheMode = mode; if (!imageFetcher) { - imageFetcher = new org.nativescript.widgets.image.Fetcher(context); + imageFetcher = org.nativescript.widgets.image.Fetcher.getInstance(context); } // Disable cache. @@ -73,7 +73,8 @@ export function initImageCache(context: android.content.Context, mode = CacheMod } } - let params = new org.nativescript.widgets.image.Cache.CacheParams(context, "_imageCache"); + let params = new org.nativescript.widgets.image.Cache.CacheParams(); + params.memoryCacheEnabled = mode !== CacheMode.none; params.setMemCacheSizePercent(memoryCacheSize); // Set memory cache to % of app memory params.diskCacheEnabled = mode === CacheMode.diskAndMemory; params.diskCacheSize = diskCacheSize; @@ -145,7 +146,7 @@ export class Image extends imageCommon.Image { } else if (imageSource.isFileOrResourcePath(value)) { if (value.indexOf(utils.RESOURCE_PREFIX) === 0) { - imageFetcher.loadImage(value, imageView, this.decodeWidth, this.decodeHeight, this.useCache, async, listener); + imageView.setUri(value, this.decodeWidth, this.decodeHeight, this.useCache, async, listener); } else { let fileName = value; @@ -153,12 +154,12 @@ export class Image extends imageCommon.Image { fileName = fs.path.join(fs.knownFolders.currentApp().path, fileName.replace("~/", "")); } - imageFetcher.loadImage(FILE_PREFIX + fileName, imageView, this.decodeWidth, this.decodeHeight, this.useCache, async, listener); + imageView.setUri(FILE_PREFIX + fileName, this.decodeWidth, this.decodeHeight, this.useCache, async, listener); } } else { // For backwards compatibility http always use async loading. - imageFetcher.loadImage(value, imageView, this.decodeWidth, this.decodeHeight, this.useCache, true, listener); + imageView.setUri(value, this.decodeWidth, this.decodeHeight, this.useCache, true, listener); } } else { super._createImageSourceFromSrc(); diff --git a/tns-platform-declarations/android/org.nativescript.widgets.d.ts b/tns-platform-declarations/android/org.nativescript.widgets.d.ts index 0ff9ed7e1..747f93f06 100644 --- a/tns-platform-declarations/android/org.nativescript.widgets.d.ts +++ b/tns-platform-declarations/android/org.nativescript.widgets.d.ts @@ -335,6 +335,9 @@ getRotationAngle(): number; setRotationAngle(angle: number): void; + + setUri(uri: string, decodeWidth: number, decodeHeight: number, useCache: boolean, + async: boolean, listener: image.Worker.IOnImageLoadedListener): void; } export class TabLayout extends android.widget.HorizontalScrollView { @@ -385,7 +388,8 @@ } export class Fetcher extends Worker { - constructor(context: android.content.Context); + private constructor(); + public static getInstance(context: android.content.Context): Fetcher; public addImageCache(cache: Cache): void; public initCache(): void; public clearCache(): void; @@ -396,10 +400,10 @@ export namespace Cache { export class CacheParams { - constructor(context: android.content.Context, diskCacheDirectoryName: string); - public setMemCacheSizePercent(percent: number): void; - public diskCacheEnabled: boolean; public diskCacheSize: number; + public diskCacheEnabled: boolean; + public memoryCacheEnabled: boolean; + public setMemCacheSizePercent(percent: number): void; } } }