Merge pull request #3412 from dpalou/MOBILE-4153
MOBILE-4153 scorm: Support links to player.php
This commit is contained in:
		
						commit
						6e23451b4f
					
				@ -13,7 +13,7 @@
 | 
				
			|||||||
// limitations under the License.
 | 
					// limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { CoreConstants } from '@/core/constants';
 | 
					import { CoreConstants } from '@/core/constants';
 | 
				
			||||||
import { Component, OnInit, Optional } from '@angular/core';
 | 
					import { Component, Input, OnInit, Optional } from '@angular/core';
 | 
				
			||||||
import { CoreCourseModuleMainActivityComponent } from '@features/course/classes/main-activity-component';
 | 
					import { CoreCourseModuleMainActivityComponent } from '@features/course/classes/main-activity-component';
 | 
				
			||||||
import { CoreCourseContentsPage } from '@features/course/pages/contents/contents';
 | 
					import { CoreCourseContentsPage } from '@features/course/pages/contents/contents';
 | 
				
			||||||
import { CoreCourse } from '@features/course/services/course';
 | 
					import { CoreCourse } from '@features/course/services/course';
 | 
				
			||||||
@ -53,6 +53,8 @@ import {
 | 
				
			|||||||
})
 | 
					})
 | 
				
			||||||
export class AddonModScormIndexComponent extends CoreCourseModuleMainActivityComponent implements OnInit {
 | 
					export class AddonModScormIndexComponent extends CoreCourseModuleMainActivityComponent implements OnInit {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Input() autoPlayData?: AddonModScormAutoPlayData; // Data to use to play the SCORM automatically.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    component = AddonModScormProvider.COMPONENT;
 | 
					    component = AddonModScormProvider.COMPONENT;
 | 
				
			||||||
    moduleName = 'scorm';
 | 
					    moduleName = 'scorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -189,11 +191,16 @@ export class AddonModScormIndexComponent extends CoreCourseModuleMainActivityCom
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        // Check whether to launch the SCORM immediately.
 | 
					        // Check whether to launch the SCORM immediately.
 | 
				
			||||||
        if (this.skip === undefined) {
 | 
					        if (this.skip === undefined) {
 | 
				
			||||||
            this.skip = !this.hasOffline && !this.errorMessage &&
 | 
					            this.skip = !this.hasOffline && !this.errorMessage && (!this.scorm.lastattemptlock || this.attemptsLeft > 0) &&
 | 
				
			||||||
                    (!this.scorm.lastattemptlock || this.attemptsLeft > 0) &&
 | 
					                (
 | 
				
			||||||
 | 
					                    !!this.autoPlayData
 | 
				
			||||||
 | 
					                    ||
 | 
				
			||||||
 | 
					                    (
 | 
				
			||||||
                        this.accessInfo.canskipview && !this.accessInfo.canviewreport &&
 | 
					                        this.accessInfo.canskipview && !this.accessInfo.canviewreport &&
 | 
				
			||||||
                    this.scorm.skipview! >= AddonModScormProvider.SKIPVIEW_FIRST &&
 | 
					                        (this.scorm.skipview ?? 0) >= AddonModScormProvider.SKIPVIEW_FIRST &&
 | 
				
			||||||
                    (this.scorm.skipview == AddonModScormProvider.SKIPVIEW_ALWAYS || this.lastAttempt == 0);
 | 
					                        (this.scorm.skipview == AddonModScormProvider.SKIPVIEW_ALWAYS || this.lastAttempt == 0)
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -533,7 +540,9 @@ export class AddonModScormIndexComponent extends CoreCourseModuleMainActivityCom
 | 
				
			|||||||
     * @param scoId SCO ID.
 | 
					     * @param scoId SCO ID.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    protected openScorm(scoId?: number, preview: boolean = false): void {
 | 
					    protected openScorm(scoId?: number, preview: boolean = false): void {
 | 
				
			||||||
        // Display the full page when returning to the page.
 | 
					        const autoPlayData = this.autoPlayData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.autoPlayData = undefined;
 | 
				
			||||||
        this.skip = false;
 | 
					        this.skip = false;
 | 
				
			||||||
        this.hasPlayed = true;
 | 
					        this.hasPlayed = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -555,11 +564,11 @@ export class AddonModScormIndexComponent extends CoreCourseModuleMainActivityCom
 | 
				
			|||||||
            `${AddonModScormModuleHandlerService.PAGE_NAME}/${this.courseId}/${this.module.id}/player`,
 | 
					            `${AddonModScormModuleHandlerService.PAGE_NAME}/${this.courseId}/${this.module.id}/player`,
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                params: {
 | 
					                params: {
 | 
				
			||||||
                    mode: preview ? AddonModScormProvider.MODEBROWSE : AddonModScormProvider.MODENORMAL,
 | 
					                    mode: autoPlayData?.mode ?? (preview ? AddonModScormProvider.MODEBROWSE : AddonModScormProvider.MODENORMAL),
 | 
				
			||||||
                    moduleUrl: this.module.url,
 | 
					                    moduleUrl: this.module.url,
 | 
				
			||||||
                    newAttempt: !!this.startNewAttempt,
 | 
					                    newAttempt: autoPlayData?.newAttempt ?? this.startNewAttempt,
 | 
				
			||||||
                    organizationId: this.currentOrganization.identifier,
 | 
					                    organizationId: autoPlayData?.organizationId ?? this.currentOrganization.identifier,
 | 
				
			||||||
                    scoId: scoId,
 | 
					                    scoId: autoPlayData?.scoId ?? scoId,
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
@ -621,3 +630,13 @@ export class AddonModScormIndexComponent extends CoreCourseModuleMainActivityCom
 | 
				
			|||||||
export type AttemptGrade = AddonModScormAttemptGrade & {
 | 
					export type AttemptGrade = AddonModScormAttemptGrade & {
 | 
				
			||||||
    gradeFormatted?: string;
 | 
					    gradeFormatted?: string;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Data to use to auto-play the SCORM.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export type AddonModScormAutoPlayData = {
 | 
				
			||||||
 | 
					    mode?: string;
 | 
				
			||||||
 | 
					    newAttempt?: boolean;
 | 
				
			||||||
 | 
					    organizationId?: string;
 | 
				
			||||||
 | 
					    scoId?: number;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -19,6 +19,6 @@
 | 
				
			|||||||
        <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
 | 
					        <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
 | 
				
			||||||
    </ion-refresher>
 | 
					    </ion-refresher>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <addon-mod-scorm-index [module]="module" [courseId]="courseId" (dataRetrieved)="updateData($event)">
 | 
					    <addon-mod-scorm-index [module]="module" [courseId]="courseId" [autoPlayData]="autoPlayData" (dataRetrieved)="updateData($event)">
 | 
				
			||||||
    </addon-mod-scorm-index>
 | 
					    </addon-mod-scorm-index>
 | 
				
			||||||
</ion-content>
 | 
					</ion-content>
 | 
				
			||||||
 | 
				
			|||||||
@ -14,7 +14,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import { Component, OnInit, ViewChild } from '@angular/core';
 | 
					import { Component, OnInit, ViewChild } from '@angular/core';
 | 
				
			||||||
import { CoreCourseModuleMainActivityPage } from '@features/course/classes/main-activity-page';
 | 
					import { CoreCourseModuleMainActivityPage } from '@features/course/classes/main-activity-page';
 | 
				
			||||||
import { AddonModScormIndexComponent } from '../../components/index/index';
 | 
					import { CoreNavigator } from '@services/navigator';
 | 
				
			||||||
 | 
					import { AddonModScormAutoPlayData, AddonModScormIndexComponent } from '../../components/index/index';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Page that displays the scorm entry page.
 | 
					 * Page that displays the scorm entry page.
 | 
				
			||||||
@ -27,4 +28,22 @@ export class AddonModScormIndexPage extends CoreCourseModuleMainActivityPage<Add
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @ViewChild(AddonModScormIndexComponent) activityComponent?: AddonModScormIndexComponent;
 | 
					    @ViewChild(AddonModScormIndexComponent) activityComponent?: AddonModScormIndexComponent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    autoPlayData?: AddonModScormAutoPlayData; // Data to auto-play the SCORM.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @inheritdoc
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    ngOnInit(): void {
 | 
				
			||||||
 | 
					        super.ngOnInit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (CoreNavigator.getRouteBooleanParam('autoPlay')) {
 | 
				
			||||||
 | 
					            this.autoPlayData = {
 | 
				
			||||||
 | 
					                mode: CoreNavigator.getRouteParam('mode'),
 | 
				
			||||||
 | 
					                newAttempt: CoreNavigator.getRouteBooleanParam('newAttempt'),
 | 
				
			||||||
 | 
					                organizationId: CoreNavigator.getRouteParam('organizationId'),
 | 
				
			||||||
 | 
					                scoId: CoreNavigator.getRouteNumberParam('scoId'),
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -27,6 +27,7 @@ import { AddonModScormGradeLinkHandler } from './services/handlers/grade-link';
 | 
				
			|||||||
import { AddonModScormIndexLinkHandler } from './services/handlers/index-link';
 | 
					import { AddonModScormIndexLinkHandler } from './services/handlers/index-link';
 | 
				
			||||||
import { AddonModScormListLinkHandler } from './services/handlers/list-link';
 | 
					import { AddonModScormListLinkHandler } from './services/handlers/list-link';
 | 
				
			||||||
import { AddonModScormModuleHandler, AddonModScormModuleHandlerService } from './services/handlers/module';
 | 
					import { AddonModScormModuleHandler, AddonModScormModuleHandlerService } from './services/handlers/module';
 | 
				
			||||||
 | 
					import { AddonModScormPlayerLinkHandler } from './services/handlers/player-link';
 | 
				
			||||||
import { AddonModScormPluginFileHandler } from './services/handlers/pluginfile';
 | 
					import { AddonModScormPluginFileHandler } from './services/handlers/pluginfile';
 | 
				
			||||||
import { AddonModScormPrefetchHandler } from './services/handlers/prefetch';
 | 
					import { AddonModScormPrefetchHandler } from './services/handlers/prefetch';
 | 
				
			||||||
import { AddonModScormSyncCronHandler } from './services/handlers/sync-cron';
 | 
					import { AddonModScormSyncCronHandler } from './services/handlers/sync-cron';
 | 
				
			||||||
@ -70,6 +71,7 @@ const routes: Routes = [
 | 
				
			|||||||
                CoreContentLinksDelegate.registerHandler(AddonModScormGradeLinkHandler.instance);
 | 
					                CoreContentLinksDelegate.registerHandler(AddonModScormGradeLinkHandler.instance);
 | 
				
			||||||
                CoreContentLinksDelegate.registerHandler(AddonModScormIndexLinkHandler.instance);
 | 
					                CoreContentLinksDelegate.registerHandler(AddonModScormIndexLinkHandler.instance);
 | 
				
			||||||
                CoreContentLinksDelegate.registerHandler(AddonModScormListLinkHandler.instance);
 | 
					                CoreContentLinksDelegate.registerHandler(AddonModScormListLinkHandler.instance);
 | 
				
			||||||
 | 
					                CoreContentLinksDelegate.registerHandler(AddonModScormPlayerLinkHandler.instance);
 | 
				
			||||||
                CorePluginFileDelegate.registerHandler(AddonModScormPluginFileHandler.instance);
 | 
					                CorePluginFileDelegate.registerHandler(AddonModScormPluginFileHandler.instance);
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										84
									
								
								src/addons/mod/scorm/services/handlers/player-link.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								src/addons/mod/scorm/services/handlers/player-link.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,84 @@
 | 
				
			|||||||
 | 
					// (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 { CoreContentLinksHandlerBase } from '@features/contentlinks/classes/base-handler';
 | 
				
			||||||
 | 
					import { CoreContentLinksAction } from '@features/contentlinks/services/contentlinks-delegate';
 | 
				
			||||||
 | 
					import { CoreCourseHelper } from '@features/course/services/course-helper';
 | 
				
			||||||
 | 
					import { CoreNavigationOptions } from '@services/navigator';
 | 
				
			||||||
 | 
					import { makeSingleton } from '@singletons';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Handler to treat links to SCORM player.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@Injectable({ providedIn: 'root' })
 | 
				
			||||||
 | 
					export class AddonModScormPlayerLinkHandlerService extends CoreContentLinksHandlerBase {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    name = 'AddonModScormPlayerLinkHandler';
 | 
				
			||||||
 | 
					    featureName = 'CoreCourseModuleDelegate_AddonModScorm';
 | 
				
			||||||
 | 
					    pattern = /\/mod\/scorm\/player\.php.*([?&](id|a)=\d+)/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @inheritdoc
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    getActions(siteIds: string[], url: string, params: Record<string, string>, courseId?: number): CoreContentLinksAction[] {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return [{
 | 
				
			||||||
 | 
					            action: async (siteId) => {
 | 
				
			||||||
 | 
					                const cmId = Number(params.id);
 | 
				
			||||||
 | 
					                const instanceId = Number(params.a);
 | 
				
			||||||
 | 
					                courseId = Number(courseId || params.courseid || params.cid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (!cmId && !instanceId) {
 | 
				
			||||||
 | 
					                    // Shouldn't happen, the regex should handle this.
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                const navOptions: CoreNavigationOptions = {
 | 
				
			||||||
 | 
					                    params: {
 | 
				
			||||||
 | 
					                        autoPlay: true,
 | 
				
			||||||
 | 
					                        mode: params.mode || undefined,
 | 
				
			||||||
 | 
					                        newAttempt: params.newattempt === 'on',
 | 
				
			||||||
 | 
					                        organizationId: params.currentorg,
 | 
				
			||||||
 | 
					                        scoId: Number(params.scoid) || undefined,
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (cmId) {
 | 
				
			||||||
 | 
					                    CoreCourseHelper.navigateToModule(
 | 
				
			||||||
 | 
					                        cmId,
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            courseId,
 | 
				
			||||||
 | 
					                            modNavOptions: navOptions,
 | 
				
			||||||
 | 
					                            siteId,
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    CoreCourseHelper.navigateToModuleByInstance(
 | 
				
			||||||
 | 
					                        instanceId,
 | 
				
			||||||
 | 
					                        'scorm',
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            courseId,
 | 
				
			||||||
 | 
					                            modNavOptions: navOptions,
 | 
				
			||||||
 | 
					                            siteId,
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        }];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const AddonModScormPlayerLinkHandler = makeSingleton(AddonModScormPlayerLinkHandlerService);
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user