diff --git a/api-reports/NativeScript.api.md b/api-reports/NativeScript.api.md index 31e464aac..69bcfbc15 100644 --- a/api-reports/NativeScript.api.md +++ b/api-reports/NativeScript.api.md @@ -1947,7 +1947,7 @@ export class Span extends ViewBase { public textDecoration: TextDecoration; //@endprivate - } +} // @public export class StackLayout extends LayoutBase { @@ -2428,8 +2428,7 @@ export interface TapGestureEventData extends GestureEventData { getPointerCount(): number; getX(): number; getY(): number; - - } +} // @public export interface Template { @@ -2623,6 +2622,7 @@ export const Utils: { getModuleName: typeof getModuleName; openFile: typeof openFile; openUrl: typeof openUrl; + isRealDevice: typeof isRealDevice; layout: typeof layout; android: typeof ad; ios: typeof ios; @@ -3116,9 +3116,10 @@ export class XmlParser { // nativescript-core/index.d.ts:114:5 - (ae-forgotten-export) The symbol "getModuleName" needs to be exported by the entry point index.d.ts // nativescript-core/index.d.ts:115:5 - (ae-forgotten-export) The symbol "openFile" needs to be exported by the entry point index.d.ts // nativescript-core/index.d.ts:116:5 - (ae-forgotten-export) The symbol "openUrl" needs to be exported by the entry point index.d.ts -// nativescript-core/index.d.ts:117:5 - (ae-forgotten-export) The symbol "layout" needs to be exported by the entry point index.d.ts -// nativescript-core/index.d.ts:118:5 - (ae-forgotten-export) The symbol "ad" needs to be exported by the entry point index.d.ts -// nativescript-core/index.d.ts:119:5 - (ae-forgotten-export) The symbol "ios" needs to be exported by the entry point index.d.ts +// nativescript-core/index.d.ts:117:5 - (ae-forgotten-export) The symbol "isRealDevice" needs to be exported by the entry point index.d.ts +// nativescript-core/index.d.ts:118:5 - (ae-forgotten-export) The symbol "layout" needs to be exported by the entry point index.d.ts +// nativescript-core/index.d.ts:119:5 - (ae-forgotten-export) The symbol "ad" needs to be exported by the entry point index.d.ts +// nativescript-core/index.d.ts:120:5 - (ae-forgotten-export) The symbol "ios" needs to be exported by the entry point index.d.ts // nativescript-core/ui/core/view-base/view-base.d.ts:179:26 - (ae-forgotten-export) The symbol "Property" needs to be exported by the entry point index.d.ts // nativescript-core/ui/core/view-base/view-base.d.ts:179:26 - (ae-forgotten-export) The symbol "CssProperty" needs to be exported by the entry point index.d.ts // nativescript-core/ui/core/view-base/view-base.d.ts:179:26 - (ae-forgotten-export) The symbol "CssAnimationProperty" needs to be exported by the entry point index.d.ts diff --git a/nativescript-core/index.d.ts b/nativescript-core/index.d.ts index 5022cecdb..9caf9a3af 100644 --- a/nativescript-core/index.d.ts +++ b/nativescript-core/index.d.ts @@ -100,7 +100,7 @@ export declare const Trace: { isEnabled: typeof isEnabled; }; export * from "./ui"; -import { GC, isFontIconURI, isDataURI, isFileOrResourcePath, executeOnMainThread, mainThreadify, isMainThread, dispatchToMainThread, releaseNativeObject, getModuleName, openFile, openUrl, layout, ad as androidUtils, ios as iosUtils } from "./utils/utils"; +import { GC, isFontIconURI, isDataURI, isFileOrResourcePath, executeOnMainThread, mainThreadify, isMainThread, dispatchToMainThread, releaseNativeObject, getModuleName, openFile, openUrl, isRealDevice, layout, ad as androidUtils, ios as iosUtils } from "./utils/utils"; export declare const Utils: { GC: typeof GC; isFontIconURI: typeof isFontIconURI; @@ -114,6 +114,7 @@ export declare const Utils: { getModuleName: typeof getModuleName; openFile: typeof openFile; openUrl: typeof openUrl; + isRealDevice: typeof isRealDevice; layout: typeof layout; android: typeof androidUtils; ios: typeof iosUtils; diff --git a/nativescript-core/index.ts b/nativescript-core/index.ts index 6088694f4..aab8e0a03 100644 --- a/nativescript-core/index.ts +++ b/nativescript-core/index.ts @@ -98,7 +98,7 @@ import { GC, isFontIconURI, isDataURI, isFileOrResourcePath, executeOnMainThread, mainThreadify, isMainThread, dispatchToMainThread, releaseNativeObject, getModuleName, - openFile, openUrl, + openFile, openUrl, isRealDevice, layout, ad as androidUtils, ios as iosUtils } from "./utils/utils"; @@ -107,7 +107,7 @@ export const Utils = { executeOnMainThread, mainThreadify, isMainThread, dispatchToMainThread, releaseNativeObject, getModuleName, - openFile, openUrl, + openFile, openUrl, isRealDevice, layout, android: androidUtils, ios: iosUtils }; diff --git a/nativescript-core/ui/gestures/gestures.d.ts b/nativescript-core/ui/gestures/gestures.d.ts index 152769972..369289b68 100644 --- a/nativescript-core/ui/gestures/gestures.d.ts +++ b/nativescript-core/ui/gestures/gestures.d.ts @@ -42,7 +42,7 @@ */ touch } - + /** * Defines an enum with supported gesture states. */ @@ -64,7 +64,7 @@ */ ended } - + /** * Defines an enum for swipe gesture direction. */ @@ -86,7 +86,7 @@ */ down } - + /** * Defines a touch action */ @@ -95,23 +95,23 @@ * Down action. */ export const down: string; - + /** * Up action. */ export const up: string; - + /** * Move action. */ export const move: string; - + /** * Cancel action. */ export const cancel: string; } - + /** * Provides gesture event data. */ @@ -137,7 +137,7 @@ /** * Provides gesture event data. */ - export interface TapGestureEventData extends GestureEventData { +export interface TapGestureEventData extends GestureEventData { /** * Gets the number of pointers in the event. */ @@ -152,7 +152,7 @@ getY(): number; } - + /** * Provides gesture event data. */ @@ -160,19 +160,19 @@ /** * Gets action of the touch. Possible values: 'up', 'move', 'down', 'cancel' */ - action: "up" | "move" | "down" | "cancel"; + action: "up" | "move" | "down" | "cancel"; /** * Gets the pointers that triggered the event. * Note: In Android there is aways only one active pointer. */ getActivePointers(): Array; - + /** * Gets all pointers. */ getAllPointers(): Array; } - + /** * Pointer is an object representing a finger (or other object) that is touching the screen. */ @@ -181,12 +181,12 @@ * The id of the pointer. */ android: any; - + /** * The UITouch object associated to the touch */ ios: any; - + /** * Gets the X coordinate of the pointer inside the view that triggered the event. */ @@ -221,31 +221,31 @@ */ getYDIP(): number } - + /** * Provides gesture event data. */ export interface GestureEventDataWithState extends GestureEventData { state: number; } - + /** * Provides gesture event data for pinch gesture. */ export interface PinchGestureEventData extends GestureEventDataWithState { scale: number; - + getFocusX(): number; getFocusY(): number; } - + /** * Provides gesture event data for swipe gesture. */ export interface SwipeGestureEventData extends GestureEventData { direction: SwipeDirection; } - + /** * Provides gesture event data for pan gesture. */ @@ -253,14 +253,14 @@ deltaX: number; deltaY: number; } - + /** * Provides gesture event data for rotation gesture. */ export interface RotationGestureEventData extends GestureEventDataWithState { rotation: number; } - + /** * Provides options for the GesturesObserver. */ @@ -272,39 +272,39 @@ * @param context - default this argument for the callbacks. */ constructor(target: View, callback: (args: GestureEventData) => void, context: any); - + /** * Registers a gesture observer to a view and gesture. * @param type - Type of the gesture. */ observe(type: GestureTypes); - + /** * Disconnects the gesture observer. */ disconnect(); - + /** * Gesture type attached to the observer. */ type: GestureTypes; - + /** * A function that will be executed when a gesture is received. */ callback: (args: GestureEventData) => void; - + /** * A context which will be used as `this` in callback execution. */ context: any; - + /** * An internal Android specific method used to pass the motion event to the correct gesture observer. */ androidOnTouchEvent: (motionEvent: any /* android.view.MotionEvent */) => void; } - + /** * A short-hand function that is used to create a gesture observer for a view and gesture. * @param target - View which will be watched for originating a specific gesture. @@ -313,17 +313,16 @@ * @param context - this argument for the callback. */ export function observe(target: View, type: GestureTypes, callback: (args: GestureEventData) => void, context?: any): GesturesObserver; - + /** * Returns a string representation of a gesture type. * @param type - Type of the gesture. * @param separator(optional) - Text separator between gesture type strings. */ export function toString(type: GestureTypes, separator?: string): string; - + /** * Returns a gesture type enum value from a string (case insensitive). * @param type - A string representation of a gesture type (e.g. Tap). */ export function fromString(type: string): GestureTypes; - \ No newline at end of file diff --git a/nativescript-core/utils/native-helper.android.ts b/nativescript-core/utils/native-helper.android.ts index 6d848179c..06c9cee04 100644 --- a/nativescript-core/utils/native-helper.android.ts +++ b/nativescript-core/utils/native-helper.android.ts @@ -153,4 +153,10 @@ export module ad { return result; } } + + export function isRealDevice(): boolean { + const fingerprint = android.os.Build.FINGERPRINT; + + return fingerprint != null && (fingerprint.indexOf("vbox") > -1 || fingerprint.indexOf("generic") > -1); + } } \ No newline at end of file diff --git a/nativescript-core/utils/native-helper.d.ts b/nativescript-core/utils/native-helper.d.ts index c5c04f275..15500797d 100644 --- a/nativescript-core/utils/native-helper.d.ts +++ b/nativescript-core/utils/native-helper.d.ts @@ -83,6 +83,11 @@ export module ad { */ export function getPaletteColor(name: string, context: any /* android.content.Context */): number; } + + /** + * Checks whether the application is running on real device and not on emulator. + */ + export function isRealDevice(): boolean; } /** * Module with ios specific utilities. @@ -156,7 +161,7 @@ export module ios { export function getVisibleViewController(rootViewController: any/* UIViewController*/): any/* UIViewController*/; /** - * + * * @param transform Applies a rotation transform over X,Y and Z axis * @param x Rotation over X axis in degrees * @param y Rotation over Y axis in degrees @@ -165,4 +170,9 @@ export module ios { export function applyRotateTransform(transform: any /* CATransform3D*/, x: number, y: number, z: number): any /* CATransform3D*/; export class UIDocumentInteractionControllerDelegateImpl { } + + /** + * Checks whether the application is running on real device and not on simulator. + */ + export function isRealDevice(): boolean; } diff --git a/nativescript-core/utils/native-helper.ios.ts b/nativescript-core/utils/native-helper.ios.ts index 091e3d8f8..8c22fd09d 100644 --- a/nativescript-core/utils/native-helper.ios.ts +++ b/nativescript-core/utils/native-helper.ios.ts @@ -4,6 +4,8 @@ import { write as traceWrite } from "../trace"; +declare var UIImagePickerControllerSourceType: any; + const radToDeg = Math.PI / 180; function isOrientationLandscape(orientation: number) { @@ -14,7 +16,7 @@ function isOrientationLandscape(orientation: number) { function openFileAtRootModule(filePath: string): boolean { try { const appPath = ios.getCurrentAppPath(); - const path = filePath.replace("~", appPath); + let path = ios.isRealDevice() ? filePath.replace("~", appPath) : filePath; const controller = UIDocumentInteractionController.interactionControllerWithURL(NSURL.fileURLWithPath(path)); controller.delegate = new ios.UIDocumentInteractionControllerDelegateImpl(); @@ -153,4 +155,16 @@ export module ios { return this.getViewController().view.frame; } } + + export function isRealDevice() { + try { + // https://stackoverflow.com/a/5093092/4936697 + const sourceType = UIImagePickerControllerSourceType.UIImagePickerControllerSourceTypeCamera; + const mediaTypes = UIImagePickerController.availableMediaTypesForSourceType(sourceType); + + return mediaTypes; + } catch (e) { + return true; + } + } } diff --git a/nativescript-core/utils/utils.android.ts b/nativescript-core/utils/utils.android.ts index 933b2e942..15f67c7c5 100644 --- a/nativescript-core/utils/utils.android.ts +++ b/nativescript-core/utils/utils.android.ts @@ -182,3 +182,7 @@ Please ensure you have your manifest correctly configured with the FileProvider. return false; } } + +export function isRealDevice(): boolean { + return ad.isRealDevice(); +} diff --git a/nativescript-core/utils/utils.d.ts b/nativescript-core/utils/utils.d.ts index ef5d4216e..6a06237af 100644 --- a/nativescript-core/utils/utils.d.ts +++ b/nativescript-core/utils/utils.d.ts @@ -347,3 +347,8 @@ export function hasDuplicates(arr: Array): boolean; * @param arr - The array. */ export function eliminateDuplicates(arr: Array): Array; + +/** + * Checks whether the application is running on real device and not on simulator/emulator. + */ +export function isRealDevice(): boolean; \ No newline at end of file diff --git a/nativescript-core/utils/utils.ios.ts b/nativescript-core/utils/utils.ios.ts index be2f3b956..31c013880 100644 --- a/nativescript-core/utils/utils.ios.ts +++ b/nativescript-core/utils/utils.ios.ts @@ -9,7 +9,7 @@ export * from "./utils-common"; export function openFile(filePath: string): boolean { try { const appPath = ios.getCurrentAppPath(); - const path = filePath.replace("~", appPath); + let path = ios.isRealDevice() ? filePath.replace("~", appPath) : filePath; const controller = UIDocumentInteractionController.interactionControllerWithURL(NSURL.fileURLWithPath(path)); controller.delegate = new ios.UIDocumentInteractionControllerDelegateImpl(); @@ -45,3 +45,7 @@ export function openUrl(location: string): boolean { return false; } + +export function isRealDevice(): boolean { + return ios.isRealDevice(); +}