MOBILE-4501 cordova-plugin-moodleapp: Add diagnostic plugin
This commit is contained in:
		
							parent
							
								
									df0ae16d54
								
							
						
					
					
						commit
						abf2867fc6
					
				| @ -15,9 +15,30 @@ | |||||||
|                 <param name="android-package" value="com.moodle.moodlemobile.InstallReferrer"/> |                 <param name="android-package" value="com.moodle.moodlemobile.InstallReferrer"/> | ||||||
|             </feature> |             </feature> | ||||||
|         </config-file> |         </config-file> | ||||||
|  | 
 | ||||||
|  |         <config-file target="res/xml/config.xml" parent="/*"> | ||||||
|  |             <feature name="Diagnostic" > | ||||||
|  |                 <param name="android-package" value="com.moodle.moodlemobile.Diagnostic"/> | ||||||
|  |                 <param name="onload" value="true" /> | ||||||
|  |             </feature> | ||||||
|  |         </config-file> | ||||||
|  | 
 | ||||||
|  |         <js-module name="Diagnostic" src="www/android/diagnostic.js"> | ||||||
|  |             <merges target="com.moodle.moodlemobile.diagnostic" /> | ||||||
|  |         </js-module> | ||||||
|  | 
 | ||||||
|  |         <source-file src="src/android/Diagnostic.java" target-dir="src/cordova/plugins" /> | ||||||
|  |         <source-file src="src/android/Diagnostic_Location.java" target-dir="src/cordova/plugins" /> | ||||||
|  | 
 | ||||||
|  |         <preference name="ANDROIDX_VERSION" default="1.0.0" /> | ||||||
|  |         <preference name="ANDROIDX_APPCOMPAT_VERSION" default="1.3.1" /> | ||||||
|  |         <framework src="androidx.legacy:legacy-support-v4:$ANDROIDX_VERSION" /> | ||||||
|  |         <framework src="androidx.appcompat:appcompat:$ANDROIDX_APPCOMPAT_VERSION" /> | ||||||
|  | 
 | ||||||
|         <source-file src="src/android/SecureStorage.java" target-dir="src/com/moodle/moodlemobile" /> |         <source-file src="src/android/SecureStorage.java" target-dir="src/com/moodle/moodlemobile" /> | ||||||
|         <source-file src="src/android/InstallReferrer.java" target-dir="src/com/moodle/moodlemobile" /> |         <source-file src="src/android/InstallReferrer.java" target-dir="src/com/moodle/moodlemobile" /> | ||||||
|     </platform> |     </platform> | ||||||
|  | 
 | ||||||
|     <platform name="ios"> |     <platform name="ios"> | ||||||
|         <config-file target="config.xml" parent="/*"> |         <config-file target="config.xml" parent="/*"> | ||||||
|             <feature name="SecureStorage"> |             <feature name="SecureStorage"> | ||||||
|  | |||||||
| @ -12,12 +12,14 @@ | |||||||
| // See the License for the specific language governing permissions and
 | // See the License for the specific language governing permissions and
 | ||||||
| // limitations under the License.
 | // limitations under the License.
 | ||||||
| 
 | 
 | ||||||
|  | import { Diagnostic } from './plugins/Diagnostic'; | ||||||
| import { InstallReferrer } from './plugins/InstallReferrer'; | import { InstallReferrer } from './plugins/InstallReferrer'; | ||||||
| import { SecureStorage } from './plugins/SecureStorage'; | import { SecureStorage } from './plugins/SecureStorage'; | ||||||
| 
 | 
 | ||||||
| const api: MoodleAppPlugins = { | const api: MoodleAppPlugins = { | ||||||
|     secureStorage: new SecureStorage(), |     secureStorage: new SecureStorage(), | ||||||
|     installReferrer: new InstallReferrer(), |     installReferrer: new InstallReferrer(), | ||||||
|  |     diagnostic: new Diagnostic(), | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| // This is necessary to work around the default transpilation behavior,
 | // This is necessary to work around the default transpilation behavior,
 | ||||||
|  | |||||||
							
								
								
									
										131
									
								
								cordova-plugin-moodleapp/src/ts/plugins/Diagnostic.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								cordova-plugin-moodleapp/src/ts/plugins/Diagnostic.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,131 @@ | |||||||
|  | // (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.
 | ||||||
|  | // (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.
 | ||||||
|  | // (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.
 | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Checks whether device hardware features are enabled or available to the app, e.g. camera, GPS, wifi | ||||||
|  |  */ | ||||||
|  | export class Diagnostic { | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Constants for requesting and reporting the various permission states. | ||||||
|  |      */ | ||||||
|  |     declare permissionStatus: typeof permissionStatus; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * ANDROID ONLY | ||||||
|  |      * "Dangerous" permissions that need to be requested at run-time (Android 6.0/API 23 and above) | ||||||
|  |      * See http://developer.android.com/guide/topics/security/permissions.html#perm-groups
 | ||||||
|  |      * | ||||||
|  |      */ | ||||||
|  |     declare permission: typeof permission; | ||||||
|  | 
 | ||||||
|  |     constructor() { | ||||||
|  |         this.permissionStatus = permissionStatus; | ||||||
|  |         this.permission = permission; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     isLocationEnabled(): Promise<boolean> { | ||||||
|  |         return new Promise<boolean>((resolve, reject) => cordova.exec(resolve, reject, 'Diagnostic', 'isLocationEnabled')); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     switchToLocationSettings(): Promise<void> { | ||||||
|  |         return new Promise<void>((resolve, reject) => cordova.exec(resolve, reject, 'Diagnostic', 'switchToLocationSettings')); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     switchToSettings(): Promise<void> { | ||||||
|  |         return new Promise<void>((resolve, reject) => cordova.exec(resolve, reject, 'Diagnostic', 'switchToSettings')); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     getLocationAuthorizationStatus(): Promise<unknown> { | ||||||
|  |         return new Promise<unknown>((resolve, reject) => | ||||||
|  |             cordova.exec(resolve, reject, 'Diagnostic', 'getLocationAuthorizationStatus')); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     requestLocationAuthorization(): Promise<void> { | ||||||
|  |         return new Promise<void>((resolve, reject) => cordova.exec(resolve, reject, 'Diagnostic', 'requestLocationAuthorization')); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     requestMicrophoneAuthorization(): Promise<string> { | ||||||
|  |         return new Promise<string>((resolve, reject) => | ||||||
|  |             cordova.exec(resolve, reject, 'Diagnostic', 'requestMicrophoneAuthorization')); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const permission = { | ||||||
|  |     acceptHandover: 'ACCEPT_HANDOVER', | ||||||
|  |     accessBackgroundLocation: 'ACCESS_BACKGROUND_LOCATION', | ||||||
|  |     accessCoarseLocation: 'ACCESS_COARSE_LOCATION', | ||||||
|  |     accessFineLocation: 'ACCESS_FINE_LOCATION', | ||||||
|  |     accessMediaLocation: 'ACCESS_MEDIA_LOCATION', | ||||||
|  |     bodySensors: 'BODY_SENSORS', | ||||||
|  |     bodySensorsBackground: 'BODY_SENSORS_BACKGROUND', | ||||||
|  |     getAccounts: 'GET_ACCOUNTS', | ||||||
|  |     readExternalStorage: 'READ_EXTERNAL_STORAGE', | ||||||
|  |     readMediaAudio: 'READ_MEDIA_AUDIO', | ||||||
|  |     readMediaImages: 'READ_MEDIA_IMAGES', | ||||||
|  |     readMediaVideo: 'READ_MEDIA_VIDEO', | ||||||
|  |     readPhoneState: 'READ_PHONE_STATE', | ||||||
|  |     readSms: 'READ_SMS', | ||||||
|  |     receiveMms: 'RECEIVE_MMS', | ||||||
|  |     receiveSms: 'RECEIVE_SMS', | ||||||
|  |     receiveWapPush: 'RECEIVE_WAP_PUSH', | ||||||
|  |     recordAudio: 'RECORD_AUDIO', | ||||||
|  |     sendSms: 'SEND_SMS', | ||||||
|  |     useSip: 'USE_SIP', | ||||||
|  |     uwbRanging: 'UWB_RANGING', | ||||||
|  |     writeExternalStorage: 'WRITE_EXTERNAL_STORAGE', | ||||||
|  | } as const; | ||||||
|  | 
 | ||||||
|  | const permissionStatus = { | ||||||
|  |     // Android only
 | ||||||
|  |     deniedOnce: 'DENIED_ONCE', | ||||||
|  | 
 | ||||||
|  |     // iOS only
 | ||||||
|  |     restricted: 'restricted', | ||||||
|  |     ephimeral: 'ephemeral', | ||||||
|  |     provisional: 'provisional', | ||||||
|  | 
 | ||||||
|  |     // Both iOS and Android
 | ||||||
|  |     granted: 'authorized' || 'GRANTED', | ||||||
|  |     grantedWhenInUse: 'authorized_when_in_use', | ||||||
|  |     notRequested: 'not_determined' || 'NOT_REQUESTED', | ||||||
|  |     deniedAlways: 'denied_always' || 'DENIED_ALWAYS', | ||||||
|  | } as const; | ||||||
							
								
								
									
										2
									
								
								cordova-plugin-moodleapp/types/index.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								cordova-plugin-moodleapp/types/index.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -14,12 +14,14 @@ | |||||||
| 
 | 
 | ||||||
| import { InstallReferrer } from '../src/ts/plugins/InstallReferrer'; | import { InstallReferrer } from '../src/ts/plugins/InstallReferrer'; | ||||||
| import { SecureStorage as SecureStorageImpl } from '../src/ts/plugins/SecureStorage'; | import { SecureStorage as SecureStorageImpl } from '../src/ts/plugins/SecureStorage'; | ||||||
|  | import { Diagnostic } from '../src/ts/plugins/Diagnostic'; | ||||||
| 
 | 
 | ||||||
| declare global { | declare global { | ||||||
| 
 | 
 | ||||||
|     interface MoodleAppPlugins { |     interface MoodleAppPlugins { | ||||||
|         secureStorage: SecureStorageImpl; |         secureStorage: SecureStorageImpl; | ||||||
|         installReferrer: InstallReferrer; |         installReferrer: InstallReferrer; | ||||||
|  |         diagnostic: Diagnostic; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     interface Cordova { |     interface Cordova { | ||||||
|  | |||||||
							
								
								
									
										39
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										39
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -23,7 +23,6 @@ | |||||||
|         "@awesome-cordova-plugins/clipboard": "^6.6.0", |         "@awesome-cordova-plugins/clipboard": "^6.6.0", | ||||||
|         "@awesome-cordova-plugins/core": "^6.6.0", |         "@awesome-cordova-plugins/core": "^6.6.0", | ||||||
|         "@awesome-cordova-plugins/device": "^6.6.0", |         "@awesome-cordova-plugins/device": "^6.6.0", | ||||||
|         "@awesome-cordova-plugins/diagnostic": "^6.6.0", |  | ||||||
|         "@awesome-cordova-plugins/file": "^6.6.0", |         "@awesome-cordova-plugins/file": "^6.6.0", | ||||||
|         "@awesome-cordova-plugins/file-opener": "^6.6.0", |         "@awesome-cordova-plugins/file-opener": "^6.6.0", | ||||||
|         "@awesome-cordova-plugins/geolocation": "^6.6.0", |         "@awesome-cordova-plugins/geolocation": "^6.6.0", | ||||||
| @ -80,7 +79,6 @@ | |||||||
|         "cordova-plugin-wkuserscript": "^1.0.1", |         "cordova-plugin-wkuserscript": "^1.0.1", | ||||||
|         "cordova-plugin-wkwebview-cookies": "^1.0.1", |         "cordova-plugin-wkwebview-cookies": "^1.0.1", | ||||||
|         "cordova-sqlite-storage": "^6.1.0", |         "cordova-sqlite-storage": "^6.1.0", | ||||||
|         "cordova.plugins.diagnostic": "^7.1.4", |  | ||||||
|         "core-js": "^3.9.1", |         "core-js": "^3.9.1", | ||||||
|         "es6-promise-plugin": "^4.2.2", |         "es6-promise-plugin": "^4.2.2", | ||||||
|         "ionicons": "^7.0.0", |         "ionicons": "^7.0.0", | ||||||
| @ -2573,22 +2571,6 @@ | |||||||
|       "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-11.0.3.tgz", |       "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-11.0.3.tgz", | ||||||
|       "integrity": "sha512-kyuRQ40/NWQVhqGIHq78Ehu2Bf9Mlg0LhmSmis6ZFJK7z933FRfYi8tHe/k/0fB+PGfCf95rJC6TO7dopaFvAg==" |       "integrity": "sha512-kyuRQ40/NWQVhqGIHq78Ehu2Bf9Mlg0LhmSmis6ZFJK7z933FRfYi8tHe/k/0fB+PGfCf95rJC6TO7dopaFvAg==" | ||||||
|     }, |     }, | ||||||
|     "node_modules/@awesome-cordova-plugins/diagnostic": { |  | ||||||
|       "version": "6.6.0", |  | ||||||
|       "license": "MIT", |  | ||||||
|       "dependencies": { |  | ||||||
|         "@types/cordova": "latest" |  | ||||||
|       }, |  | ||||||
|       "peerDependencies": { |  | ||||||
|         "@awesome-cordova-plugins/core": "^6.0.1", |  | ||||||
|         "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0" |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|     "node_modules/@awesome-cordova-plugins/diagnostic/node_modules/@types/cordova": { |  | ||||||
|       "version": "11.0.3", |  | ||||||
|       "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-11.0.3.tgz", |  | ||||||
|       "integrity": "sha512-kyuRQ40/NWQVhqGIHq78Ehu2Bf9Mlg0LhmSmis6ZFJK7z933FRfYi8tHe/k/0fB+PGfCf95rJC6TO7dopaFvAg==" |  | ||||||
|     }, |  | ||||||
|     "node_modules/@awesome-cordova-plugins/file": { |     "node_modules/@awesome-cordova-plugins/file": { | ||||||
|       "version": "6.6.0", |       "version": "6.6.0", | ||||||
|       "license": "MIT", |       "license": "MIT", | ||||||
| @ -11904,13 +11886,6 @@ | |||||||
|       "version": "2.0.20", |       "version": "2.0.20", | ||||||
|       "license": "MIT" |       "license": "MIT" | ||||||
|     }, |     }, | ||||||
|     "node_modules/colors": { |  | ||||||
|       "version": "1.4.0", |  | ||||||
|       "license": "MIT", |  | ||||||
|       "engines": { |  | ||||||
|         "node": ">=0.1.90" |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|     "node_modules/combined-stream": { |     "node_modules/combined-stream": { | ||||||
|       "version": "1.0.8", |       "version": "1.0.8", | ||||||
|       "license": "MIT", |       "license": "MIT", | ||||||
| @ -13003,20 +12978,6 @@ | |||||||
|       "version": "4.1.0", |       "version": "4.1.0", | ||||||
|       "license": "MIT" |       "license": "MIT" | ||||||
|     }, |     }, | ||||||
|     "node_modules/cordova.plugins.diagnostic": { |  | ||||||
|       "version": "7.1.4", |  | ||||||
|       "hasInstallScript": true, |  | ||||||
|       "license": "MIT", |  | ||||||
|       "dependencies": { |  | ||||||
|         "colors": "1.4.0", |  | ||||||
|         "elementtree": "^0.1.6", |  | ||||||
|         "minimist": "1.2.6" |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|     "node_modules/cordova.plugins.diagnostic/node_modules/minimist": { |  | ||||||
|       "version": "1.2.6", |  | ||||||
|       "license": "MIT" |  | ||||||
|     }, |  | ||||||
|     "node_modules/cordova/node_modules/fs-extra": { |     "node_modules/cordova/node_modules/fs-extra": { | ||||||
|       "version": "11.2.0", |       "version": "11.2.0", | ||||||
|       "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", |       "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", | ||||||
|  | |||||||
| @ -58,7 +58,6 @@ | |||||||
|     "@awesome-cordova-plugins/clipboard": "^6.6.0", |     "@awesome-cordova-plugins/clipboard": "^6.6.0", | ||||||
|     "@awesome-cordova-plugins/core": "^6.6.0", |     "@awesome-cordova-plugins/core": "^6.6.0", | ||||||
|     "@awesome-cordova-plugins/device": "^6.6.0", |     "@awesome-cordova-plugins/device": "^6.6.0", | ||||||
|     "@awesome-cordova-plugins/diagnostic": "^6.6.0", |  | ||||||
|     "@awesome-cordova-plugins/file": "^6.6.0", |     "@awesome-cordova-plugins/file": "^6.6.0", | ||||||
|     "@awesome-cordova-plugins/file-opener": "^6.6.0", |     "@awesome-cordova-plugins/file-opener": "^6.6.0", | ||||||
|     "@awesome-cordova-plugins/geolocation": "^6.6.0", |     "@awesome-cordova-plugins/geolocation": "^6.6.0", | ||||||
| @ -114,7 +113,6 @@ | |||||||
|     "cordova-plugin-wkuserscript": "^1.0.1", |     "cordova-plugin-wkuserscript": "^1.0.1", | ||||||
|     "cordova-plugin-wkwebview-cookies": "^1.0.1", |     "cordova-plugin-wkwebview-cookies": "^1.0.1", | ||||||
|     "cordova-sqlite-storage": "^6.1.0", |     "cordova-sqlite-storage": "^6.1.0", | ||||||
|     "cordova.plugins.diagnostic": "^7.1.4", |  | ||||||
|     "core-js": "^3.9.1", |     "core-js": "^3.9.1", | ||||||
|     "es6-promise-plugin": "^4.2.2", |     "es6-promise-plugin": "^4.2.2", | ||||||
|     "ionicons": "^7.0.0", |     "ionicons": "^7.0.0", | ||||||
| @ -236,11 +234,6 @@ | |||||||
|       "cordova-plugin-wkuserscript": {}, |       "cordova-plugin-wkuserscript": {}, | ||||||
|       "cordova-plugin-wkwebview-cookies": {}, |       "cordova-plugin-wkwebview-cookies": {}, | ||||||
|       "cordova-sqlite-storage": {}, |       "cordova-sqlite-storage": {}, | ||||||
|       "cordova.plugins.diagnostic": { |  | ||||||
|         "ANDROID_SUPPORT_VERSION": "28.+", |  | ||||||
|         "ANDROIDX_VERSION": "1.0.0", |  | ||||||
|         "ANDROIDX_APPCOMPAT_VERSION": "1.6.1" |  | ||||||
|       }, |  | ||||||
|       "nl.kingsquare.cordova.background-audio": {} |       "nl.kingsquare.cordova.background-audio": {} | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
| import { ChangeDetectionStrategy, Component, ElementRef, OnDestroy } from '@angular/core'; | import { ChangeDetectionStrategy, Component, ElementRef, OnDestroy } from '@angular/core'; | ||||||
| import { CoreModalComponent } from '@classes/modal-component'; | import { CoreModalComponent } from '@classes/modal-component'; | ||||||
| import { CorePlatform } from '@services/platform'; | import { CorePlatform } from '@services/platform'; | ||||||
| import { Diagnostic, DomSanitizer, Translate } from '@singletons'; | import { DomSanitizer, Translate } from '@singletons'; | ||||||
| import { BehaviorSubject, combineLatest, Observable, OperatorFunction } from 'rxjs'; | import { BehaviorSubject, combineLatest, Observable, OperatorFunction } from 'rxjs'; | ||||||
| import { Mp3MediaRecorder } from 'mp3-mediarecorder'; | import { Mp3MediaRecorder } from 'mp3-mediarecorder'; | ||||||
| import { map, shareReplay, tap } from 'rxjs/operators'; | import { map, shareReplay, tap } from 'rxjs/operators'; | ||||||
| @ -26,6 +26,7 @@ import { CAPTURE_ERROR_NO_MEDIA_FILES, CoreCaptureError } from '@classes/errors/ | |||||||
| import { CoreFileUploaderAudioRecording } from '@features/fileuploader/services/fileuploader'; | import { CoreFileUploaderAudioRecording } from '@features/fileuploader/services/fileuploader'; | ||||||
| import { CoreFile, CoreFileProvider } from '@services/file'; | import { CoreFile, CoreFileProvider } from '@services/file'; | ||||||
| import { CorePath } from '@singletons/path'; | import { CorePath } from '@singletons/path'; | ||||||
|  | import { CoreNative } from '@features/native/services/native'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|     selector: 'core-fileuploader-audio-recorder', |     selector: 'core-fileuploader-audio-recorder', | ||||||
| @ -204,17 +205,19 @@ export class CoreFileUploaderAudioRecorderComponent extends CoreModalComponent<C | |||||||
|      * Make sure that microphone usage has been authorized. |      * Make sure that microphone usage has been authorized. | ||||||
|      */ |      */ | ||||||
|     protected async prepareMicrophoneAuthorization(): Promise<void> { |     protected async prepareMicrophoneAuthorization(): Promise<void> { | ||||||
|         if (!CorePlatform.isMobile()) { |         const diagnostic = await CoreNative.plugin('diagnostic')?.getInstance(); | ||||||
|  | 
 | ||||||
|  |         if (!CorePlatform.isMobile() || !diagnostic) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         const status = await Diagnostic.requestMicrophoneAuthorization(); |         const status = await diagnostic.requestMicrophoneAuthorization(); | ||||||
| 
 | 
 | ||||||
|         switch (status) { |         switch (status) { | ||||||
|             case Diagnostic.permissionStatus.DENIED_ONCE: |             case diagnostic.permissionStatus.deniedOnce: | ||||||
|             case Diagnostic.permissionStatus.DENIED_ALWAYS: |             case diagnostic.permissionStatus.deniedAlways: | ||||||
|                 throw new Error(Translate.instant('core.fileuploader.microphonepermissiondenied')); |                 throw new Error(Translate.instant('core.fileuploader.microphonepermissiondenied')); | ||||||
|             case Diagnostic.permissionStatus.RESTRICTED: |             case diagnostic.permissionStatus.restricted: | ||||||
|                 throw new Error(Translate.instant('core.fileuploader.microphonepermissionrestricted')); |                 throw new Error(Translate.instant('core.fileuploader.microphonepermissionrestricted')); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -19,7 +19,6 @@ import { Camera } from '@awesome-cordova-plugins/camera/ngx'; | |||||||
| import { Chooser } from '@features/native/plugins/chooser'; | import { Chooser } from '@features/native/plugins/chooser'; | ||||||
| import { Clipboard } from '@awesome-cordova-plugins/clipboard/ngx'; | import { Clipboard } from '@awesome-cordova-plugins/clipboard/ngx'; | ||||||
| import { Device } from '@awesome-cordova-plugins/device/ngx'; | import { Device } from '@awesome-cordova-plugins/device/ngx'; | ||||||
| import { Diagnostic } from '@awesome-cordova-plugins/diagnostic/ngx'; |  | ||||||
| import { File } from '@awesome-cordova-plugins/file/ngx'; | import { File } from '@awesome-cordova-plugins/file/ngx'; | ||||||
| import { FileOpener } from '@awesome-cordova-plugins/file-opener/ngx'; | import { FileOpener } from '@awesome-cordova-plugins/file-opener/ngx'; | ||||||
| import { Geolocation } from '@awesome-cordova-plugins/geolocation/ngx'; | import { Geolocation } from '@awesome-cordova-plugins/geolocation/ngx'; | ||||||
| @ -43,7 +42,6 @@ export const CORE_NATIVE_SERVICES = [ | |||||||
|     Chooser, |     Chooser, | ||||||
|     Clipboard, |     Clipboard, | ||||||
|     Device, |     Device, | ||||||
|     Diagnostic, |  | ||||||
|     File, |     File, | ||||||
|     FileOpener, |     FileOpener, | ||||||
|     Geolocation, |     Geolocation, | ||||||
| @ -68,7 +66,6 @@ export const CORE_NATIVE_SERVICES = [ | |||||||
|         Camera, |         Camera, | ||||||
|         Clipboard, |         Clipboard, | ||||||
|         Device, |         Device, | ||||||
|         Diagnostic, |  | ||||||
|         File, |         File, | ||||||
|         FileOpener, |         FileOpener, | ||||||
|         Geolocation, |         Geolocation, | ||||||
|  | |||||||
| @ -20,13 +20,14 @@ import { CoreLang } from '@services/lang'; | |||||||
| import { CoreDomUtils } from '@services/utils/dom'; | import { CoreDomUtils } from '@services/utils/dom'; | ||||||
| import { CoreSettingsHelper, CoreColorScheme, CoreZoomLevel } from '../../services/settings-helper'; | import { CoreSettingsHelper, CoreColorScheme, CoreZoomLevel } from '../../services/settings-helper'; | ||||||
| import { CoreIframeUtils } from '@services/utils/iframe'; | import { CoreIframeUtils } from '@services/utils/iframe'; | ||||||
| import { Diagnostic, Translate } from '@singletons'; | import { Translate } from '@singletons'; | ||||||
| import { CoreSites } from '@services/sites'; | import { CoreSites } from '@services/sites'; | ||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| import { AlertButton } from '@ionic/angular'; | import { AlertButton } from '@ionic/angular'; | ||||||
| import { CoreNavigator } from '@services/navigator'; | import { CoreNavigator } from '@services/navigator'; | ||||||
| import { CorePlatform } from '@services/platform'; | import { CorePlatform } from '@services/platform'; | ||||||
| import { CoreAnalytics } from '@services/analytics'; | import { CoreAnalytics } from '@services/analytics'; | ||||||
|  | import { CoreNative } from '@features/native/services/native'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Page that displays the general settings. |  * Page that displays the general settings. | ||||||
| @ -263,7 +264,7 @@ export class CoreSettingsGeneralPage { | |||||||
|         ev.stopPropagation(); |         ev.stopPropagation(); | ||||||
|         ev.preventDefault(); |         ev.preventDefault(); | ||||||
| 
 | 
 | ||||||
|         Diagnostic.switchToSettings(); |         CoreNative.plugin('diagnostic')?.switchToSettings(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -17,12 +17,13 @@ import { Coordinates } from '@awesome-cordova-plugins/geolocation'; | |||||||
| 
 | 
 | ||||||
| import { CoreApp } from '@services/app'; | import { CoreApp } from '@services/app'; | ||||||
| import { CoreAnyError, CoreError } from '@classes/errors/error'; | import { CoreAnyError, CoreError } from '@classes/errors/error'; | ||||||
| import { Geolocation, Diagnostic, makeSingleton } from '@singletons'; | import { Geolocation, makeSingleton } from '@singletons'; | ||||||
| import { CoreUtils } from './utils/utils'; | import { CoreUtils } from './utils/utils'; | ||||||
| import { CorePlatform } from './platform'; | import { CorePlatform } from './platform'; | ||||||
| import { CoreSilentError } from '@classes/errors/silenterror'; | import { CoreSilentError } from '@classes/errors/silenterror'; | ||||||
| import { CoreSubscriptions } from '@singletons/subscriptions'; | import { CoreSubscriptions } from '@singletons/subscriptions'; | ||||||
| import { CoreLogger } from '@singletons/logger'; | import { CoreLogger } from '@singletons/logger'; | ||||||
|  | import { CoreNative } from '@features/native/services/native'; | ||||||
| 
 | 
 | ||||||
| @Injectable({ providedIn: 'root' }) | @Injectable({ providedIn: 'root' }) | ||||||
| export class CoreGeolocationProvider { | export class CoreGeolocationProvider { | ||||||
| @ -79,7 +80,13 @@ export class CoreGeolocationProvider { | |||||||
|      * @throws {CoreGeolocationError} |      * @throws {CoreGeolocationError} | ||||||
|      */ |      */ | ||||||
|     async enableLocation(): Promise<void> { |     async enableLocation(): Promise<void> { | ||||||
|         let locationEnabled = await Diagnostic.isLocationEnabled(); |         const diagnostic = CoreNative.plugin('diagnostic'); | ||||||
|  | 
 | ||||||
|  |         if (!diagnostic) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         let locationEnabled = await diagnostic.isLocationEnabled(); | ||||||
| 
 | 
 | ||||||
|         if (locationEnabled) { |         if (locationEnabled) { | ||||||
|             // Location is enabled.
 |             // Location is enabled.
 | ||||||
| @ -87,10 +94,10 @@ export class CoreGeolocationProvider { | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (!CorePlatform.isIOS()) { |         if (!CorePlatform.isIOS()) { | ||||||
|             Diagnostic.switchToLocationSettings(); |             diagnostic.switchToLocationSettings(); | ||||||
|             await CoreApp.waitForResume(30000); |             await CoreApp.waitForResume(30000); | ||||||
| 
 | 
 | ||||||
|             locationEnabled = await Diagnostic.isLocationEnabled(); |             locationEnabled = await diagnostic.isLocationEnabled(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (!locationEnabled) { |         if (!locationEnabled) { | ||||||
| @ -105,26 +112,34 @@ export class CoreGeolocationProvider { | |||||||
|      * @throws {CoreGeolocationError} |      * @throws {CoreGeolocationError} | ||||||
|      */ |      */ | ||||||
|     protected async doAuthorizeLocation(failOnDeniedOnce: boolean = false): Promise<void> { |     protected async doAuthorizeLocation(failOnDeniedOnce: boolean = false): Promise<void> { | ||||||
|         const authorizationStatus = await Diagnostic.getLocationAuthorizationStatus(); |         const diagnostic = await CoreNative.plugin('diagnostic')?.getInstance(); | ||||||
|  | 
 | ||||||
|  |         if (!diagnostic) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         const authorizationStatus = await diagnostic.getLocationAuthorizationStatus(); | ||||||
|         this.logger.log(`Authorize location: status ${authorizationStatus}`); |         this.logger.log(`Authorize location: status ${authorizationStatus}`); | ||||||
| 
 | 
 | ||||||
|         switch (authorizationStatus) { |         switch (authorizationStatus) { | ||||||
|             case Diagnostic.permissionStatus.DENIED_ONCE: |             case diagnostic.permissionStatus.deniedOnce: | ||||||
|                 if (failOnDeniedOnce) { |                 if (failOnDeniedOnce) { | ||||||
|                     throw new CoreGeolocationError(CoreGeolocationErrorReason.PERMISSION_DENIED); |                     throw new CoreGeolocationError(CoreGeolocationErrorReason.PERMISSION_DENIED); | ||||||
|                 } |                 } | ||||||
|  | 
 | ||||||
|  |             case diagnostic.permissionStatus.granted: | ||||||
|  |             case diagnostic.permissionStatus.grantedWhenInUse: | ||||||
|  |                 // Location is authorized.
 | ||||||
|  |                     return; | ||||||
|  | 
 | ||||||
|             // Fall through.
 |             // Fall through.
 | ||||||
|             case Diagnostic.permissionStatus.NOT_REQUESTED: |             case diagnostic.permissionStatus.notRequested: | ||||||
|                 this.logger.log('Request location authorization.'); |                 this.logger.log('Request location authorization.'); | ||||||
|                 await this.requestLocationAuthorization(); |                 await this.requestLocationAuthorization(); | ||||||
|                 this.logger.log('Location authorization granted.'); |                 this.logger.log('Location authorization granted.'); | ||||||
|                 await CoreApp.waitForResume(500); |                 await CoreApp.waitForResume(500); | ||||||
|                 await this.doAuthorizeLocation(true); |                 await this.doAuthorizeLocation(true); | ||||||
| 
 | 
 | ||||||
|                 return; |  | ||||||
|             case Diagnostic.permissionStatus.GRANTED: |  | ||||||
|             case Diagnostic.permissionStatus.GRANTED_WHEN_IN_USE: |  | ||||||
|                 // Location is authorized.
 |  | ||||||
|                 return; |                 return; | ||||||
|             default: |             default: | ||||||
|                 throw new CoreGeolocationError(CoreGeolocationErrorReason.PERMISSION_DENIED); |                 throw new CoreGeolocationError(CoreGeolocationErrorReason.PERMISSION_DENIED); | ||||||
| @ -151,7 +166,13 @@ export class CoreGeolocationProvider { | |||||||
|      * @returns If location can be requested. |      * @returns If location can be requested. | ||||||
|      */ |      */ | ||||||
|     async canRequest(): Promise<boolean> { |     async canRequest(): Promise<boolean> { | ||||||
|         return CoreUtils.promiseWorks(Diagnostic.getLocationAuthorizationStatus()); |         const diagnostic = CoreNative.plugin('diagnostic'); | ||||||
|  | 
 | ||||||
|  |         if (diagnostic) { | ||||||
|  |             return CoreUtils.promiseWorks(diagnostic.getLocationAuthorizationStatus()); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
| @ -159,7 +180,7 @@ export class CoreGeolocationProvider { | |||||||
|      */ |      */ | ||||||
|     protected async requestLocationAuthorization(): Promise<void> { |     protected async requestLocationAuthorization(): Promise<void> { | ||||||
|         if (!CorePlatform.isIOS()) { |         if (!CorePlatform.isIOS()) { | ||||||
|             await Diagnostic.requestLocationAuthorization(); |             await CoreNative.plugin('diagnostic')?.requestLocationAuthorization(); | ||||||
| 
 | 
 | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| @ -168,7 +189,8 @@ export class CoreGeolocationProvider { | |||||||
|         return new Promise((resolve, reject) => { |         return new Promise((resolve, reject) => { | ||||||
|             // Don't display an error if app is sent to the background, just finish the process.
 |             // Don't display an error if app is sent to the background, just finish the process.
 | ||||||
|             const unsubscribe = CoreSubscriptions.once(CorePlatform.pause, () => reject(new CoreSilentError())); |             const unsubscribe = CoreSubscriptions.once(CorePlatform.pause, () => reject(new CoreSilentError())); | ||||||
|             Diagnostic.requestLocationAuthorization().then(() => resolve(), reject).finally(() => unsubscribe()); |             CoreNative.plugin('diagnostic')?.requestLocationAuthorization() | ||||||
|  |                 .then(() => resolve(), reject).finally(() => unsubscribe()); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -24,7 +24,7 @@ import { CoreDomUtils } from '@services/utils/dom'; | |||||||
| import { CoreUrlUtils } from '@services/utils/url'; | import { CoreUrlUtils } from '@services/utils/url'; | ||||||
| import { CoreUtils } from '@services/utils/utils'; | import { CoreUtils } from '@services/utils/utils'; | ||||||
| 
 | 
 | ||||||
| import { makeSingleton, NgZone, Translate, Diagnostic } from '@singletons'; | import { makeSingleton, NgZone, Translate } from '@singletons'; | ||||||
| import { CoreLogger } from '@singletons/logger'; | import { CoreLogger } from '@singletons/logger'; | ||||||
| import { CoreUrl } from '@singletons/url'; | import { CoreUrl } from '@singletons/url'; | ||||||
| import { CoreWindow } from '@singletons/window'; | import { CoreWindow } from '@singletons/window'; | ||||||
| @ -36,6 +36,7 @@ import { FrameElement } from '@classes/element-controllers/FrameElementControlle | |||||||
| import { CoreMimetypeUtils } from './mimetype'; | import { CoreMimetypeUtils } from './mimetype'; | ||||||
| import { CoreFilepool } from '@services/filepool'; | import { CoreFilepool } from '@services/filepool'; | ||||||
| import { CoreSite } from '@classes/sites/site'; | import { CoreSite } from '@classes/sites/site'; | ||||||
|  | import { CoreNative } from '@features/native/services/native'; | ||||||
| 
 | 
 | ||||||
| type CoreFrameElement = FrameElement & { | type CoreFrameElement = FrameElement & { | ||||||
|     window?: Window; |     window?: Window; | ||||||
| @ -627,7 +628,7 @@ export class CoreIframeUtilsProvider { | |||||||
|                 { |                 { | ||||||
|                     text: Translate.instant('core.opensettings'), |                     text: Translate.instant('core.opensettings'), | ||||||
|                     handler: (): void => { |                     handler: (): void => { | ||||||
|                         Diagnostic.switchToSettings(); |                         CoreNative.plugin('diagnostic')?.switchToSettings(); | ||||||
|                     }, |                     }, | ||||||
|                 }, |                 }, | ||||||
|             ], |             ], | ||||||
|  | |||||||
| @ -40,7 +40,6 @@ import { | |||||||
| import { Badge as BadgeService } from '@awesome-cordova-plugins/badge/ngx'; | import { Badge as BadgeService } from '@awesome-cordova-plugins/badge/ngx'; | ||||||
| import { Camera as CameraService } from '@awesome-cordova-plugins/camera/ngx'; | import { Camera as CameraService } from '@awesome-cordova-plugins/camera/ngx'; | ||||||
| import { Clipboard as ClipboardService } from '@awesome-cordova-plugins/clipboard/ngx'; | import { Clipboard as ClipboardService } from '@awesome-cordova-plugins/clipboard/ngx'; | ||||||
| import { Diagnostic as DiagnosticService } from '@awesome-cordova-plugins/diagnostic/ngx'; |  | ||||||
| import { Device as DeviceService } from '@awesome-cordova-plugins/device/ngx'; | import { Device as DeviceService } from '@awesome-cordova-plugins/device/ngx'; | ||||||
| import { File as FileService } from '@awesome-cordova-plugins/file/ngx'; | import { File as FileService } from '@awesome-cordova-plugins/file/ngx'; | ||||||
| import { FileOpener as FileOpenerService } from '@awesome-cordova-plugins/file-opener/ngx'; | import { FileOpener as FileOpenerService } from '@awesome-cordova-plugins/file-opener/ngx'; | ||||||
| @ -171,7 +170,6 @@ export function makeSingleton<Service extends object = object>( | |||||||
| // Convert ionic-native services to singleton.
 | // Convert ionic-native services to singleton.
 | ||||||
| export const Badge = makeSingleton(BadgeService); | export const Badge = makeSingleton(BadgeService); | ||||||
| export const Clipboard = makeSingleton(ClipboardService); | export const Clipboard = makeSingleton(ClipboardService); | ||||||
| export const Diagnostic = makeSingleton(DiagnosticService); |  | ||||||
| export const File = makeSingleton(FileService); | export const File = makeSingleton(FileService); | ||||||
| export const FileOpener = makeSingleton(FileOpenerService); | export const FileOpener = makeSingleton(FileOpenerService); | ||||||
| export const Geolocation = makeSingleton(GeolocationService); | export const Geolocation = makeSingleton(GeolocationService); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user