forked from CIT/Vmeda.Online
		
	MOBILE-3432 files: File type exclusion list for mobile
This commit is contained in:
		
							parent
							
								
									59d4e189c8
								
							
						
					
					
						commit
						b8daa1dc1b
					
				| @ -1373,6 +1373,7 @@ | ||||
|   "core.cannotconnecttrouble": "local_moodlemobileapp", | ||||
|   "core.cannotconnectverify": "local_moodlemobileapp", | ||||
|   "core.cannotdownloadfiles": "local_moodlemobileapp", | ||||
|   "core.cannotopeninapp": "moodle", | ||||
|   "core.captureaudio": "local_moodlemobileapp", | ||||
|   "core.capturedimage": "local_moodlemobileapp", | ||||
|   "core.captureimage": "local_moodlemobileapp", | ||||
| @ -1916,6 +1917,7 @@ | ||||
|   "core.offline": "message", | ||||
|   "core.ok": "moodle", | ||||
|   "core.online": "message", | ||||
|   "core.openfile": "moodle", | ||||
|   "core.openfullimage": "local_moodlemobileapp", | ||||
|   "core.openinbrowser": "local_moodlemobileapp", | ||||
|   "core.openmodinbrowser": "local_moodlemobileapp", | ||||
|  | ||||
| @ -183,7 +183,19 @@ export class AddonModResourceHelperProvider { | ||||
|      * @param courseId Course Id, used for completion purposes. | ||||
|      * @return Resolved when done. | ||||
|      */ | ||||
|     openModuleFile(module: any, courseId: number): Promise<any> { | ||||
|     async openModuleFile(module: any, courseId: number): Promise<any> { | ||||
|         // Check whether the file type excluded to open in app.
 | ||||
|         if (!module.contents.length) { | ||||
|             await this.courseProvider.loadModuleContents(module, courseId); | ||||
|         } | ||||
| 
 | ||||
|         if (!this.fileHelper.isOpenableInApp(module.contents[0])) { | ||||
|             const confirmed = await this.fileHelper.showConfirmOpenUnsupportedFile(); | ||||
|             if (!confirmed) { | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         const modal = this.domUtils.showModalLoading(); | ||||
| 
 | ||||
|         // Download and open the file from the resource contents.
 | ||||
|  | ||||
| @ -1373,6 +1373,7 @@ | ||||
|     "core.cannotconnecttrouble": "We're having trouble connecting to your site.", | ||||
|     "core.cannotconnectverify": "<strong>Please check the address is correct.</strong>", | ||||
|     "core.cannotdownloadfiles": "File downloading is disabled. Please contact your site administrator.", | ||||
|     "core.cannotopeninapp": "This file may not work as expected on this device. Would you like to open it anyway?", | ||||
|     "core.captureaudio": "Record audio", | ||||
|     "core.capturedimage": "Taken picture.", | ||||
|     "core.captureimage": "Take picture", | ||||
| @ -1916,6 +1917,7 @@ | ||||
|     "core.offline": "Offline", | ||||
|     "core.ok": "OK", | ||||
|     "core.online": "Online", | ||||
|     "core.openfile": "Open file", | ||||
|     "core.openfullimage": "Click here to display the full size image", | ||||
|     "core.openinbrowser": "Open in browser", | ||||
|     "core.openmodinbrowser": "Open {{$a}} in browser", | ||||
|  | ||||
| @ -148,7 +148,7 @@ export class CoreFileComponent implements OnInit, OnDestroy { | ||||
|      * @param e Click event. | ||||
|      * @param openAfterDownload Whether the file should be opened after download. | ||||
|      */ | ||||
|     download(e?: Event, openAfterDownload: boolean = false): void { | ||||
|     async download(e?: Event, openAfterDownload: boolean = false): Promise<void> { | ||||
|         e && e.preventDefault(); | ||||
|         e && e.stopPropagation(); | ||||
| 
 | ||||
| @ -156,6 +156,13 @@ export class CoreFileComponent implements OnInit, OnDestroy { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         if (!this.fileHelper.isOpenableInApp(this.file)) { | ||||
|             const confirmed = await this.fileHelper.showConfirmOpenUnsupportedFile(); | ||||
|             if (!confirmed) { | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (!this.canDownload || !this.state || this.state == CoreConstants.NOT_DOWNLOADABLE) { | ||||
|             // File cannot be downloaded, just open it.
 | ||||
|             if (this.file.toURL) { | ||||
|  | ||||
| @ -16,6 +16,7 @@ | ||||
|     "cannotconnecttrouble": "We're having trouble connecting to your site.", | ||||
|     "cannotconnectverify": "<strong>Please check the address is correct.</strong>", | ||||
|     "cannotdownloadfiles": "File downloading is disabled. Please contact your site administrator.", | ||||
|     "cannotopeninapp": "This file may not work as expected on this device. Would you like to open it anyway?", | ||||
|     "captureaudio": "Record audio", | ||||
|     "capturedimage": "Taken picture.", | ||||
|     "captureimage": "Take picture", | ||||
| @ -200,6 +201,7 @@ | ||||
|     "offline": "Offline", | ||||
|     "ok": "OK", | ||||
|     "online": "Online", | ||||
|     "openfile": "Open file", | ||||
|     "openfullimage": "Click here to display the full size image", | ||||
|     "openinbrowser": "Open in browser", | ||||
|     "openmodinbrowser": "Open {{$a}} in browser", | ||||
|  | ||||
| @ -15,6 +15,7 @@ | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from './app'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreFileProvider } from './file'; | ||||
| import { CoreFilepoolProvider } from './filepool'; | ||||
| import { CoreSitesProvider } from './sites'; | ||||
| @ -30,7 +31,8 @@ import { makeSingleton } from '@singletons/core.singletons'; | ||||
| @Injectable() | ||||
| export class CoreFileHelperProvider { | ||||
| 
 | ||||
|     constructor(protected fileProvider: CoreFileProvider, | ||||
|     constructor(protected domUtils: CoreDomUtilsProvider, | ||||
|             protected fileProvider: CoreFileProvider, | ||||
|             protected filepoolProvider: CoreFilepoolProvider, | ||||
|             protected sitesProvider: CoreSitesProvider, | ||||
|             protected appProvider: CoreAppProvider, | ||||
| @ -339,6 +341,57 @@ export class CoreFileHelperProvider { | ||||
| 
 | ||||
|         throw new Error('Couldn\'t determine file size: ' + file.fileurl); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Is the file openable in app. | ||||
|      * | ||||
|      * @param file The file to check. | ||||
|      * @return bool. | ||||
|      */ | ||||
|     isOpenableInApp(file: any): boolean { | ||||
|         const re = /(?:\.([^.]+))?$/; | ||||
| 
 | ||||
|         const ext = re.exec(file.filename)[1]; | ||||
| 
 | ||||
|         return !this.isFileTypeExcludedInApp(ext); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Is the file openable in app. | ||||
|      * | ||||
|      * @param file The file to check. | ||||
|      * @return bool. | ||||
|      */ | ||||
|     async showConfirmOpenUnsupportedFile(): Promise<boolean> { | ||||
|         try { | ||||
|             await this.domUtils.showConfirm(this.translate.instant('core.cannotopeninapp'), undefined, | ||||
|                 this.translate.instant('core.openfile')); | ||||
| 
 | ||||
|             return true; | ||||
|         } | ||||
|         catch (e) { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Is the file type excluded to open in app. | ||||
|      * | ||||
|      * @param file The file to check. | ||||
|      * @return bool. | ||||
|      */ | ||||
|     isFileTypeExcludedInApp(fileType: string): boolean { | ||||
|         const currentSite = this.sitesProvider.getCurrentSite(); | ||||
|         const fileTypeExcludeList = currentSite && currentSite.getStoredConfig('tool_mobile_filetypeexclusionlist'); | ||||
| 
 | ||||
|         if (!fileTypeExcludeList) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         const regEx = new RegExp('(,|^)' + fileType + '(,|$)', 'g'); | ||||
| 
 | ||||
|         return !!fileTypeExcludeList.match(regEx); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| export class CoreFileHelper extends makeSingleton(CoreFileHelperProvider) {} | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user