diff --git a/types/react-native-mauron85-background-geolocation/index.d.ts b/types/react-native-mauron85-background-geolocation/index.d.ts new file mode 100644 index 0000000000..19ce3c03c1 --- /dev/null +++ b/types/react-native-mauron85-background-geolocation/index.d.ts @@ -0,0 +1,543 @@ +// Type definitions for react-native-mauron85-background-geolocation 0.5 +// Project: https://github.com/mauron85/react-native-background-geolocation#readme +// Definitions by: Györög Norbert +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.8 + +export type Event = 'location' | 'stationary' | 'activity' | 'start' | 'stop' | 'error' | 'authorization' | 'foreground' | 'background' | 'abort_requested'; +export type iOSActivityType = 'AutomotiveNavigation' | 'OtherNavigation' | 'Fitness' | 'Other'; +export type Provider = 'gps' | 'network' | 'passive' | 'fused'; +export type ActivityType = 'IN_VEHICLE' | 'ON_BICYCLE' | 'ON_FOOT' | 'RUNNING' | 'STILL' | 'TILTING' | 'UNKNOWN' | 'WALKING'; +export type LogLevel = 'TRACE' | 'DEBUG' | 'INFO' | 'WARN' | 'ERROR'; +export type HeadlessTaskEventName = 'location' | 'stationary' | 'activity'; + +export interface ConfigureOptions { + /** + * Set location provider + * Platform: all + * @default DISTANCE_FILTER_PROVIDER + * @see {@link https://github.com/mauron85/react-native-background-geolocation/blob/master/PROVIDERS.md|PROVIDERS} + */ + locationProvider?: number; + + /** + * Desired accuracy in meters. Possible values [HIGH_ACCURACY, MEDIUM_ACCURACY, LOW_ACCURACY, PASSIVE_ACCURACY]. + * Accuracy has direct effect on power drain. Lower accuracy = lower power drain. + * Platform: all + * Provider: all + * @default MEDIUM_ACCURACY + */ + desiredAccuracy?: number; + + /** + * Stationary radius in meters. When stopped, the minimum distance the device must move beyond the stationary location for aggressive background-tracking to engage. + * Platform: all + * Provider: DISTANCE_FILTER + * @default 50 + */ + stationaryRadius?: number; + + /** + * When enabled, the plugin will emit sounds for life-cycle events of background-geolocation! See debugging sounds table. + * Platform: all + * Provider: all + * @default false + * @see {@link https://github.com/mauron85/react-native-background-geolocation#debugging-sounds|Debugging sounds} + */ + debug?: boolean; + + /** + * The minimum distance (measured in meters) a device must move horizontally before an update event is generated. + * Platform: all + * Provider: DISTANCE_FILTER, RAW + * @default 500 + * @see {@link https://apple.co/2oHo2CV|Apple docs} + */ + distanceFilter?: number; + + /** + * Enable this in order to force a stop() when the application terminated (e.g. on iOS, double-tap home button, swipe away the app). + * Platform: all + * Provider: all + * @default true + */ + stopOnTerminate?: boolean; + + /** + * Start background service on device boot. + * Platform: Android + * Provider: all + * @default false + */ + startOnBoot?: boolean; + + /** + * The minimum time interval between location updates in milliseconds. + * Platform: Android + * Provider: all + * @default 60000 + * @see {@link https://bit.ly/1x00RUu|Android docs} + */ + interval?: number; + + /** + * Fastest rate in milliseconds at which your app can handle location updates. + * Platform: Android + * Provider: ACTIVITY + * @default 120000 + * @see {@link https://bit.ly/1x00RUu|Android docs} + */ + fastestInterval?: number; + + /** + * Rate in milliseconds at which activity recognition occurs. Larger values will result in fewer activity detections while improving battery life. + * Platform: Android + * Provider: ACTIVITY + * @default 10000 + */ + activitiesInterval?: number; + + /** + * DEPRECATED! + * Stop location updates, when the STILL activity is detected. + * Platform: Android + * Provider: ACTIVITY + * @default true + */ + stopOnStillActivity?: boolean; + + /** + * Enable/disable local notifications when tracking and syncing locations. + * Platform: Android + * Provider: all + * @default true + */ + notificationsEnabled?: boolean; + + /** + * Allow location sync service to run in foreground state. Foreground state also requires a notification to be presented to the user. + * Platform: Android + * Provider: all + * @default false + */ + startForeground?: boolean; + + /** + * Custom notification title in the drawer. + * Platform: Android + * Provider: all + * @default "Background tracking" + */ + notificationTitle?: string; + + /** + * Custom notification text in the drawer. + * Platform: Android + * Provider: all + * @default "ENABLED" + */ + notificationText?: string; + + /** + * The accent color to use for notification. Eg. #4CAF50. + * Platform: Android + * Provider: all + */ + notificationIconColor?: string; + + /** + * The filename of a custom notification icon. + * Platform: Android + * Provider: all + */ + notificationIconLarge?: string; + + /** + * The filename of a custom notification icon. + * Platform: Android + * Provider: all + */ + notificationIconSmall?: string; + + /** + * Presumably, this affects iOS GPS algorithm. + * [AutomotiveNavigation, OtherNavigation, Fitness, Other] + * Platform: iOS + * Provider: all + * @default "OtherNavigation" + * @see {@link https://apple.co/2oHofpH|Apple docs} + */ + activityType?: iOSActivityType; + + /** + * Pauses location updates when app is paused. + * Platform: iOS + * Provider: all + * @default false + * @see {@link https://apple.co/2CbjEW2|Apple docs} + */ + pauseLocationUpdates?: boolean; + + /** + * Switch to less accurate significant changes and region monitory when in background. + * Platform: iOS + * Provider: all + * @default false + */ + saveBatteryOnBackground?: boolean; + + /** + * Server url where to send HTTP POST with recorded locations + * Platform: all + * Provider: all + * @see {@link https://github.com/mauron85/react-native-background-geolocation#http-locations-posting|HTTP locations posting} + */ + url?: string; + + /** + * Server url where to send fail to post locations + * Platform: all + * Provider: all + * @see {@link https://github.com/mauron85/react-native-background-geolocation#http-locations-posting|HTTP locations posting} + */ + syncUrl?: string; + + /** + * Specifies how many previously failed locations will be sent to server at once. + * Platform: all + * Provider: all + * @default 100 + */ + syncThreshold?: string; + + /** + * Optional HTTP headers sent along in HTTP request. + * Platform: all + * Provider: all + */ + httpHeaders?: any; + + /** + * Limit maximum number of locations stored into db. + * Platform: all + * Provider: all + * @default 10000 + */ + maxLocations?: number; + + /** + * Customization post template. + * Platform: all + * Provider: all + * @see {@link https://github.com/mauron85/react-native-background-geolocation#custom-post-template|Custom post template} + */ + postTemplate?: any; +} + +export interface LocationOptions { + /** + * Maximum time in milliseconds device will wait for location. + */ + timeout?: number; + + /** + * Maximum age in milliseconds of a possible cached location that is acceptable to return. + */ + maximumAge?: number; + + /** + * If true and if the device is able to provide a more accurate position, it will do so. + */ + enableHighAccuracy?: boolean; +} + +export interface LocationError { + /** Reason of an error occurring when using the geolocating device. */ + code: number; + + /** Message describing the details of the error */ + message: string; +} + +export interface Location { + /** ID of location as stored in DB (or null) */ + id: number; + provider: Provider; + locationProvider: number; + /** UTC time of this fix, in milliseconds since January 1, 1970. */ + time: number; + /** Latitude, in degrees. */ + latitude: number; + /** Longitude, in degrees. */ + longitude: number; + /** Estimated accuracy of this location, in meters. */ + accuracy: number; + /** Speed if it is available, in meters/second over ground. */ + speed: number; + /** Altitude if available, in meters above the WGS 84 reference ellipsoid. */ + altitude: number; + /** Bearing, in degrees. */ + bearing: number; + /** True if location was recorded by mock provider. (ANDROID ONLY) */ + isFromMockProvider?: boolean; + /** True if device has mock locations enabled. (ANDROID ONLY) */ + mockLocationsEnabled?: boolean; +} + +export interface Activity { + /** Percentage indicating the likelihood user is performing this activity. */ + confidence: number; + /** IN_VEHICLE, ON_BICYCLE, ON_FOOT, RUNNING, STILL, TILTING, UNKNOWN, WALKING */ + type: ActivityType; +} + +export interface LogEntry { + /** ID of log entry as stored in db. */ + id: number; + /** Timestamp in milliseconds since beginning of UNIX epoch. */ + timestamp: number; + level: string; + message: string; + /** Recorded stacktrace. (Android only, on iOS part of message) */ + stackTrace: string; +} + +export interface ServiceStatus { + isRunning: boolean; + locationServicesEnabled: boolean; + authorization: number; + hasPermissions: boolean; +} + +export interface EventSubscription { + remove(): void; +} + +export interface HeadlessTaskEvent { + /** Name of the event [ "location", "stationary", "activity" ] */ + name: HeadlessTaskEventName; + /** + * Event parameters. + * @see {@link https://github.com/mauron85/react-native-background-geolocation#events|Events} + */ + params: any; +} + +export interface BackgroundGeolocationStatic { + DISTANCE_FILTER_PROVIDER: 0; + ACTIVITY_PROVIDER: 1; + RAW_PROVIDER: 2; + + BACKGROUND_MODE: 0; + FOREGROUND_MODE: 1; + + NOT_AUTHORIZED: 0; + AUTHORIZED: 1; + AUTHORIZED_FOREGROUND: 2; + + HIGH_ACCURACY: 0; + MEDIUM_ACCURACY: 100; + LOW_ACCURACY: 1000; + PASSIVE_ACCURACY: 10000; + + LOG_ERROR: 'ERROR'; + LOG_WARN: 'WARN'; + LOG_INFO: 'INFO'; + LOG_DEBUG: 'DEBUG'; + LOG_TRACE: 'TRACE'; + + PERMISSION_DENIED: 1; + LOCATION_UNAVAILABLE: 2; + TIMEOUT: 3; + + events: Event[]; + + /** + * Platform: iOS, Android + * @param options + * @param success + * @param fail + * @see {@link https://github.com/mauron85/react-native-background-geolocation#configureoptions-success-fail|Docs} + */ + configure(options: ConfigureOptions, success?: () => void, fail?: () => void): void; + + /** + * Start background geolocation. + * Platform: iOS, Android + * @see {@link https://github.com/mauron85/react-native-background-geolocation#start|Docs} + */ + start(): void; + + /** + * Stop background geolocation. + * Platform: iOS, Android + * @see {@link https://github.com/mauron85/react-native-background-geolocation#stop|Docs} + */ + stop(): void; + + /** + * One time location check to get current location of the device. + * Platform: iOS, Android + * @param success + * @param fail + * @param options + * @see {@link https://github.com/mauron85/react-native-background-geolocation#getcurrentlocationsuccess-fail-options|Docs} + */ + getCurrentLocation(success: (location: Location) => void, fail: (error: LocationError) => void, options: LocationOptions): void; + + /** + * One time check for status of location services. In case of error, fail callback will be executed. + * This method is deprecated and will be removed in next major version. Use checkStatus as replacement. + * Platform: iOS, Android + * @param success + * @param fail + * @deprecated + * @see {@link https://github.com/mauron85/react-native-background-geolocation#islocationenabledsuccess-fail|Docs} + */ + isLocationEnabled(success: (enabled: boolean) => void, fail?: () => void): void; + + /** + * Check status of the service. + * @param success + * @param fail + * @see {@link https://github.com/mauron85/react-native-background-geolocation#checkstatussuccess-fail|Docs} + */ + checkStatus(success: (status: ServiceStatus) => void, fail?: () => void): void; + + /** + * Show app settings to allow change of app location permissions. + * Platform: Android >= 6, iOS >= 8.0 + * @see {@link https://github.com/mauron85/react-native-background-geolocation#showappsettings|Docs} + */ + showAppSettings(): void; + + /** + * Show system settings to allow configuration of current location sources. + * Platform: Android + * @see {@link https://github.com/mauron85/react-native-background-geolocation#showlocationsettings|Docs} + */ + showLocationSettings(): void; + + /** + * Method will return all stored locations. This method is useful for initial rendering of user location on a map just after application launch. + * Platform: iOS, Android + * @param success + * @param fail + * @see {@link https://github.com/mauron85/react-native-background-geolocation#getlocationssuccess-fail|Docs} + */ + getLocations(success: (locations: Location[]) => void, fail?: () => void): void; + + /** + * Method will return locations which have not yet been posted to server. + * Platform: iOS, Android + * @param success + * @param fail + * @see {@link https://github.com/mauron85/react-native-background-geolocation#getvalidlocationssuccess-fail|Docs} + */ + getValidLocations(success: (location: Location[]) => void, fail?: () => void): void; + + /** + * Delete location with locationId. + * Platform: iOS, Android + * @param locationId + * @param success + * @param fail + * @see {@link https://github.com/mauron85/react-native-background-geolocation#deletelocationlocationid-success-fail|Docs} + */ + deleteLocation(locationId: number, success?: () => void, fail?: () => void): void; + + /** + * Delete all stored locations. + * Platform: iOS, Android + * You don't need to delete all locations. + * The plugin manages the number of stored locations automatically and the total count never exceeds the number as defined by option.maxLocations. + * @param success + * @param fail + * @see {@link https://github.com/mauron85/react-native-background-geolocation#deletealllocationssuccess-fail|Docs} + */ + deleteAllLocations(success?: () => void, fail?: () => void): void; + + /** + * Normally the plugin will handle switching between BACKGROUND and FOREGROUND mode itself. + * Calling switchMode you can override plugin behavior and force it to switch into other mode. + * Platform: iOS + * @param modeId + * @param success + * @param fail + * @see {@link https://github.com/mauron85/react-native-background-geolocation#switchmodemodeid-success-fail|Docs} + */ + switchMode(modeId: number, success?: () => void, fail?: () => void): void; + + /** + * Force sync of pending locations. + * Option syncThreshold will be ignored and all pending locations will be immediately posted to syncUrl in single batch. + * Platform: Android, iOS + * @param success + * @param fail + */ + forceSync(success?: () => void, fail?: () => void): void; + + /** + * Return all logged events. Useful for plugin debugging. + * Platform: Android, iOS + * @param limit + * @param fromId + * @param minLevel + * @param success + * @param fail + * @see {@link https://github.com/mauron85/react-native-background-geolocation#getlogentrieslimit-fromid-minlevel-success-fail|Docs} + */ + getLogEntries(limit: number, fromId: number, minLevel: LogLevel, success: (entries: LogEntry[]) => void, fail?: () => void): void; + + /** + * Return all logged events. Useful for plugin debugging. + * Platform: Android, iOS + * @param limit + * @param fromId + * @param success + * @param fail + * @see {@link https://github.com/mauron85/react-native-background-geolocation#getlogentrieslimit-fromid-minlevel-success-fail|Docs} + */ + getLogEntries(limit: number, fromId: number, success: (entries: LogEntry[]) => void, fail?: () => void): void; + + /** + * Return all logged events. Useful for plugin debugging. + * Platform: Android, iOS + * @param limit + * @param success + * @param fail + * @see {@link https://github.com/mauron85/react-native-background-geolocation#getlogentrieslimit-fromid-minlevel-success-fail|Docs} + */ + getLogEntries(limit: number, success: (entries: LogEntry[]) => void, fail?: () => void): void; + + /** + * Unregister all event listeners for given event. + * @param event + * @see {@link https://github.com/mauron85/react-native-background-geolocation#removealllistenersevent|Docs} + */ + removeAllListeners(event: Event): void; + + /** + * Register event listener. + * @param event + * @param callbackfn + * @see {@link https://github.com/mauron85/react-native-background-geolocation#events|Docs} + */ + on(event: Event, callbackfn: (...args: any[]) => void): EventSubscription; + + startTask(callbackfn: (taskKey: number) => void): void; + + endTask(taskKey: number): void; + + /** + * A special task that gets executed when the app is terminated, but the plugin was configured to continue running in the background (option stopOnTerminate: false). + * In this scenario the {@link https://bit.ly/2okJECK|Activity} was killed by the system and all registered event listeners will not be triggered until the app is relaunched. + * @param callbackfn + * @see {@link https://github.com/mauron85/react-native-background-geolocation#android-headless-task-experimental|Android Headless Task (Experimental)} + */ + headlessTask(callbackfn: (event: HeadlessTaskEvent) => void): void; +} + +declare const BackgroundGeolocation: BackgroundGeolocationStatic; + +export default BackgroundGeolocation; diff --git a/types/react-native-mauron85-background-geolocation/react-native-mauron85-background-geolocation-tests.ts b/types/react-native-mauron85-background-geolocation/react-native-mauron85-background-geolocation-tests.ts new file mode 100644 index 0000000000..3c5934e4ec --- /dev/null +++ b/types/react-native-mauron85-background-geolocation/react-native-mauron85-background-geolocation-tests.ts @@ -0,0 +1,108 @@ +// Test taken from Quick example at https://github.com/mauron85/react-native-background-geolocation#quick-example + +import { Component } from 'react'; +import { Alert } from 'react-native'; +import BackgroundGeolocation from 'react-native-mauron85-background-geolocation'; + +class BgTracking extends Component { + componentDidMount() { + BackgroundGeolocation.configure({ + desiredAccuracy: BackgroundGeolocation.HIGH_ACCURACY, + stationaryRadius: 50, + distanceFilter: 50, + notificationTitle: 'Background tracking', + notificationText: 'enabled', + debug: true, + startOnBoot: false, + stopOnTerminate: false, + locationProvider: BackgroundGeolocation.ACTIVITY_PROVIDER, + interval: 10000, + fastestInterval: 5000, + activitiesInterval: 10000, + stopOnStillActivity: false, + url: 'http://192.168.81.15:3000/location', + httpHeaders: { + 'X-FOO': 'bar' + }, + // customize post properties + postTemplate: { + lat: '@latitude', + lon: '@longitude', + foo: 'bar' // you can also add your own properties + } + }); + + BackgroundGeolocation.on('location', (location) => { + // handle your locations here + // to perform long running operation on iOS + // you need to create background task + BackgroundGeolocation.startTask(taskKey => { + // execute long running task + // eg. ajax post location + // IMPORTANT: task has to be ended by endTask + BackgroundGeolocation.endTask(taskKey); + }); + }); + + BackgroundGeolocation.on('stationary', (stationaryLocation) => { + // handle stationary locations here + }); + + BackgroundGeolocation.on('error', (error) => { + console.log('[ERROR] BackgroundGeolocation error:', error); + }); + + BackgroundGeolocation.on('start', () => { + console.log('[INFO] BackgroundGeolocation service has been started'); + }); + + BackgroundGeolocation.on('stop', () => { + console.log('[INFO] BackgroundGeolocation service has been stopped'); + }); + + BackgroundGeolocation.on('authorization', (status) => { + console.log('[INFO] BackgroundGeolocation authorization status: ' + status); + if (status !== BackgroundGeolocation.AUTHORIZED) { + // we need to set delay or otherwise alert may not be shown + setTimeout(() => + Alert.alert('App requires location tracking permission', 'Would you like to open app settings?', [ + {text: 'Yes', onPress: () => BackgroundGeolocation.showAppSettings()}, + {text: 'No', onPress: () => console.log('No Pressed'), style: 'cancel'} + ]), 1000); + } + }); + + BackgroundGeolocation.on('background', () => { + console.log('[INFO] App is in background'); + }); + + BackgroundGeolocation.on('foreground', () => { + console.log('[INFO] App is in foreground'); + }); + + BackgroundGeolocation.on('abort_requested', () => { + console.log('[INFO] Server responded with 285 Updates Not Required'); + }); + + BackgroundGeolocation.checkStatus(status => { + console.log('[INFO] BackgroundGeolocation service is running', status.isRunning); + console.log('[INFO] BackgroundGeolocation services enabled', status.locationServicesEnabled); + console.log('[INFO] BackgroundGeolocation auth status: ' + status.authorization); + + // you don't need to check status before start (this is just the example) + if (!status.isRunning) { + BackgroundGeolocation.start(); // triggers start on start event + } + }); + + // you can also just start without checking for status + // BackgroundGeolocation.start(); + } + + componentWillUnmount() { + // unregister all event listeners + BackgroundGeolocation.events.forEach(event => BackgroundGeolocation.removeAllListeners(event)); + } +} + +export default BgTracking; diff --git a/types/react-native-mauron85-background-geolocation/tsconfig.json b/types/react-native-mauron85-background-geolocation/tsconfig.json new file mode 100644 index 0000000000..e0cfccd5e6 --- /dev/null +++ b/types/react-native-mauron85-background-geolocation/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true, + "strictFunctionTypes": true, + "jsx": "react-native" + }, + "files": [ + "index.d.ts", + "react-native-mauron85-background-geolocation-tests.ts" + ] +} diff --git a/types/react-native-mauron85-background-geolocation/tslint.json b/types/react-native-mauron85-background-geolocation/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/react-native-mauron85-background-geolocation/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" }