diff --git a/src/addon/mod/lesson/pages/player/player.ts b/src/addon/mod/lesson/pages/player/player.ts index ab32eb9d6..a19c4e48f 100644 --- a/src/addon/mod/lesson/pages/player/player.ts +++ b/src/addon/mod/lesson/pages/player/player.ts @@ -25,6 +25,7 @@ import { CoreDomUtilsProvider } from '@providers/utils/dom'; import { CoreTimeUtilsProvider } from '@providers/utils/time'; import { CoreUrlUtilsProvider } from '@providers/utils/url'; import { CoreUtilsProvider } from '@providers/utils/utils'; +import { MoodleMobileApp } from '../../../../../app/app.component'; import { AddonModLessonProvider } from '../../providers/lesson'; import { AddonModLessonOfflineProvider } from '../../providers/lesson-offline'; import { AddonModLessonSyncProvider } from '../../providers/lesson-sync'; @@ -85,7 +86,8 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy { protected lessonHelper: AddonModLessonHelperProvider, protected lessonSync: AddonModLessonSyncProvider, protected lessonOfflineProvider: AddonModLessonOfflineProvider, protected cdr: ChangeDetectorRef, modalCtrl: ModalController, protected navCtrl: NavController, protected appProvider: CoreAppProvider, - protected utils: CoreUtilsProvider, protected urlUtils: CoreUrlUtilsProvider, protected fb: FormBuilder) { + protected utils: CoreUtilsProvider, protected urlUtils: CoreUrlUtilsProvider, protected fb: FormBuilder, + protected mmApp: MoodleMobileApp) { this.lessonId = navParams.get('lessonId'); this.courseId = navParams.get('courseId'); @@ -145,6 +147,13 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy { return Promise.resolve(); } + /** + * Runs when the page is about to leave and no longer be the active page. + */ + ionViewWillLeave(): void { + this.mmApp.closeModal(); + } + /** * A button was clicked. * diff --git a/src/addon/mod/quiz/pages/player/player.ts b/src/addon/mod/quiz/pages/player/player.ts index 75da900d8..af65f378a 100644 --- a/src/addon/mod/quiz/pages/player/player.ts +++ b/src/addon/mod/quiz/pages/player/player.ts @@ -23,6 +23,7 @@ import { CoreDomUtilsProvider } from '@providers/utils/dom'; import { CoreTimeUtilsProvider } from '@providers/utils/time'; import { CoreQuestionHelperProvider } from '@core/question/providers/helper'; import { CoreQuestionComponent } from '@core/question/components/question/question'; +import { MoodleMobileApp } from '../../../../../app/app.component'; import { AddonModQuizProvider } from '../../providers/quiz'; import { AddonModQuizSyncProvider } from '../../providers/quiz-sync'; import { AddonModQuizHelperProvider } from '../../providers/helper'; @@ -80,7 +81,7 @@ export class AddonModQuizPlayerPage implements OnInit, OnDestroy { protected timeUtils: CoreTimeUtilsProvider, protected quizProvider: AddonModQuizProvider, protected quizHelper: AddonModQuizHelperProvider, protected quizSync: AddonModQuizSyncProvider, protected questionHelper: CoreQuestionHelperProvider, protected cdr: ChangeDetectorRef, - modalCtrl: ModalController, protected navCtrl: NavController) { + modalCtrl: ModalController, protected navCtrl: NavController, protected mmApp: MoodleMobileApp) { this.quizId = navParams.get('quizId'); this.courseId = navParams.get('courseId'); @@ -157,6 +158,13 @@ export class AddonModQuizPlayerPage implements OnInit, OnDestroy { return Promise.resolve(); } + /** + * Runs when the page is about to leave and no longer be the active page. + */ + ionViewWillLeave(): void { + this.mmApp.closeModal(); + } + /** * Abort the quiz. */ diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 96c56a18a..7df4951b2 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -38,10 +38,10 @@ export class MoodleMobileApp implements OnInit { protected lastUrls = {}; protected lastInAppUrl: string; - constructor(private platform: Platform, logger: CoreLoggerProvider, keyboard: Keyboard, + constructor(private platform: Platform, logger: CoreLoggerProvider, keyboard: Keyboard, private app: IonicApp, private eventsProvider: CoreEventsProvider, private loginHelper: CoreLoginHelperProvider, private zone: NgZone, private appProvider: CoreAppProvider, private langProvider: CoreLangProvider, private sitesProvider: CoreSitesProvider, - private screenOrientation: ScreenOrientation, app: IonicApp, private urlSchemesProvider: CoreCustomURLSchemesProvider, + private screenOrientation: ScreenOrientation, private urlSchemesProvider: CoreCustomURLSchemesProvider, private utils: CoreUtilsProvider, private urlUtils: CoreUrlUtilsProvider) { this.logger = logger.getInstance('AppComponent'); @@ -68,15 +68,7 @@ export class MoodleMobileApp implements OnInit { // Register back button action to allow closing modals before anything else. this.appProvider.registerBackButtonAction(() => { - // Following function is hidden in Ionic Code, however there's no solution for that. - const portal = app._getActivePortal(); - if (portal) { - portal.pop(); - - return true; - } - - return false; + return this.closeModal(); }, 2000); }); @@ -302,4 +294,21 @@ export class MoodleMobileApp implements OnInit { document.body.classList.remove(tempClass); }); } + + /** + * Close one modal if any. + * + * @return {boolean} True if one modal was present. + */ + closeModal(): boolean { + // Following function is hidden in Ionic Code, however there's no solution for that. + const portal = this.app._getActivePortal(); + if (portal) { + portal.pop(); + + return true; + } + + return false; + } } diff --git a/src/components/rich-text-editor/rich-text-editor.ts b/src/components/rich-text-editor/rich-text-editor.ts index 08bf278b3..e9c8bc2b5 100644 --- a/src/components/rich-text-editor/rich-text-editor.ts +++ b/src/components/rich-text-editor/rich-text-editor.ts @@ -585,6 +585,7 @@ export class CoreRichTextEditorComponent implements AfterContentInit, OnDestroy const currentIndex = this.toolbarSlides.getActiveIndex() || 0; this.toolbarSlides.slideTo(currentIndex + this.numToolbarButtons); } + this.updateToolbarArrows(); } /** @@ -597,6 +598,7 @@ export class CoreRichTextEditorComponent implements AfterContentInit, OnDestroy const currentIndex = this.toolbarSlides.getActiveIndex() || 0; this.toolbarSlides.slideTo(currentIndex - this.numToolbarButtons); } + this.updateToolbarArrows(); } /** diff --git a/src/components/split-view/split-view.ts b/src/components/split-view/split-view.ts index 3e26f6e86..ca807f10d 100644 --- a/src/components/split-view/split-view.ts +++ b/src/components/split-view/split-view.ts @@ -60,6 +60,7 @@ export class CoreSplitViewComponent implements OnInit, OnDestroy { protected ignoreSplitChanged = false; protected audioCaptureSubscription: Subscription; protected languageChangedSubscription: Subscription; + protected pushOngoing: boolean; // Empty placeholder for the 'detail' page. detailPage: any = null; @@ -185,20 +186,29 @@ export class CoreSplitViewComponent implements OnInit, OnDestroy { * @param {boolean} [retrying] Whether it's retrying. */ push(page: any, params?: any, retrying?: boolean): void { - if (typeof this.isEnabled == 'undefined' && !retrying) { - // Hasn't calculated if it's enabled yet. Wait a bit and try again. - setTimeout(() => { - this.push(page, params, true); - }, 200); - } else { - if (this.isEnabled) { - this.detailNav.setRoot(page, params); + // Check there's no ongoing push. + if (!this.pushOngoing) { + if (typeof this.isEnabled == 'undefined' && !retrying) { + // Hasn't calculated if it's enabled yet. Wait a bit and try again. + setTimeout(() => { + this.push(page, params, true); + }, 200); } else { - this.loadDetailPage = { - component: page, - data: params - }; - this.masterNav.push(page, params); + this.pushOngoing = true; + let promise; + + if (this.isEnabled) { + promise = this.detailNav.setRoot(page, params); + } else { + this.loadDetailPage = { + component: page, + data: params + }; + promise = this.masterNav.push(page, params); + } + promise.finally(() => { + this.pushOngoing = false; + }); } } }