UNPKG

nativescript-image-cache

Version:

Nativescript image caching plugin using Fresco for Android and SDWebImageCache for iOS

305 lines (304 loc) 12.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ns_image_cache_common_1 = require("./ns-image-cache-common"); exports.srcProperty = ns_image_cache_common_1.srcProperty; exports.isLoadingProperty = ns_image_cache_common_1.isLoadingProperty; var view_1 = require("ui/core/view"); var application = require("application"); var utils = require("utils/utils"); var appSettings = require("application-settings"); var types = require("utils/types"); var fs = require("file-system"); exports.isInitialized = false; var ScaleType; (function (ScaleType) { ScaleType.none = 'none'; ScaleType.aspectFill = 'aspectFill'; ScaleType.aspectFit = 'aspectFit'; ScaleType.fill = 'fill'; })(ScaleType = exports.ScaleType || (exports.ScaleType = {})); exports.stretchProperty = new view_1.Property({ name: 'stretch', defaultValue: ScaleType.none, valueConverter: function (v) { return v; }, affectsLayout: true }); exports.stretchProperty.register(ns_image_cache_common_1.NSImageBase); exports.radiusProperty = new view_1.Property({ name: 'radius', defaultValue: undefined, valueConverter: function (v) { return parseFloat(v); }, affectsLayout: true }); exports.radiusProperty.register(ns_image_cache_common_1.NSImageBase); exports.roundedProperty = new view_1.Property({ name: 'rounded', defaultValue: false, valueConverter: view_1.booleanConverter, affectsLayout: true }); exports.roundedProperty.register(ns_image_cache_common_1.NSImageBase); exports.placeholderProperty = new view_1.Property({ name: 'placeholder', defaultValue: undefined, valueConverter: function (v) { return v; }, affectsLayout: true }); exports.placeholderProperty.register(ns_image_cache_common_1.NSImageBase); exports.placeholderStretchProperty = new view_1.Property({ name: 'placeholderStretch', defaultValue: undefined, valueConverter: function (v) { return v; }, affectsLayout: true }); exports.placeholderStretchProperty.register(ns_image_cache_common_1.NSImageBase); var ProxyBaseControllerListener; function intializeProxyBaseControllerListener() { if (ProxyBaseControllerListener) { return; } ProxyBaseControllerListener = com.facebook.drawee.controller.BaseControllerListener.extend({ _MyNSCachedImage: undefined, setMyNSCachedImage: function (img) { this._MyNSCachedImage = img; }, onFinalImageSet: function (id, imageInfo, anim) { if (undefined != this._MyNSCachedImage) { this._MyNSCachedImage.isLoading = false; } }, onIntermediateImageSet: function (id, imageInfo) { }, onFailure: function (id, throwable) { console.log('onFailure', id, throwable); } }); } var NSImage = /** @class */ (function (_super) { __extends(NSImage, _super); function NSImage() { return _super.call(this) || this; } NSImage.prototype[ns_image_cache_common_1.srcProperty.getDefault] = function () { return undefined; }; NSImage.prototype[ns_image_cache_common_1.srcProperty.setNative] = function (value) { if (value) { setSource(this, value); } }; NSImage.prototype[exports.stretchProperty.getDefault] = function () { return ScaleType.none; }; NSImage.prototype[exports.stretchProperty.setNative] = function (value) { if (value) { this.setStretch(value); } }; NSImage.prototype[exports.radiusProperty.getDefault] = function () { return undefined; }; NSImage.prototype[exports.radiusProperty.setNative] = function (value) { if (value) { this.setRadius(value); } }; NSImage.prototype[exports.roundedProperty.getDefault] = function () { return undefined; }; NSImage.prototype[exports.roundedProperty.setNative] = function (value) { if (value) { this.setRounded(value); } }; NSImage.prototype[exports.placeholderProperty.getDefault] = function () { return undefined; }; NSImage.prototype[exports.placeholderProperty.setNative] = function (value) { if (value) { this.setPlaceholder(value, this.placeholderStretch); } }; NSImage.prototype[exports.placeholderStretchProperty.getDefault] = function () { return undefined; }; NSImage.prototype[exports.placeholderStretchProperty.setNative] = function (value) { if (value) { } }; NSImage.prototype.setRadius = function (radius) { var roundingParams = new com.facebook.drawee.generic.RoundingParams.fromCornersRadius(0); roundingParams.setCornersRadius(radius); this.nativeView.getHierarchy().setRoundingParams(roundingParams); }; NSImage.prototype.setRounded = function (rounded) { var roundingParams = new com.facebook.drawee.generic.RoundingParams.fromCornersRadius(0); if (rounded) { roundingParams.setRoundAsCircle(true); } else { roundingParams.setRoundAsCircle(false); } this.nativeView.getHierarchy().setRoundingParams(roundingParams); }; NSImage.prototype.setPlaceholder = function (src, stretch) { var drawable = getPlaceholderImageDrawable(src); var scaleType = getScaleType(stretch) || getScaleType(ScaleType.none); if (drawable === null) { return; } this.nativeView.getHierarchy().setPlaceholderImage(drawable, scaleType); }; NSImage.prototype.setStretch = function (stretch) { var scaleType = getScaleType(stretch) || getScaleType(ScaleType.none); this.nativeView.getHierarchy().setActualImageScaleType(scaleType); }; NSImage.prototype.createNativeView = function () { this.nativeView = new com.facebook.drawee.view.SimpleDraweeView(this._context); if (this.src !== undefined) { setSource(this, this.src); } if (this.stretch !== undefined) { this.setStretch(this.stretch); } if (this.rounded !== undefined) { this.setRounded(this.rounded); } if (this.radius !== undefined) { this.setRadius(this.radius); } if (this.placeholder !== undefined) { this.setPlaceholder(this.placeholder, this.placeholderStretch); } return this.nativeView; }; return NSImage; }(ns_image_cache_common_1.NSImageBase)); exports.NSImage = NSImage; var setSource = function (image, value) { if (types.isString(value)) { value = value.trim(); if (utils.isFileOrResourcePath(value) || value.indexOf('http') === 0) { image.isLoading = true; var fileName = ''; if (value.indexOf('~/') === 0) { fileName = fs.path.join(fs.knownFolders.currentApp().path, value.replace('~/', '')); fileName = 'file:' + fileName; } else if (value.indexOf('/') === 0) { fileName = 'file:' + value; } else if (value.indexOf('res') === 0) { fileName = value; var res = utils.ad.getApplicationContext().getResources(); var resName = fileName.substr(utils.RESOURCE_PREFIX.length); var identifier = res.getIdentifier(resName, 'drawable', utils.ad.getApplication().getPackageName()); fileName = 'res:/' + identifier; } else if (value.indexOf('http') === 0) { image.isLoading = true; fileName = value; } var request = void 0; var startRequest = com.facebook.imagepipeline.request.ImageRequestBuilder.newBuilderWithSource(android.net.Uri.parse(fileName)); if (fileName.indexOf('.png') < 0) { request = startRequest.setProgressiveRenderingEnabled(true).build(); } else { request = startRequest.build(); } intializeProxyBaseControllerListener(); var controllerListener = new ProxyBaseControllerListener(); controllerListener.setMyNSCachedImage(image); var controller = com.facebook.drawee.backends.pipeline.Fresco .newDraweeControllerBuilder() .setImageRequest(request) .setControllerListener(controllerListener) .setOldController(image.android.getController()) .setTapToRetryEnabled(true) .build(); image.android.setController(controller); image.requestLayout(); } else { throw new Error('Path "' + '" is not a valid file or resource.'); } } }; var getScaleType = function (scaleType) { if (types.isString(scaleType)) { switch (scaleType) { case ScaleType.none: return com.facebook.drawee.drawable.ScalingUtils.ScaleType.CENTER; case ScaleType.aspectFill: return com.facebook.drawee.drawable.ScalingUtils.ScaleType.CENTER_CROP; case ScaleType.aspectFit: return com.facebook.drawee.drawable.ScalingUtils.ScaleType.FIT_CENTER; case ScaleType.fill: return com.facebook.drawee.drawable.ScalingUtils.ScaleType.FIT_XY; default: break; } } }; var getPlaceholderImageDrawable = function (value) { var fileName = ''; var drawable = null; if (types.isString(value)) { value = value.trim(); if (utils.isFileOrResourcePath(value)) { if (value.indexOf('~/') === 0) { fileName = fs.path.join(fs.knownFolders.currentApp().path, value.replace('~/', '')); drawable = android.graphics.drawable.Drawable.createFromPath(fileName); } else if (value.indexOf('/') === 0) { fileName = 'file:' + value; drawable = android.graphics.drawable.Drawable.createFromPath(fileName); } else if (value.indexOf('res') === 0) { fileName = value; var res = utils.ad.getApplicationContext().getResources(); var resName = fileName.substr(utils.RESOURCE_PREFIX.length); var identifier = res.getIdentifier(resName, 'drawable', utils.ad.getApplication().getPackageName()); drawable = res.getDrawable(identifier); } } } return drawable; }; exports.setCacheLimit = function (numberOfDays) { var noOfSecondsInAMinute = 60, noOfMinutesInAHour = 60, noOfHoursInADay = 24, noOfSecondsADay = noOfSecondsInAMinute * noOfMinutesInAHour * noOfHoursInADay, noOfSecondsInDays = noOfSecondsADay * numberOfDays, currentSeconds = Math.round(new Date().getTime() / 1000); var referenceTime = 0; if (appSettings.getBoolean('isAppOpenedFirstTime') === true || appSettings.getBoolean('isAppOpenedFirstTime') === undefined || appSettings.getBoolean('isAppOpenedFirstTime') === null) { appSettings.setBoolean('isAppOpenedFirstTime', false); com.facebook.drawee.backends.pipeline.Fresco.getImagePipeline().clearCaches(); appSettings.setNumber('cacheTimeReference', currentSeconds); } else { referenceTime = appSettings.getNumber('cacheTimeReference'); if (referenceTime === null || referenceTime === undefined) { appSettings.setNumber('cacheTimeReference', currentSeconds); } else if (currentSeconds - referenceTime > noOfSecondsInDays) { exports.clearCache(); appSettings.setNumber('cacheTimeReference', currentSeconds); } } }; exports.initialize = function () { com.facebook.drawee.backends.pipeline.Fresco.initialize(application.android.context); }; exports.clearCache = function () { com.facebook.drawee.backends.pipeline.Fresco.getImagePipeline().clearCaches(); }; exports.initializeOnAngular = function () { if (exports.isInitialized === false) { var _elementRegistry = require('nativescript-angular/element-registry'); _elementRegistry.registerElement('NSImage', function () { return require('nativescript-image-cache').NSImage; }); exports.initialize(); exports.isInitialized = true; } };