forked from EVOgeek/Vmeda.Online
		
	MOBILE-3947 qr-scanner: Create qr scanner service
This commit is contained in:
		
							parent
							
								
									7c643dc4a4
								
							
						
					
					
						commit
						c0ae3e61c0
					
				| @ -31,7 +31,7 @@ import { Keyboard } from '@awesome-cordova-plugins/keyboard/ngx'; | ||||
| import { LocalNotifications } from '@awesome-cordova-plugins/local-notifications/ngx'; | ||||
| import { MediaCapture } from '@awesome-cordova-plugins/media-capture/ngx'; | ||||
| import { Push } from '@features/native/plugins/push'; | ||||
| import { QRScanner } from '@ionic-native/qr-scanner/ngx'; | ||||
| import { QRScanner } from './plugins/qrscanner'; | ||||
| import { SplashScreen } from '@awesome-cordova-plugins/splash-screen/ngx'; | ||||
| import { SQLite } from '@awesome-cordova-plugins/sqlite/ngx'; | ||||
| import { StatusBar } from '@awesome-cordova-plugins/status-bar/ngx'; | ||||
| @ -80,7 +80,6 @@ export const CORE_NATIVE_SERVICES = [ | ||||
|         Keyboard, | ||||
|         LocalNotifications, | ||||
|         MediaCapture, | ||||
|         QRScanner, | ||||
|         SplashScreen, | ||||
|         SQLite, | ||||
|         StatusBar, | ||||
|  | ||||
| @ -16,7 +16,9 @@ import { makeSingleton } from '@singletons'; | ||||
| import { Chooser as ChooserService } from './chooser'; | ||||
| import { Push as PushService } from './push'; | ||||
| import { Zip as ZipService } from './zip'; | ||||
| import { QRScanner as QRScannerService } from './qrscanner'; | ||||
| 
 | ||||
| export const Chooser = makeSingleton(ChooserService); | ||||
| export const Push = makeSingleton(PushService); | ||||
| export const Zip = makeSingleton(ZipService); | ||||
| export const QRScanner = makeSingleton(QRScannerService); | ||||
|  | ||||
							
								
								
									
										187
									
								
								src/core/features/native/plugins/qrscanner.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								src/core/features/native/plugins/qrscanner.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,187 @@ | ||||
| // (C) Copyright 2015 Moodle Pty Ltd.
 | ||||
| //
 | ||||
| // Licensed under the Apache License, Version 2.0 (the "License");
 | ||||
| // you may not use this file except in compliance with the License.
 | ||||
| // You may obtain a copy of the License at
 | ||||
| //
 | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| //
 | ||||
| // Unless required by applicable law or agreed to in writing, software
 | ||||
| // distributed under the License is distributed on an "AS IS" BASIS,
 | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { Observable } from 'rxjs'; | ||||
| import { QRScannerError, QRScannerStatus } from '@moodlehq/cordova-plugin-qrscanner'; | ||||
| 
 | ||||
| /** | ||||
|  * QR Scanner plugin wrapper | ||||
|  */ | ||||
| @Injectable({ providedIn: 'root' }) | ||||
| export class QRScanner { | ||||
| 
 | ||||
|     /** | ||||
|      * Destroy the scanner instance. | ||||
|      * | ||||
|      * @returns QR scanner status. | ||||
|      */ | ||||
|     destroy(): Promise<QRScannerStatus> { | ||||
|         return new Promise((resolve) => window.QRScanner.destroy(resolve)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Request permission to use QR scanner. | ||||
|      * | ||||
|      * @returns QR scanner status. | ||||
|      */ | ||||
|     prepare(): Promise<QRScannerStatus> { | ||||
|         return new Promise((resolve, reject) => { | ||||
|             window.QRScanner.prepare((error: QRScannerError, status: QRScannerStatus) => { | ||||
|                 error ? reject(error) : resolve(status); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Configures the native webview to have a transparent background, then sets the background of the <body> and <html> DOM | ||||
|      * elements to transparent, allowing the webview to re-render with the transparent background. | ||||
|      * | ||||
|      * @returns QR scanner status. | ||||
|      */ | ||||
|     show(): Promise<QRScannerStatus> { | ||||
|         return new Promise(resolve => window.QRScanner.show((status) => resolve(status))); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Call this method to enable scanning. You must then call the `show` method to make the camera preview visible. | ||||
|      * | ||||
|      * @returns Observable that emits the scanned text. Unsubscribe from the observable to stop scanning. | ||||
|      */ | ||||
|     scan(): Observable<string> { | ||||
|         return new Observable(observer => { | ||||
|             window.QRScanner.scan((error: QRScannerError, text: string) => { | ||||
|                 error ? observer.error(error) : observer.next(text); | ||||
|             }); | ||||
| 
 | ||||
|             return () => { | ||||
|                 window.QRScanner.cancelScan(); | ||||
|             }; | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Configures the native webview to be opaque with a white background, covering the video preview. | ||||
|      * | ||||
|      * @returns QR scanner status. | ||||
|      */ | ||||
|     hide(): Promise<QRScannerStatus> { | ||||
|         return new Promise((resolve) => window.QRScanner.hide(resolve)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Enable the device's light (for scanning in low-light environments). | ||||
|      * | ||||
|      * @returns QR scanner status. | ||||
|      */ | ||||
|     enableLight(): Promise<QRScannerStatus> { | ||||
|         return new Promise((resolve, reject) => { | ||||
|             window.QRScanner.enableLight((error: QRScannerError, status: QRScannerStatus) => { | ||||
|                 error ? reject(error) : resolve(status); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Disable the device's light. | ||||
|      * | ||||
|      * @returns QR scanner status. | ||||
|      */ | ||||
|     disableLight(): Promise<QRScannerStatus> { | ||||
|         return new Promise((resolve, reject) => { | ||||
|             window.QRScanner.disableLight((error: QRScannerError, status: QRScannerStatus) => { | ||||
|                 error ? reject(error) : resolve(status); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Use front camera. | ||||
|      * | ||||
|      * @returns QR scanner status. | ||||
|      */ | ||||
|     useFrontCamera(): Promise<QRScannerStatus> { | ||||
|         return new Promise((resolve, reject) => { | ||||
|             window.QRScanner.useFrontCamera((error: QRScannerError, status: QRScannerStatus) => { | ||||
|                 error ? reject(error) : resolve(status); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Use back camera. | ||||
|      * | ||||
|      * @returns QR scanner status. | ||||
|      */ | ||||
|     useBackCamera(): Promise<QRScannerStatus> { | ||||
|         return new Promise((resolve, reject) => { | ||||
|             window.QRScanner.useBackCamera((error: QRScannerError, status: QRScannerStatus) => { | ||||
|                 error ? reject(error) : resolve(status); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Disable the device's light. | ||||
|      * | ||||
|      * @param camera Provide `0` for back camera, and `1` for front camera. | ||||
|      * @returns QR scanner status. | ||||
|      */ | ||||
|     useCamera(camera: QRScannerCamera): Promise<QRScannerStatus> { | ||||
|         return new Promise((resolve, reject) => { | ||||
|             window.QRScanner.useCamera(camera, (error: QRScannerError, status: QRScannerStatus) => { | ||||
|                 error ? reject(error) : resolve(status); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Pauses the video preview on the current frame and pauses scanning. | ||||
|      * | ||||
|      * @returns QR scanner status. | ||||
|      */ | ||||
|     pausePreview(): Promise<QRScannerStatus> { | ||||
|         return new Promise((resolve) => window.QRScanner.pausePreview(resolve)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Resume the video preview and resumes scanning. | ||||
|      * | ||||
|      * @returns QR scanner status. | ||||
|      */ | ||||
|     resumePreview(): Promise<QRScannerStatus> { | ||||
|         return new Promise((resolve) => window.QRScanner.resumePreview(resolve)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Returns permission status. | ||||
|      * | ||||
|      * @returns QR scanner status. | ||||
|      */ | ||||
|     getStatus(): Promise<QRScannerStatus> { | ||||
|         return new Promise((resolve) => window.QRScanner.getStatus(resolve)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Opens settings to edit app permissions. | ||||
|      */ | ||||
|     openSettings(): void { | ||||
|         window.QRScanner.openSettings(); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| export enum QRScannerCamera { | ||||
|     FRONT_CAMERA = 0, | ||||
|     BACK_CAMERA = 1, | ||||
| } | ||||
| @ -16,7 +16,6 @@ import { Injectable } from '@angular/core'; | ||||
| import { InAppBrowserObject, InAppBrowserOptions } from '@awesome-cordova-plugins/in-app-browser'; | ||||
| import { FileEntry } from '@awesome-cordova-plugins/file/ngx'; | ||||
| import { Subscription } from 'rxjs'; | ||||
| 
 | ||||
| import { CoreEvents } from '@singletons/events'; | ||||
| import { CoreFile } from '@services/file'; | ||||
| import { CoreLang } from '@services/lang'; | ||||
| @ -24,7 +23,7 @@ import { CoreWS } from '@services/ws'; | ||||
| import { CoreDomUtils } from '@services/utils/dom'; | ||||
| import { CoreMimetypeUtils } from '@services/utils/mimetype'; | ||||
| import { CoreTextUtils } from '@services/utils/text'; | ||||
| import { makeSingleton, Clipboard, InAppBrowser, FileOpener, WebIntent, QRScanner, Translate, NgZone } from '@singletons'; | ||||
| import { makeSingleton, Clipboard, InAppBrowser, FileOpener, WebIntent, Translate, NgZone } from '@singletons'; | ||||
| import { CoreLogger } from '@singletons/logger'; | ||||
| import { CoreViewerQRScannerComponent } from '@features/viewer/components/qr-scanner/qr-scanner'; | ||||
| import { CoreCanceledError } from '@classes/errors/cancelederror'; | ||||
| @ -40,6 +39,7 @@ import { CoreSites } from '@services/sites'; | ||||
| import { CoreCancellablePromise } from '@classes/cancellable-promise'; | ||||
| import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics'; | ||||
| import { CoreUrlUtils } from './url'; | ||||
| import { QRScanner } from '@features/native/plugins'; | ||||
| 
 | ||||
| export type TreeNode<T> = T & { children: TreeNode<T>[] }; | ||||
| 
 | ||||
|  | ||||
| @ -52,7 +52,6 @@ import { WebView as WebViewService } from '@awesome-cordova-plugins/ionic-webvie | ||||
| import { Keyboard as KeyboardService } from '@awesome-cordova-plugins/keyboard/ngx'; | ||||
| import { LocalNotifications as LocalNotificationsService } from '@awesome-cordova-plugins/local-notifications/ngx'; | ||||
| import { MediaCapture as MediaCaptureService } from '@awesome-cordova-plugins/media-capture/ngx'; | ||||
| import { QRScanner as QRScannerService } from '@ionic-native/qr-scanner/ngx'; | ||||
| import { StatusBar as StatusBarService } from '@awesome-cordova-plugins/status-bar/ngx'; | ||||
| import { SplashScreen as SplashScreenService } from '@awesome-cordova-plugins/splash-screen/ngx'; | ||||
| import { SQLite as SQLiteService } from '@awesome-cordova-plugins/sqlite/ngx'; | ||||
| @ -183,7 +182,6 @@ export const Keyboard = makeSingleton(KeyboardService); | ||||
| export const LocalNotifications = makeSingleton(LocalNotificationsService); | ||||
| export const MediaCapture = makeSingleton(MediaCaptureService); | ||||
| export const NativeHttp = makeSingleton(HTTP); | ||||
| export const QRScanner = makeSingleton(QRScannerService); | ||||
| export const StatusBar = makeSingleton(StatusBarService); | ||||
| export const SplashScreen = makeSingleton(SplashScreenService); | ||||
| export const SQLite = makeSingleton(SQLiteService); | ||||
|  | ||||
							
								
								
									
										68
									
								
								src/types/cordova-plugin-qrscanner.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								src/types/cordova-plugin-qrscanner.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,68 @@ | ||||
| // (C) Copyright 2015 Moodle Pty Ltd.
 | ||||
| //
 | ||||
| // Licensed under the Apache License, Version 2.0 (the "License");
 | ||||
| // you may not use this file except in compliance with the License.
 | ||||
| // You may obtain a copy of the License at
 | ||||
| //
 | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| //
 | ||||
| // Unless required by applicable law or agreed to in writing, software
 | ||||
| // distributed under the License is distributed on an "AS IS" BASIS,
 | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| /** | ||||
|  * Types for qr scanner plugin. | ||||
|  * | ||||
|  * @see https://github.com/moodlemobile/cordova-plugin-qrscanner
 | ||||
|  */ | ||||
| 
 | ||||
| type IQRScannerStatus = { | ||||
|     authorized: boolean; | ||||
|     denied: boolean; | ||||
|     restricted: boolean; | ||||
|     prepared: boolean; | ||||
|     scanning: boolean; | ||||
|     previewing: boolean; | ||||
|     showing: boolean; | ||||
|     lightEnabled: boolean; | ||||
|     canOpenSettings: boolean; | ||||
|     canEnableLight: boolean; | ||||
|     canChangeCamera: boolean; | ||||
|     currentCamera: number; | ||||
| }; | ||||
| 
 | ||||
| type IQRScannerError = { | ||||
|     name: string; | ||||
|     code: number; | ||||
|     _message: string; // eslint-disable-line @typescript-eslint/naming-convention
 | ||||
| }; | ||||
| 
 | ||||
| interface Window { | ||||
| 
 | ||||
|     // eslint-disable-next-line @typescript-eslint/naming-convention
 | ||||
|     QRScanner: { | ||||
|         prepare(onDone?: (error: IQRScannerError, status: IQRScannerStatus) => void): void; | ||||
|         destroy(onDone?: (status: IQRScannerStatus) => void): void; | ||||
|         scan(onDone: (error: IQRScannerError, text: string) => void): void; | ||||
|         cancelScan(onDone?: (status: IQRScannerStatus) => void): void; | ||||
|         show(onDone?: (status: IQRScannerStatus) => void): void; | ||||
|         hide(onDone?: (status: IQRScannerStatus) => void): void; | ||||
|         pausePreview(onDone?: (status: IQRScannerStatus) => void): void; | ||||
|         resumePreview(onDone?: (status: IQRScannerStatus) => void): void; | ||||
|         enableLight(onDone?: (error: IQRScannerError, status: IQRScannerStatus) => void): void; | ||||
|         disableLight(onDone?: (error: IQRScannerError, status: IQRScannerStatus) => void): void; | ||||
|         useCamera(camera: number, onDone?: (error: IQRScannerError, status: IQRScannerStatus) => void): void; | ||||
|         useFrontCamera(onDone?: (error: IQRScannerError, status: IQRScannerStatus) => void): void; | ||||
|         useBackCamera(onDone?: (error: IQRScannerError, status: IQRScannerStatus) => void): void; | ||||
|         openSettings(onDone?: (error: IQRScannerError, status: IQRScannerStatus) => void): void; | ||||
|         getStatus(onDone: (status: IQRScannerStatus) => void): void; | ||||
|     }; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| declare module '@moodlehq/cordova-plugin-qrscanner' { | ||||
|     export type QRScannerStatus = IQRScannerStatus; | ||||
|     export type QRScannerError = IQRScannerError; | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user