diff --git a/tests/app/TKUnit.ts b/tests/app/TKUnit.ts index 877abc358..418cefc11 100644 --- a/tests/app/TKUnit.ts +++ b/tests/app/TKUnit.ts @@ -15,6 +15,9 @@ import timer = require("timer"); import trace = require("trace"); import types = require("utils/types"); import platform = require("platform"); + +import * as utils from "utils/utils"; + var sdkVersion = parseInt(platform.device.sdkVersion); trace.enable(); @@ -377,7 +380,8 @@ export var waitUntilReady = function (isReady: () => boolean, timeoutSec?: numbe var waitTime = 20 / 1000; var totalWaitTime = 0; while (true) { - NSRunLoop.currentRunLoop().runUntilDate(NSDate.dateWithTimeIntervalSinceNow(waitTime)); + utils.ios.getter(NSRunLoop, NSRunLoop.currentRunLoop).runUntilDate(NSDate.dateWithTimeIntervalSinceNow(waitTime)); + if (isReady()) { break; } diff --git a/tests/app/application-tests.ios.ts b/tests/app/application-tests.ios.ts index f8c314934..bce3bd5d4 100644 --- a/tests/app/application-tests.ios.ts +++ b/tests/app/application-tests.ios.ts @@ -3,6 +3,9 @@ import app = require("application"); import TKUnit = require("./TKUnit"); import commonTests = require("./application-tests-common"); +import * as utils from "utils/utils"; +import getter = utils.ios.getter; + global.moduleMerge(commonTests, exports); // >> application-ios-observer @@ -10,7 +13,7 @@ global.moduleMerge(commonTests, exports); if (app.ios) { var observer = app.ios.addNotificationObserver(UIDeviceBatteryLevelDidChangeNotification, function onReceiveCallback(notification: NSNotification) { - var percent = UIDevice.currentDevice().batteryLevel * 100; + var percent = getter(UIDevice, UIDevice.currentDevice).batteryLevel * 100; var message = "Battery: " + percent + "%"; ////console.log(message); }); diff --git a/tests/app/pages/page5.ts b/tests/app/pages/page5.ts index b899c4be0..30099e38e 100644 --- a/tests/app/pages/page5.ts +++ b/tests/app/pages/page5.ts @@ -4,6 +4,8 @@ import buttons = require("ui/button"); import app = require("application"); import platform = require("platform"); +import * as utils from "utils/utils"; + function printDeviceInfoAndroid() { console.log("android.os.Build.DEVICE = " + android.os.Build.DEVICE); //android.os.Build.DEVICE = hammerhead console.log("android.os.Build.VERSION.SDK = " + android.os.Build.VERSION.SDK); //android.os.Build.VERSION.SDK = 19 @@ -27,7 +29,7 @@ function printDeviceInfoAndroid() { } function printDeviceInfoIOS() { - var device = UIDevice.currentDevice(); + var device = utils.ios.getter(UIDevice, UIDevice.currentDevice); console.log("device.name = " + device.name); //device.name = iPhone Simulator console.log("device.systemName = " + device.systemName); //device.systemName = iPhone OS console.log("device.systemVersion = " + device.systemVersion); //device.systemVersion = 8.1 @@ -35,7 +37,7 @@ function printDeviceInfoIOS() { console.log("device.localizedModel = " + device.localizedModel); //device.localizedModel = iPhone Simulator console.log("device.userInterfaceIdiom = " + device.userInterfaceIdiom); //device.userInterfaceIdiom = 0 console.log("device.batteryLevel = " + device.batteryLevel); //device.batteryLevel = -1 - var screen = UIScreen.mainScreen(); + var screen = utils.ios.getter(UIScreen, UIScreen.mainScreen); console.log("screen = " + screen); console.log("screen.nativeBounds = " + screen.nativeBounds.size.width + ", " + screen.nativeBounds.size.height); //screen.nativeBounds = 640, 1136 console.log("screen.scale = " + screen.scale); //screen.scale = 2 diff --git a/tests/app/testRunner.ts b/tests/app/testRunner.ts index 2fa615c8a..65e111fcd 100644 --- a/tests/app/testRunner.ts +++ b/tests/app/testRunner.ts @@ -112,7 +112,9 @@ var testsWithLongDelay = { testLoadExistingUrl: 10000 * 5, testLoadLocalFile: 10000 * 5, testLoadInvalidUrl: 10000, - testLoadUpperCaseSrc: 10000 * 5 + testLoadUpperCaseSrc: 10000 * 5, + test_SettingImageSrc: 30 * 1000, + test_ChainingAnimations: 30 * 1000 } var startTime; diff --git a/tests/app/ui/date-picker/date-picker-tests-native.ios.ts b/tests/app/ui/date-picker/date-picker-tests-native.ios.ts index 76ac1c97e..709bdd344 100644 --- a/tests/app/ui/date-picker/date-picker-tests-native.ios.ts +++ b/tests/app/ui/date-picker/date-picker-tests-native.ios.ts @@ -1,15 +1,17 @@ import datePickerModule = require("ui/date-picker"); +import * as utils from "utils/utils"; + export function getNativeYear(datePicker: datePickerModule.DatePicker): number { - return NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, datePicker.ios.date).year; + return utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, datePicker.ios.date).year; } export function getNativeMonth(datePicker: datePickerModule.DatePicker): number { - return NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, datePicker.ios.date).month; + return utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, datePicker.ios.date).month; } export function getNativeDay(datePicker: datePickerModule.DatePicker): number { - return NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, datePicker.ios.date).day; + return utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, datePicker.ios.date).day; } export function getNativeMaxDate(datePicker: datePickerModule.DatePicker): Date { @@ -21,31 +23,31 @@ export function getNativeMinDate(datePicker: datePickerModule.DatePicker): Date } export function setNativeYear(datePicker: datePickerModule.DatePicker, value: number): void { - var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, datePicker.ios.date); + var comps = utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, datePicker.ios.date); comps.year = value; - datePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false); + datePicker.ios.setDateAnimated(utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).dateFromComponents(comps), false); (datePicker)._changeHandler.valueChanged(datePicker.ios); } export function setNativeMonth(datePicker: datePickerModule.DatePicker, value: number): void { - var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, datePicker.ios.date); + var comps = utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, datePicker.ios.date); comps.month = value; - datePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false); + datePicker.ios.setDateAnimated(utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).dateFromComponents(comps), false); (datePicker)._changeHandler.valueChanged(datePicker.ios); } export function setNativeDay(datePicker: datePickerModule.DatePicker, value: number): void { - var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, datePicker.ios.date); + var comps = utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, datePicker.ios.date); comps.day = value; - datePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false); + datePicker.ios.setDateAnimated(utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).dateFromComponents(comps), false); (datePicker)._changeHandler.valueChanged(datePicker.ios); } export function setNativeDate(datePicker: datePickerModule.DatePicker, year: number, month: number, day: number): void { - var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, datePicker.ios.date); + var comps = utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, datePicker.ios.date); comps.year = year; comps.month = month; comps.day = day; - datePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false); + datePicker.ios.setDateAnimated(utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).dateFromComponents(comps), false); (datePicker)._changeHandler.valueChanged(datePicker.ios); -} \ No newline at end of file +} diff --git a/tests/app/ui/time-picker/time-picker-tests-native.ios.ts b/tests/app/ui/time-picker/time-picker-tests-native.ios.ts index 37a5c9805..cd524f2ec 100644 --- a/tests/app/ui/time-picker/time-picker-tests-native.ios.ts +++ b/tests/app/ui/time-picker/time-picker-tests-native.ios.ts @@ -1,32 +1,34 @@ import timePickerModule = require("ui/time-picker"); +import * as utils from "utils/utils"; + export function getNativeHour(timePicker: timePickerModule.TimePicker): number { - return NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute, timePicker.ios.date).hour; + return utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute, timePicker.ios.date).hour; } export function getNativeMinute(timePicker: timePickerModule.TimePicker): number { - return NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute, timePicker.ios.date).minute; + return utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute, timePicker.ios.date).minute; } export function setNativeHour(timePicker: timePickerModule.TimePicker, value: number): void { - var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute, timePicker.ios.date); + var comps = utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute, timePicker.ios.date); comps.hour = value; - timePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false); + timePicker.ios.setDateAnimated(utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).dateFromComponents(comps), false); (timePicker)._changeHandler.valueChanged(timePicker.ios); } export function setNativeMinute(timePicker: timePickerModule.TimePicker, value: number): void { - var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute, timePicker.ios.date); + var comps = utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute, timePicker.ios.date); comps.minute = value; - timePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false); + timePicker.ios.setDateAnimated(utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).dateFromComponents(comps), false); (timePicker)._changeHandler.valueChanged(timePicker.ios); } export function setNativeTime(timePicker: timePickerModule.TimePicker, hour: number, minute: number): void { - var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute, timePicker.ios.date); + var comps = utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute, timePicker.ios.date); comps.hour = hour; comps.minute = minute; - timePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false); + timePicker.ios.setDateAnimated(utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).dateFromComponents(comps), false); (timePicker)._changeHandler.valueChanged(timePicker.ios); } \ No newline at end of file diff --git a/tests/app/ui/view/view-tests.ios.ts b/tests/app/ui/view/view-tests.ios.ts index 1bad900e9..5d1545191 100644 --- a/tests/app/ui/view/view-tests.ios.ts +++ b/tests/app/ui/view/view-tests.ios.ts @@ -24,7 +24,7 @@ export function checkNativeBackgroundColor(v: view.View): boolean { if (v.ios instanceof UILabel) { var cgColor1 = (v.ios).layer.backgroundColor; var cgColor2 = (v.backgroundColor.ios).CGColor; - return v.backgroundColor && CGColorEqualToColor(cgColor1, cgColor2); + return v.backgroundColor && !!CGColorEqualToColor(cgColor1, cgColor2); } return v.backgroundColor && (v.ios).backgroundColor.isEqual(v.backgroundColor.ios); diff --git a/tns-core-modules/application-settings/application-settings.ios.ts b/tns-core-modules/application-settings/application-settings.ios.ts index 182bf980e..1566ddbb0 100644 --- a/tns-core-modules/application-settings/application-settings.ios.ts +++ b/tns-core-modules/application-settings/application-settings.ios.ts @@ -1,13 +1,15 @@ import Common = require("./application-settings-common"); -var userDefaults = NSUserDefaults.standardUserDefaults(); +import * as utils from "utils/utils"; + +var userDefaults = utils.ios.getter(NSUserDefaults, NSUserDefaults.standardUserDefaults); export var hasKey = function (key: string): boolean { Common.checkKey(key); return userDefaults.objectForKey(key) !== null; } -// getters +// utils.ios.getters export var getBoolean = function (key: string, defaultValue?: boolean): boolean { Common.checkKey(key); if (hasKey(key)) { @@ -61,5 +63,5 @@ export var remove = function (key: string): void { } export var clear = function (): void { - userDefaults.removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier); + userDefaults.removePersistentDomainForName(utils.ios.getter(NSBundle, NSBundle.mainBundle).bundleIdentifier); } diff --git a/tns-core-modules/application/application.ios.ts b/tns-core-modules/application/application.ios.ts index 443107b5b..be73a178e 100644 --- a/tns-core-modules/application/application.ios.ts +++ b/tns-core-modules/application/application.ios.ts @@ -5,6 +5,8 @@ import * as uiUtils from "ui/utils"; import * as typesModule from "utils/types"; import * as enumsModule from "ui/enums"; +import * as utils from "utils/utils"; + global.moduleMerge(common, exports); var typedExports: typeof definition = exports; @@ -32,7 +34,7 @@ class Window extends UIWindow { } public layoutSubviews(): void { - uiUtils.ios._layoutRootView(this._content, UIScreen.mainScreen().bounds); + uiUtils.ios._layoutRootView(this._content, utils.ios.getter(UIScreen, UIScreen.mainScreen).bounds); } } @@ -61,7 +63,7 @@ class IOSApplication implements definition.iOSApplication { public rootController: any; private _delegate: typeof UIApplicationDelegate; - private _currentOrientation = UIDevice.currentDevice().orientation; + private _currentOrientation = utils.ios.getter(UIDevice, UIDevice.currentDevice).orientation; private _window: Window; private _observers: Array; @@ -76,7 +78,7 @@ class IOSApplication implements definition.iOSApplication { } get nativeApp(): UIApplication { - return UIApplication.sharedApplication(); + return utils.ios.getter(UIApplication, UIApplication.sharedApplication); } get delegate(): typeof UIApplicationDelegate { @@ -90,7 +92,7 @@ class IOSApplication implements definition.iOSApplication { public addNotificationObserver(notificationName: string, onReceiveCallback: (notification: NSNotification) => void): NotificationObserver { var observer = NotificationObserver.new().initWithCallback(onReceiveCallback); - NSNotificationCenter.defaultCenter().addObserverSelectorNameObject(observer, "onReceive", notificationName, null); + utils.ios.getter(NSNotificationCenter, NSNotificationCenter.defaultCenter).addObserverSelectorNameObject(observer, "onReceive", notificationName, null); this._observers.push(observer); return observer; } @@ -99,13 +101,13 @@ class IOSApplication implements definition.iOSApplication { var index = this._observers.indexOf(observer); if (index >= 0) { this._observers.splice(index, 1); - NSNotificationCenter.defaultCenter().removeObserverNameObject(observer, notificationName, null); + utils.ios.getter(NSNotificationCenter, NSNotificationCenter.defaultCenter).removeObserverNameObject(observer, notificationName, null); } } private didFinishLaunchingWithOptions(notification: NSNotification) { - this._window = Window.alloc().initWithFrame(UIScreen.mainScreen().bounds); - this._window.backgroundColor = UIColor.whiteColor(); + this._window = Window.alloc().initWithFrame(utils.ios.getter(UIScreen, UIScreen.mainScreen).bounds); + this._window.backgroundColor = utils.ios.getter(UIColor, UIColor.whiteColor); if (typedExports.onLaunch) { typedExports.onLaunch(undefined); @@ -165,7 +167,7 @@ class IOSApplication implements definition.iOSApplication { typedExports.onResume(); } - typedExports.notify({ eventName: typedExports.resumeEvent, object: this, ios: UIApplication.sharedApplication() }); + typedExports.notify({ eventName: typedExports.resumeEvent, object: this, ios: utils.ios.getter(UIApplication, UIApplication.sharedApplication) }); } private didEnterBackground(notification: NSNotification) { @@ -173,7 +175,7 @@ class IOSApplication implements definition.iOSApplication { typedExports.onSuspend(); } - typedExports.notify({ eventName: typedExports.suspendEvent, object: this, ios: UIApplication.sharedApplication() }); + typedExports.notify({ eventName: typedExports.suspendEvent, object: this, ios: utils.ios.getter(UIApplication, UIApplication.sharedApplication) }); } private willTerminate(notification: NSNotification) { @@ -181,7 +183,7 @@ class IOSApplication implements definition.iOSApplication { typedExports.onExit(); } - typedExports.notify({ eventName: typedExports.exitEvent, object: this, ios: UIApplication.sharedApplication() }); + typedExports.notify({ eventName: typedExports.exitEvent, object: this, ios: utils.ios.getter(UIApplication, UIApplication.sharedApplication) }); } private didReceiveMemoryWarning(notification: NSNotification) { @@ -189,11 +191,11 @@ class IOSApplication implements definition.iOSApplication { typedExports.onLowMemory(); } - typedExports.notify({ eventName: typedExports.lowMemoryEvent, object: this, android: undefined, ios: UIApplication.sharedApplication() }); + typedExports.notify({ eventName: typedExports.lowMemoryEvent, object: this, android: undefined, ios: utils.ios.getter(UIApplication, UIApplication.sharedApplication) }); } private orientationDidChange(notification: NSNotification) { - var orientation = UIDevice.currentDevice().orientation; + var orientation = utils.ios.getter(UIDevice, UIDevice.currentDevice).orientation; if (this._currentOrientation !== orientation) { this._currentOrientation = orientation; diff --git a/tns-core-modules/debugger/webinspector.ios.ts b/tns-core-modules/debugger/webinspector.ios.ts index f05420fd9..a57af77f8 100644 --- a/tns-core-modules/debugger/webinspector.ios.ts +++ b/tns-core-modules/debugger/webinspector.ios.ts @@ -3,6 +3,8 @@ var inspectorCommands: typeof inspectorCommandTypes = require("./InspectorBacken import * as debuggerDomains from "./debugger"; +import * as utils from "utils/utils"; + declare var __inspectorTimestamp; const frameId = "NativeScriptMainFrameIdentifier"; @@ -212,9 +214,9 @@ export class NetworkDomainDebugger implements inspectorCommandTypes.NetworkDomai * Loads a resource in the context of a frame on the inspected page without cross origin checks. */ loadResource(params: inspectorCommandTypes.NetworkDomain.LoadResourceMethodArguments): { content: string, mimeType: string, status: number } { - let appPath = NSBundle.mainBundle().bundlePath; + let appPath = utils.ios.getter(NSBundle, NSBundle.mainBundle).bundlePath; let pathUrl = params.url.replace("file://", appPath); - let fileManager = NSFileManager.defaultManager(); + let fileManager = utils.ios.getter(NSFileManager, NSFileManager.defaultManager); let data = fileManager.fileExistsAtPath(pathUrl) ? fileManager.contentsAtPath(pathUrl) : undefined; let content = data ? NSString.alloc().initWithDataEncoding(data, NSUTF8StringEncoding) : ""; diff --git a/tns-core-modules/file-system/file-system-access.ios.ts b/tns-core-modules/file-system/file-system-access.ios.ts index f4f6cce63..e6a07e7bc 100644 --- a/tns-core-modules/file-system/file-system-access.ios.ts +++ b/tns-core-modules/file-system/file-system-access.ios.ts @@ -1,12 +1,14 @@ import textModule = require("text"); import * as utilsModule from "utils/utils"; +import * as utils from "utils/utils"; + // TODO: Implement all the APIs receiving callback using async blocks // TODO: Check whether we need try/catch blocks for the iOS implementation export class FileSystemAccess { public getLastModified(path: string): Date { - var fileManager = NSFileManager.defaultManager(); + var fileManager = utils.ios.getter(NSFileManager, NSFileManager.defaultManager); var attributes = fileManager.attributesOfItemAtPathError(path); if (attributes) { @@ -18,7 +20,7 @@ export class FileSystemAccess { public getParent(path: string, onError?: (error: any) => any): { path: string; name: string } { try { - var fileManager = NSFileManager.defaultManager(); + var fileManager = utils.ios.getter(NSFileManager, NSFileManager.defaultManager); var nsString = NSString.stringWithString(path); var parentPath = nsString.stringByDeletingLastPathComponent; @@ -40,7 +42,7 @@ export class FileSystemAccess { public getFile(path: string, onError?: (error: any) => any): { path: string; name: string; extension: string } { try { - var fileManager = NSFileManager.defaultManager(); + var fileManager = utils.ios.getter(NSFileManager, NSFileManager.defaultManager); var exists = fileManager.fileExistsAtPath(path); if (!exists) { @@ -73,7 +75,7 @@ export class FileSystemAccess { public getFolder(path: string, onError?: (error: any) => any): { path: string; name: string } { try { - var fileManager = NSFileManager.defaultManager(); + var fileManager = utils.ios.getter(NSFileManager, NSFileManager.defaultManager); var exists = this.folderExists(path); if (!exists) { @@ -150,7 +152,7 @@ export class FileSystemAccess { } private exists(path: string): { exists: boolean, isDirectory: boolean } { - var fileManager = NSFileManager.defaultManager(); + var fileManager = utils.ios.getter(NSFileManager, NSFileManager.defaultManager); var isDirectory = new interop.Reference(interop.types.bool, false); var exists = fileManager.fileExistsAtPathIsDirectory(path, isDirectory); @@ -176,7 +178,7 @@ export class FileSystemAccess { } public emptyFolder(path: string, onError?: (error: any) => any) { - var fileManager = NSFileManager.defaultManager(); + var fileManager = utils.ios.getter(NSFileManager, NSFileManager.defaultManager); var entities = this.getEntities(path, onError); if (!entities) { @@ -199,7 +201,7 @@ export class FileSystemAccess { } public rename(path: string, newPath: string, onError?: (error: any) => any) { - var fileManager = NSFileManager.defaultManager(); + var fileManager = utils.ios.getter(NSFileManager, NSFileManager.defaultManager); try { fileManager.moveItemAtPathToPathError(path, newPath); @@ -212,7 +214,7 @@ export class FileSystemAccess { } public getLogicalRootPath(): string { - let mainBundlePath = NSBundle.mainBundle().bundlePath; + let mainBundlePath = utils.ios.getter(NSBundle, NSBundle.mainBundle).bundlePath; let resolvedPath = NSString.stringWithString(mainBundlePath).stringByResolvingSymlinksInPath; return resolvedPath; } @@ -298,7 +300,7 @@ export class FileSystemAccess { } private getKnownPath(folderType: number): string { - var fileManager = NSFileManager.defaultManager(); + var fileManager = utils.ios.getter(NSFileManager, NSFileManager.defaultManager); var paths = fileManager.URLsForDirectoryInDomains(folderType, NSSearchPathDomainMask.UserDomainMask); var url = paths.objectAtIndex(0); @@ -326,7 +328,7 @@ export class FileSystemAccess { } private deleteEntity(path: string, onError?: (error: any) => any) { - var fileManager = NSFileManager.defaultManager(); + var fileManager = utils.ios.getter(NSFileManager, NSFileManager.defaultManager); try { fileManager.removeItemAtPathError(path); } @@ -339,7 +341,7 @@ export class FileSystemAccess { private enumEntities(path: string, callback: (entity: { path: string; name: string; extension: string }) => boolean, onError?: (error) => any) { try { - var fileManager = NSFileManager.defaultManager(); + var fileManager = utils.ios.getter(NSFileManager, NSFileManager.defaultManager); try { var files = fileManager.contentsOfDirectoryAtPathError(path); } diff --git a/tns-core-modules/fps-meter/fps-native.ios.ts b/tns-core-modules/fps-meter/fps-native.ios.ts index 23150384a..ca91c4ced 100644 --- a/tns-core-modules/fps-meter/fps-native.ios.ts +++ b/tns-core-modules/fps-meter/fps-native.ios.ts @@ -1,5 +1,7 @@ import definition = require("fps-meter/fps-native"); +import * as utils from "utils/utils"; + class FrameHandlerImpl extends NSObject { private _owner: WeakRef; @@ -35,10 +37,10 @@ export class FPSCallback implements definition.FPSCallback { this.displayLink = CADisplayLink.displayLinkWithTargetSelector(this.impl, "handleFrame"); this.displayLink.paused = true; - this.displayLink.addToRunLoopForMode(NSRunLoop.currentRunLoop(), NSDefaultRunLoopMode); + this.displayLink.addToRunLoopForMode(utils.ios.getter(NSRunLoop, NSRunLoop.currentRunLoop), NSDefaultRunLoopMode); // UIScrollView (including in UIITableView) will run a loop in UITrackingRunLoopMode during scrolling. // If we do not add the CADisplayLink in this mode, it would appear paused during scrolling. - this.displayLink.addToRunLoopForMode(NSRunLoop.currentRunLoop(), UITrackingRunLoopMode); + this.displayLink.addToRunLoopForMode(utils.ios.getter(NSRunLoop, NSRunLoop.currentRunLoop), UITrackingRunLoopMode); } public start() { diff --git a/tns-core-modules/http/http-request.ios.ts b/tns-core-modules/http/http-request.ios.ts index 779c4ccdc..58e182a6e 100644 --- a/tns-core-modules/http/http-request.ios.ts +++ b/tns-core-modules/http/http-request.ios.ts @@ -6,25 +6,20 @@ import http = require("http"); import * as types from "utils/types"; import * as imageSourceModule from "image-source"; -import * as utilsModule from "utils/utils"; import * as fsModule from "file-system"; +import * as utils from "utils/utils"; +import getter = utils.ios.getter; + import domainDebugger = require("./../debugger/debugger"); var GET = "GET"; var USER_AGENT_HEADER = "User-Agent"; var USER_AGENT = "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"; -var sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration(); -var queue = NSOperationQueue.mainQueue(); +var sessionConfig = getter(NSURLSessionConfiguration, NSURLSessionConfiguration.defaultSessionConfiguration); +var queue = getter(NSOperationQueue, NSOperationQueue.mainQueue); var session = NSURLSession.sessionWithConfigurationDelegateDelegateQueue(sessionConfig, null, queue); -var utils: typeof utilsModule; -function ensureUtils() { - if (!utils) { - utils = require("utils/utils"); - } -} - var imageSource: typeof imageSourceModule; function ensureImageSource() { if (!imageSource) { @@ -93,7 +88,6 @@ export function request(options: http.HttpRequestOptions): Promise { return NSDataToString(data); }, toJSON: () => { - ensureUtils(); return utils.parseJSON(NSDataToString(data)); }, toImage: () => { diff --git a/tns-core-modules/platform/platform.ios.ts b/tns-core-modules/platform/platform.ios.ts index 7e6e4282f..c2f4e5bfa 100644 --- a/tns-core-modules/platform/platform.ios.ts +++ b/tns-core-modules/platform/platform.ios.ts @@ -1,11 +1,13 @@ /* tslint:disable:class-name */ import definition = require("platform"); +import * as utils from "utils/utils"; + export module platformNames { export var android = "Android"; export var ios = "iOS"; } - + class Device implements definition.Device { private _model: string; private _osVersion: string; @@ -24,7 +26,7 @@ class Device implements definition.Device { get osVersion(): string { if (!this._osVersion) { - this._osVersion = UIDevice.currentDevice().systemVersion; + this._osVersion = utils.ios.getter(UIDevice, UIDevice.currentDevice).systemVersion; } return this._osVersion; @@ -32,7 +34,7 @@ class Device implements definition.Device { get model(): string { if (!this._model) { - this._model = UIDevice.currentDevice().model; + this._model = utils.ios.getter(UIDevice, UIDevice.currentDevice).model; } return this._model; @@ -40,7 +42,7 @@ class Device implements definition.Device { get sdkVersion(): string { if (!this._sdkVersion) { - this._sdkVersion = UIDevice.currentDevice().systemVersion; + this._sdkVersion = utils.ios.getter(UIDevice, UIDevice.currentDevice).systemVersion; } return this._sdkVersion; @@ -50,7 +52,7 @@ class Device implements definition.Device { if (!this._deviceType) { var enums = require("ui/enums"); - if (UIDevice.currentDevice().userInterfaceIdiom === UIUserInterfaceIdiom.Phone) { + if (utils.ios.getter(UIDevice, UIDevice.currentDevice).userInterfaceIdiom === UIUserInterfaceIdiom.Phone) { this._deviceType = enums.DeviceType.Phone; } else { @@ -62,7 +64,7 @@ class Device implements definition.Device { } get uuid(): string { - var userDefaults = NSUserDefaults.standardUserDefaults(); + var userDefaults = utils.ios.getter(NSUserDefaults, NSUserDefaults.standardUserDefaults); var uuid_key = "TNSUUID"; var app_uuid = userDefaults.stringForKey(uuid_key); @@ -78,7 +80,7 @@ class Device implements definition.Device { get language(): string { if (!this._language) { - var languages = NSLocale.preferredLanguages(); + var languages = utils.ios.getter(NSLocale, NSLocale.preferredLanguages); this._language = languages[0]; } @@ -87,7 +89,7 @@ class Device implements definition.Device { get region(): string { if(!this._region) { - this._region = NSLocale.currentLocale().objectForKey(NSLocaleCountryCode); + this._region = utils.ios.getter(NSLocale, NSLocale.currentLocale).objectForKey(NSLocaleCountryCode); } return this._region; @@ -98,7 +100,7 @@ class MainScreen implements definition.ScreenMetrics { private _screen: UIScreen; private get screen(): UIScreen { if (!this._screen) { - this._screen = UIScreen.mainScreen(); + this._screen = utils.ios.getter(UIScreen, UIScreen.mainScreen); } return this._screen; diff --git a/tns-core-modules/text/span.ios.ts b/tns-core-modules/text/span.ios.ts index f800ca6a9..1f755ad62 100644 --- a/tns-core-modules/text/span.ios.ts +++ b/tns-core-modules/text/span.ios.ts @@ -2,6 +2,8 @@ import spanCommon = require("./span-common"); import enums = require("ui/enums"); import formattedString = require("text/formatted-string"); +import * as utils from "utils/utils"; + global.moduleMerge(spanCommon, exports); export class Span extends spanCommon.Span { @@ -16,7 +18,7 @@ export class Span extends spanCommon.Span { if (realFontAttributes || realFontFamily || realFontSize) { var font; if (!realFontSize) { - realFontSize = UIFont.systemFontSize(); + realFontSize = utils.ios.getter(UIFont, UIFont.systemFontSize); } if (realFontFamily) { font = UIFont.fontWithNameSize(realFontFamily, realFontSize); diff --git a/tns-core-modules/ui/animation/animation.ios.ts b/tns-core-modules/ui/animation/animation.ios.ts index 7724461b7..85034ab89 100644 --- a/tns-core-modules/ui/animation/animation.ios.ts +++ b/tns-core-modules/ui/animation/animation.ios.ts @@ -6,6 +6,8 @@ import enums = require("ui/enums"); import style = require("ui/styling/style"); import dependencyObservable = require("ui/core/dependency-observable"); +import * as utils from "utils/utils"; + global.moduleMerge(common, exports); let _transform = "_transform"; @@ -239,7 +241,7 @@ export class Animation extends common.Animation implements definition.Animation }; originalValue = nativeView.layer.backgroundColor; if (nativeView instanceof UILabel) { - nativeView.setValueForKey(UIColor.clearColor(), "backgroundColor"); + nativeView.setValueForKey(utils.ios.getter(UIColor, UIColor.clearColor), "backgroundColor"); } value = value.CGColor; break; diff --git a/tns-core-modules/ui/date-picker/date-picker.ios.ts b/tns-core-modules/ui/date-picker/date-picker.ios.ts index 7fcd94fdf..2f7d28f6a 100644 --- a/tns-core-modules/ui/date-picker/date-picker.ios.ts +++ b/tns-core-modules/ui/date-picker/date-picker.ios.ts @@ -4,11 +4,13 @@ import proxy = require("ui/core/proxy"); import style = require("ui/styling/style"); import view = require("ui/core/view"); +import * as utils from "utils/utils"; + function onYearPropertyChanged(data: dependencyObservable.PropertyChangeData) { var picker = data.object; if (picker.ios) { - var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, picker.ios.date); + var comps = utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, picker.ios.date); comps.year = data.newValue; picker.date = new Date(comps.year, comps.month - 1, comps.day); } @@ -20,7 +22,7 @@ function onMonthPropertyChanged(data: dependencyObservable.PropertyChangeData) { var picker = data.object; if (picker.ios) { - var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, picker.ios.date); + var comps = utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, picker.ios.date); comps.month = data.newValue; picker.date = new Date(comps.year, comps.month - 1, comps.day); } @@ -32,7 +34,7 @@ function onDayPropertyChanged(data: dependencyObservable.PropertyChangeData) { var picker = data.object; if (picker.ios) { - var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, picker.ios.date); + var comps = utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, picker.ios.date); comps.day = data.newValue; picker.date = new Date(comps.year, comps.month - 1, comps.day); } @@ -65,12 +67,12 @@ function onDatePropertyChanged(data: dependencyObservable.PropertyChangeData) { var picker = data.object; if (picker.ios) { - var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, picker.ios.date); + var comps = utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, picker.ios.date); let newDate = data.newValue; comps.year = newDate.getFullYear(); comps.month = newDate.getMonth() + 1; comps.day = newDate.getDate(); - picker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false); + picker.ios.setDateAnimated(utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).dateFromComponents(comps), false); } } @@ -108,7 +110,7 @@ class UIDatePickerChangeHandlerImpl extends NSObject { } public valueChanged(sender: UIDatePicker) { - var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, sender.date); + var comps = utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, sender.date); let owner = this._owner.get(); if (!owner) { diff --git a/tns-core-modules/ui/dialogs/dialogs.ios.ts b/tns-core-modules/ui/dialogs/dialogs.ios.ts index 3a2ee28b3..6f1637cd5 100644 --- a/tns-core-modules/ui/dialogs/dialogs.ios.ts +++ b/tns-core-modules/ui/dialogs/dialogs.ios.ts @@ -4,7 +4,9 @@ import dialogs = require("ui/dialogs"); import dialogsCommon = require("./dialogs-common"); import types = require("utils/types"); -import utils = require("utils/utils"); + +import * as utils from "utils/utils"; +import getter = utils.ios.getter; global.moduleMerge(dialogsCommon, exports); @@ -476,7 +478,7 @@ export function action(arg: any): Promise { }); actionSheet.delegate = delegate; - actionSheet.showInView(UIApplication.sharedApplication().keyWindow); + actionSheet.showInView(getter(UIApplication, UIApplication.sharedApplication).keyWindow); } else { var alertController = UIAlertController.alertControllerWithTitleMessagePreferredStyle(options.title, options.message, UIAlertControllerStyle.ActionSheet); diff --git a/tns-core-modules/ui/image-cache/image-cache.ios.ts b/tns-core-modules/ui/image-cache/image-cache.ios.ts index afeb3b64d..dc64aa0e3 100644 --- a/tns-core-modules/ui/image-cache/image-cache.ios.ts +++ b/tns-core-modules/ui/image-cache/image-cache.ios.ts @@ -1,8 +1,10 @@ import common = require("./image-cache-common"); -import utils = require("utils/utils"); import trace = require("trace"); import * as httpRequestModule from "http/http-request"; +import * as utils from "utils/utils"; +import getter = utils.ios.getter; + var httpRequest: typeof httpRequestModule; function ensureHttpRequest() { if (!httpRequest) { @@ -32,7 +34,7 @@ class MemmoryWarningHandler extends NSObject { public initWithCache(cache: NSCache): MemmoryWarningHandler { this._cache = cache; - NSNotificationCenter.defaultCenter().addObserverSelectorNameObject(this, "clearCache", "UIApplicationDidReceiveMemoryWarningNotification", null); + getter(NSNotificationCenter, NSNotificationCenter.defaultCenter).addObserverSelectorNameObject(this, "clearCache", "UIApplicationDidReceiveMemoryWarningNotification", null); if (trace.enabled) { trace.write("[MemmoryWarningHandler] Added low memory observer.", trace.categories.Debug); } @@ -41,7 +43,7 @@ class MemmoryWarningHandler extends NSObject { } public dealloc(): void { - NSNotificationCenter.defaultCenter().removeObserverNameObject(this, "UIApplicationDidReceiveMemoryWarningNotification", null); + getter(NSNotificationCenter, NSNotificationCenter.defaultCenter).removeObserverNameObject(this, "UIApplicationDidReceiveMemoryWarningNotification", null); if (trace.enabled) { trace.write("[MemmoryWarningHandler] Removed low memory observer.", trace.categories.Debug); } diff --git a/tns-core-modules/ui/page/page.ios.ts b/tns-core-modules/ui/page/page.ios.ts index 4e34d9f4c..2a6e401f2 100644 --- a/tns-core-modules/ui/page/page.ios.ts +++ b/tns-core-modules/ui/page/page.ios.ts @@ -2,10 +2,12 @@ import {View} from "ui/core/view"; import trace = require("trace"); import uiUtils = require("ui/utils"); -import utils = require("utils/utils"); import {device} from "platform"; import {DeviceType} from "ui/enums"; +import * as utils from "utils/utils"; +import getter = utils.ios.getter; + global.moduleMerge(pageCommon, exports); const ENTRY = "_entry"; const DELEGATE = "_delegate"; @@ -79,7 +81,7 @@ class UIViewControllerImpl extends UIViewController { if (owner._modalParent) { let isTablet = device.deviceType === DeviceType.Tablet; let isFullScreen = !owner._UIModalPresentationFormSheet || !isTablet; - let frame = isFullScreen ? UIScreen.mainScreen().bounds : this.view.frame; + let frame = isFullScreen ? getter(UIScreen, UIScreen.mainScreen).bounds : this.view.frame; let size = frame.size; let width = size.width; let height = size.height; @@ -99,7 +101,7 @@ class UIViewControllerImpl extends UIViewController { let bottom = height; let statusBarHeight = uiUtils.ios.getStatusBarHeight(); - let statusBarVisible = !UIApplication.sharedApplication().statusBarHidden; + let statusBarVisible = !getter(UIApplication, UIApplication.sharedApplication).statusBarHidden; let backgroundSpanUnderStatusBar = owner.backgroundSpanUnderStatusBar; if (statusBarVisible && !backgroundSpanUnderStatusBar) { height -= statusBarHeight; @@ -396,7 +398,7 @@ export class Page extends pageCommon.Page { super._raiseShowingModallyEvent(); parent.ios.presentViewControllerAnimatedCompletion(this._ios, utils.ios.MajorVersion >= 7, null); - let transitionCoordinator = parent.ios.transitionCoordinator(); + let transitionCoordinator = getter(parent.ios, parent.ios.transitionCoordinator); if (transitionCoordinator) { UIViewControllerTransitionCoordinator.prototype.animateAlongsideTransitionCompletion.call(transitionCoordinator, null, () => this._raiseShownModallyEvent()); } diff --git a/tns-core-modules/ui/segmented-bar/segmented-bar.ios.ts b/tns-core-modules/ui/segmented-bar/segmented-bar.ios.ts index c66538780..a22689d92 100644 --- a/tns-core-modules/ui/segmented-bar/segmented-bar.ios.ts +++ b/tns-core-modules/ui/segmented-bar/segmented-bar.ios.ts @@ -8,6 +8,8 @@ import style = require("ui/styling/style"); import font = require("ui/styling/font"); import view = require("ui/core/view"); +import * as utils from "utils/utils"; + global.moduleMerge(common, exports); var color: typeof colorModule; @@ -175,7 +177,7 @@ export class SegmentedBarStyler implements style.Styler { else { attrs = NSMutableDictionary.new(); } - let newFont = (newValue).getUIFont(UIFont.systemFontOfSize(UIFont.labelFontSize())); + let newFont = (newValue).getUIFont(UIFont.systemFontOfSize(utils.ios.getter(UIFont, UIFont.labelFontSize))); attrs.setValueForKey(newFont, NSFontAttributeName); bar.setTitleTextAttributesForState(attrs, UIControlState.Normal); } @@ -202,7 +204,7 @@ export class SegmentedBarStyler implements style.Styler { currentFont = currentAttrs.objectForKey(NSFontAttributeName); } if (!currentFont) { - currentFont = UIFont.systemFontOfSize(UIFont.labelFontSize()); + currentFont = UIFont.systemFontOfSize(utils.ios.getter(UIFont, UIFont.labelFontSize)); } return currentFont; } diff --git a/tns-core-modules/ui/styling/background.ios.ts b/tns-core-modules/ui/styling/background.ios.ts index 681fe027f..225f0775c 100644 --- a/tns-core-modules/ui/styling/background.ios.ts +++ b/tns-core-modules/ui/styling/background.ios.ts @@ -2,6 +2,8 @@ import viewModule = require("ui/core/view"); import common = require("./background-common"); import * as styleModule from "./style"; +import * as utils from "utils/utils"; + global.moduleMerge(common, exports); var style: typeof styleModule; @@ -193,7 +195,7 @@ function drawClipPath(view: viewModule.View) { borderLayer.path = path; borderLayer.lineWidth = view.borderWidth * 2; borderLayer.strokeColor = view.borderColor.ios.CGColor; - borderLayer.fillColor = UIColor.clearColor().CGColor; + borderLayer.fillColor = utils.ios.getter(UIColor, UIColor.clearColor).CGColor; borderLayer.frame = nativeView.bounds; diff --git a/tns-core-modules/ui/styling/font.ios.ts b/tns-core-modules/ui/styling/font.ios.ts index d8e17bc82..649840def 100644 --- a/tns-core-modules/ui/styling/font.ios.ts +++ b/tns-core-modules/ui/styling/font.ios.ts @@ -3,6 +3,8 @@ import common = require("./font-common"); import fs = require("file-system"); import * as traceModule from "trace"; +import * as utils from "utils/utils"; + export class Font extends common.Font { public static default = new Font(undefined, undefined, enums.FontStyle.normal, enums.FontWeight.normal); @@ -45,7 +47,7 @@ export function ensureSystemFontSets() { return; } - var nsFontFamilies = UIFont.familyNames(); + var nsFontFamilies = utils.ios.getter(UIFont, UIFont.familyNames); for (var i = 0; i < nsFontFamilies.count; i++) { var family = nsFontFamilies.objectAtIndex(i); systemFontFamilies.add(family); @@ -98,7 +100,7 @@ function createUIFont(font: Font, defaultFont: UIFont) { } if (!descriptor) { - descriptor = defaultFont.fontDescriptor().fontDescriptorWithSymbolicTraits(symbolicTraits); + descriptor = utils.ios.getter(defaultFont, defaultFont.fontDescriptor).fontDescriptorWithSymbolicTraits(symbolicTraits); } return UIFont.fontWithDescriptorSize(descriptor, size); @@ -115,19 +117,19 @@ function tryResolveWithSystemFont(font: Font, size: number, symbolicTraits: numb else { systemFont = UIFont.systemFontOfSize(size); } - result = systemFont.fontDescriptor().fontDescriptorWithSymbolicTraits(symbolicTraits); + result = utils.ios.getter(systemFont, systemFont.fontDescriptor).fontDescriptorWithSymbolicTraits(symbolicTraits); break; case common.genericFontFamilies.monospace: if ((UIFont).monospacedDigitSystemFontOfSizeWeight) {// This method is available on iOS 9.0 and later. systemFont = (UIFont).monospacedDigitSystemFontOfSizeWeight(size, getiOSFontWeight(font.fontWeight)); - result = systemFont.fontDescriptor().fontDescriptorWithSymbolicTraits(symbolicTraits); + result = utils.ios.getter(systemFont, systemFont.fontDescriptor).fontDescriptorWithSymbolicTraits(symbolicTraits); } break; } if (systemFont) { - var result = systemFont.fontDescriptor().fontDescriptorWithSymbolicTraits(symbolicTraits); + var result = utils.ios.getter(systemFont, systemFont.fontDescriptor).fontDescriptorWithSymbolicTraits(symbolicTraits); return result; } @@ -291,7 +293,7 @@ export module ios { if (!fs.File.exists(filePath)) { filePath = fs.path.join(fs.knownFolders.currentApp().path, fontFile); } - var fontData = NSFileManager.defaultManager().contentsAtPath(filePath); + var fontData = utils.ios.getter(NSFileManager, NSFileManager.defaultManager).contentsAtPath(filePath); if (!fontData) { throw new Error("Could not load font from: " + fontFile); } diff --git a/tns-core-modules/ui/tab-view/tab-view.ios.ts b/tns-core-modules/ui/tab-view/tab-view.ios.ts index c8118b79a..53afa0a39 100644 --- a/tns-core-modules/ui/tab-view/tab-view.ios.ts +++ b/tns-core-modules/ui/tab-view/tab-view.ios.ts @@ -2,7 +2,6 @@ import definition = require("ui/tab-view"); import dependencyObservable = require("ui/core/dependency-observable"); import trace = require("trace"); -import utils = require("utils/utils"); import view = require("ui/core/view"); import types = require("utils/types"); import proxy = require("ui/core/proxy"); @@ -11,6 +10,9 @@ import * as imageSourceModule from "image-source"; import style = require("ui/styling/style"); import { Page } from "ui/page"; +import * as utils from "utils/utils"; +import getter = utils.ios.getter; + global.moduleMerge(common, exports); var imageSource: typeof imageSourceModule; @@ -487,7 +489,7 @@ export class TabViewStyler implements style.Styler { } if (!currentFont) { - currentFont = UIFont.systemFontOfSize(UIFont.labelFontSize()); + currentFont = UIFont.systemFontOfSize(getter(UIFont, UIFont.labelFontSize)); } return currentFont; diff --git a/tns-core-modules/ui/text-view/text-view.ios.ts b/tns-core-modules/ui/text-view/text-view.ios.ts index de7517722..e1f75c241 100644 --- a/tns-core-modules/ui/text-view/text-view.ios.ts +++ b/tns-core-modules/ui/text-view/text-view.ios.ts @@ -6,6 +6,8 @@ import {View} from "ui/core/view"; import * as style from "ui/styling/style"; import {isNullOrUndefined} from "utils/types"; +import * as utils from "utils/utils"; + global.moduleMerge(common, exports); class UITextViewDelegateImpl extends NSObject implements UITextViewDelegate { @@ -119,7 +121,7 @@ export class TextView extends common.TextView { } public _showHint(hint: string) { - this.ios.textColor = this.ios.textColor ? this.ios.textColor.colorWithAlphaComponent(0.22) : UIColor.blackColor().colorWithAlphaComponent(0.22); + this.ios.textColor = this.ios.textColor ? this.ios.textColor.colorWithAlphaComponent(0.22) : utils.ios.getter(UIColor, UIColor.blackColor).colorWithAlphaComponent(0.22); this.ios.text = isNullOrUndefined(hint) ? "" : hint + ""; (this.ios).isShowingHint = true; } diff --git a/tns-core-modules/ui/time-picker/time-picker.ios.ts b/tns-core-modules/ui/time-picker/time-picker.ios.ts index 8191af91f..cd2247228 100644 --- a/tns-core-modules/ui/time-picker/time-picker.ios.ts +++ b/tns-core-modules/ui/time-picker/time-picker.ios.ts @@ -2,15 +2,17 @@ import style = require("ui/styling/style"); import {View} from "ui/core/view"; +import * as utils from "utils/utils"; + function getDate(hour: number, minute: number): Date { var comps = NSDateComponents.alloc().init(); comps.hour = hour; comps.minute = minute; - return NSCalendar.currentCalendar().dateFromComponents(comps); + return utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).dateFromComponents(comps); } function getComponents(date: Date | NSDate): NSDateComponents { - return NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute, date); + return utils.ios.getter(NSCalendar, NSCalendar.currentCalendar).componentsFromDate(NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute, date); } global.moduleMerge(common, exports); diff --git a/tns-core-modules/ui/utils.ios.ts b/tns-core-modules/ui/utils.ios.ts index 3380f94e7..43aad4902 100644 --- a/tns-core-modules/ui/utils.ios.ts +++ b/tns-core-modules/ui/utils.ios.ts @@ -1,5 +1,6 @@ import {View} from "ui/core/view"; import * as utils from "utils/utils"; +import getter = utils.ios.getter; export module ios { export function getActualHeight(view: UIView): number { @@ -11,7 +12,7 @@ export module ios { } export function getStatusBarHeight(): number { - var app = UIApplication.sharedApplication(); + var app = getter(UIApplication, UIApplication.sharedApplication); if (!app || app.statusBarHidden) { return 0; } diff --git a/tns-core-modules/utils/utils.d.ts b/tns-core-modules/utils/utils.d.ts index 36781ef1a..44b0d8e2c 100644 --- a/tns-core-modules/utils/utils.d.ts +++ b/tns-core-modules/utils/utils.d.ts @@ -154,6 +154,13 @@ * Module with ios specific utilities. */ module ios { + /** + * Checks if the property is a function and if it is, calls it on this. + * Designed to support backward compatibility for methods that became properties. + * Will not work on delegates since it checks if the propertyValue is a function, and delegates are marshalled as functions. + * Example: getter(NSRunLoop, NSRunLoop.currentRunLoop).runUntilDate(NSDate.dateWithTimeIntervalSinceNow(waitTime)); + */ + export function getter(_this: any, propertyValue: T | {(): T}): T; export function getTransformedText(view, source: string, transform: string): string; export function setWhiteSpace(view, value: string, parentView?: any); export function setTextAlignment(view, value: string); diff --git a/tns-core-modules/utils/utils.ios.ts b/tns-core-modules/utils/utils.ios.ts index 56853c5a8..9cdd259d9 100644 --- a/tns-core-modules/utils/utils.ios.ts +++ b/tns-core-modules/utils/utils.ios.ts @@ -56,6 +56,14 @@ export module ios { } } + export function getter(_this: any, property: T | {(): T}): T { + if (typeof property === "function") { + return (<{(): T}>property).call(_this); + } else { + return property; + } + } + export function getTransformedText(view, source: string, transform: string): string { let result = source; @@ -131,13 +139,13 @@ export module ios { } export function isLandscape(): boolean { - var device = UIDevice.currentDevice(); - var statusBarOrientation = UIApplication.sharedApplication().statusBarOrientation; + var device = getter(UIDevice, UIDevice.currentDevice); + var statusBarOrientation = getter(UIApplication, UIApplication.sharedApplication).statusBarOrientation; var isStatusBarOrientationLandscape = isOrientationLandscape(statusBarOrientation); return isOrientationLandscape(device.orientation) || isStatusBarOrientationLandscape; } - export var MajorVersion = NSString.stringWithString(UIDevice.currentDevice().systemVersion).intValue; + export var MajorVersion = NSString.stringWithString(getter(UIDevice, UIDevice.currentDevice).systemVersion).intValue; export function openFile(filePath: string): boolean { try { @@ -163,8 +171,8 @@ export function GC() { export function openUrl(location: string): boolean { try { var url = NSURL.URLWithString(location.trim()); - if (UIApplication.sharedApplication().canOpenURL(url)) { - return UIApplication.sharedApplication().openURL(url); + if (ios.getter(UIApplication, UIApplication.sharedApplication).canOpenURL(url)) { + return ios.getter(UIApplication, UIApplication.sharedApplication).openURL(url); } } catch (e) {