MOBILE-3708 settings: Upgrade from font size to zoom levels
parent
95b6456388
commit
5c51af9f1b
|
@ -71,11 +71,11 @@
|
||||||
"password": "moodle"
|
"password": "moodle"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"font_sizes": [
|
"zoomlevels": {
|
||||||
100,
|
"normal": 100,
|
||||||
110,
|
"low": 110,
|
||||||
120
|
"high": 120
|
||||||
],
|
},
|
||||||
"customurlscheme": "moodlemobile",
|
"customurlscheme": "moodlemobile",
|
||||||
"siteurl": "",
|
"siteurl": "",
|
||||||
"sitename": "",
|
"sitename": "",
|
||||||
|
|
|
@ -28,9 +28,8 @@ import { IonSlides } from '@ionic/angular';
|
||||||
import { Subscription } from 'rxjs';
|
import { Subscription } from 'rxjs';
|
||||||
|
|
||||||
import { CoreApp } from '@services/app';
|
import { CoreApp } from '@services/app';
|
||||||
import { CoreConfig } from '@services/config';
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
|
||||||
import { Platform, Translate } from '@singletons';
|
import { Platform, Translate } from '@singletons';
|
||||||
|
import { CoreSettingsHelper } from '@features/settings/services/settings-helper';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class to abstract some common code for tabs.
|
* Class to abstract some common code for tabs.
|
||||||
|
@ -373,9 +372,9 @@ export class CoreTabsBaseComponent<T extends CoreTabBase> implements OnInit, Aft
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const fontSize = await CoreConfig.get(CoreConstants.SETTINGS_FONT_SIZE, CoreConstants.CONFIG.font_sizes[0]);
|
const zoomLevel = await CoreSettingsHelper.getZoom();
|
||||||
|
|
||||||
this.maxSlides = Math.floor(width / (fontSize / CoreConstants.CONFIG.font_sizes[0] * CoreTabsBaseComponent.MIN_TAB_WIDTH));
|
this.maxSlides = Math.floor(width / (zoomLevel / 100 * CoreTabsBaseComponent.MIN_TAB_WIDTH));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
/* eslint-disable @typescript-eslint/naming-convention */
|
/* eslint-disable @typescript-eslint/naming-convention */
|
||||||
|
|
||||||
import { CoreColorScheme } from '@features/settings/services/settings-helper';
|
import { CoreColorScheme, CoreZoomLevel } from '@features/settings/services/settings-helper';
|
||||||
import { CoreSitesDemoSiteData } from '@services/sites';
|
import { CoreSitesDemoSiteData } from '@services/sites';
|
||||||
import envJson from '@/assets/env.json';
|
import envJson from '@/assets/env.json';
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ export class CoreConstants {
|
||||||
static readonly SETTINGS_DEBUG_DISPLAY = 'CoreSettingsDebugDisplay';
|
static readonly SETTINGS_DEBUG_DISPLAY = 'CoreSettingsDebugDisplay';
|
||||||
static readonly SETTINGS_REPORT_IN_BACKGROUND = 'CoreSettingsReportInBackground'; // @deprecated since 3.5.0
|
static readonly SETTINGS_REPORT_IN_BACKGROUND = 'CoreSettingsReportInBackground'; // @deprecated since 3.5.0
|
||||||
static readonly SETTINGS_SEND_ON_ENTER = 'CoreSettingsSendOnEnter';
|
static readonly SETTINGS_SEND_ON_ENTER = 'CoreSettingsSendOnEnter';
|
||||||
static readonly SETTINGS_FONT_SIZE = 'CoreSettingsFontSize';
|
static readonly SETTINGS_ZOOM_LEVEL = 'CoreSettingsZoomLevel';
|
||||||
static readonly SETTINGS_COLOR_SCHEME = 'CoreSettingsColorScheme';
|
static readonly SETTINGS_COLOR_SCHEME = 'CoreSettingsColorScheme';
|
||||||
static readonly SETTINGS_ANALYTICS_ENABLED = 'CoreSettingsAnalyticsEnabled';
|
static readonly SETTINGS_ANALYTICS_ENABLED = 'CoreSettingsAnalyticsEnabled';
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ type EnvironmentConfig = {
|
||||||
wsservice: string;
|
wsservice: string;
|
||||||
wsextservice: string;
|
wsextservice: string;
|
||||||
demo_sites: Record<string, CoreSitesDemoSiteData>;
|
demo_sites: Record<string, CoreSitesDemoSiteData>;
|
||||||
font_sizes: number[];
|
zoomlevels: Record<CoreZoomLevel, number>;
|
||||||
customurlscheme: string;
|
customurlscheme: string;
|
||||||
siteurl: string;
|
siteurl: string;
|
||||||
sitename: string;
|
sitename: string;
|
||||||
|
|
|
@ -21,13 +21,13 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>{{ 'core.settings.fontsize' | translate }}</h2>
|
<h2>{{ 'core.settings.fontsize' | translate }}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-segment [(ngModel)]="selectedFontSize" (ionChange)="fontSizeChanged()" color="primary" item-content>
|
<ion-segment [(ngModel)]="selectedZoomLevel" (ionChange)="zoomLevelChanged()" color="primary" item-content>
|
||||||
<ion-segment-button *ngFor="let fontSize of fontSizes" [value]="fontSize.size"
|
<ion-segment-button *ngFor="let zoomLevel of zoomLevels" [value]="zoomLevel.value"
|
||||||
[ngStyle]="{'font-size.px': fontSize.style}">
|
[ngStyle]="{'font-size.px': zoomLevel.style}">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
{{ 'core.settings.fontsizecharacter' | translate }}
|
{{ 'core.settings.fontsizecharacter' | translate }}
|
||||||
<!-- Empty element styled with the largest font size, so all buttons share a common baseline. -->
|
<!-- Empty element styled with the largest font size, so all buttons share a common baseline. -->
|
||||||
<span [ngStyle]="{'font-size.px': fontSizes[fontSizes.length - 1].style}"></span>
|
<span [ngStyle]="{'font-size.px': zoomLevels[zoomLevels.length - 1].style}"></span>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-segment-button>
|
</ion-segment-button>
|
||||||
</ion-segment>
|
</ion-segment>
|
||||||
|
|
|
@ -19,7 +19,7 @@ import { CoreEvents } from '@singletons/events';
|
||||||
import { CoreLang } from '@services/lang';
|
import { CoreLang } from '@services/lang';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { CorePushNotifications } from '@features/pushnotifications/services/pushnotifications';
|
import { CorePushNotifications } from '@features/pushnotifications/services/pushnotifications';
|
||||||
import { CoreSettingsHelper, CoreColorScheme } from '../../services/settings-helper';
|
import { CoreSettingsHelper, CoreColorScheme, CoreZoomLevel } from '../../services/settings-helper';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Page that displays the general settings.
|
* Page that displays the general settings.
|
||||||
|
@ -33,8 +33,8 @@ export class CoreSettingsGeneralPage {
|
||||||
|
|
||||||
languages: { code: string; name: string }[] = [];
|
languages: { code: string; name: string }[] = [];
|
||||||
selectedLanguage = '';
|
selectedLanguage = '';
|
||||||
fontSizes: { size: number; style: number; selected: boolean }[] = [];
|
zoomLevels: { value: CoreZoomLevel; style: number; selected: boolean }[] = [];
|
||||||
selectedFontSize = 0;
|
selectedZoomLevel = CoreZoomLevel.NORMAL;
|
||||||
richTextEditor = true;
|
richTextEditor = true;
|
||||||
debugDisplay = false;
|
debugDisplay = false;
|
||||||
analyticsSupported = false;
|
analyticsSupported = false;
|
||||||
|
@ -84,17 +84,14 @@ export class CoreSettingsGeneralPage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.selectedFontSize = await CoreConfig.get(
|
this.selectedZoomLevel = await CoreSettingsHelper.getZoomLevel();
|
||||||
CoreConstants.SETTINGS_FONT_SIZE,
|
|
||||||
CoreConstants.CONFIG.font_sizes[0],
|
|
||||||
);
|
|
||||||
|
|
||||||
this.fontSizes = CoreConstants.CONFIG.font_sizes.map((size) =>
|
this.zoomLevels = Object.keys(CoreConstants.CONFIG.zoomlevels).map((value: CoreZoomLevel) =>
|
||||||
({
|
({
|
||||||
size,
|
value,
|
||||||
// Absolute pixel size based on 1.4rem body text when this size is selected.
|
// Absolute pixel size based on 1.4rem body text when this size is selected.
|
||||||
style: Math.round(size * 16 / 100),
|
style: Math.round(CoreConstants.CONFIG.zoomlevels[value] * 16 / 100),
|
||||||
selected: size === this.selectedFontSize,
|
selected: value === this.selectedZoomLevel,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
||||||
|
@ -118,17 +115,17 @@ export class CoreSettingsGeneralPage {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a new font size is selected.
|
* Called when a new zoom level is selected.
|
||||||
*/
|
*/
|
||||||
fontSizeChanged(): void {
|
zoomLevelChanged(): void {
|
||||||
this.fontSizes = this.fontSizes.map((fontSize) => {
|
this.zoomLevels = this.zoomLevels.map((fontSize) => {
|
||||||
fontSize.selected = fontSize.size === this.selectedFontSize;
|
fontSize.selected = fontSize.value === this.selectedZoomLevel;
|
||||||
|
|
||||||
return fontSize;
|
return fontSize;
|
||||||
});
|
});
|
||||||
|
|
||||||
CoreSettingsHelper.setFontSize(this.selectedFontSize);
|
CoreSettingsHelper.applyZoomLevel(this.selectedZoomLevel);
|
||||||
CoreConfig.set(CoreConstants.SETTINGS_FONT_SIZE, this.selectedFontSize);
|
CoreConfig.set(CoreConstants.SETTINGS_ZOOM_LEVEL, this.selectedZoomLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -45,6 +45,15 @@ export const enum CoreColorScheme {
|
||||||
DARK = 'dark',
|
DARK = 'dark',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constants to define zoom levels.
|
||||||
|
*/
|
||||||
|
export const enum CoreZoomLevel {
|
||||||
|
NORMAL = 'normal',
|
||||||
|
LOW = 'low',
|
||||||
|
HIGH = 'high',
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Settings helper service.
|
* Settings helper service.
|
||||||
*/
|
*/
|
||||||
|
@ -284,13 +293,64 @@ export class CoreSettingsHelperProvider {
|
||||||
throw new CoreError(Translate.instant('core.lostconnection'));
|
throw new CoreError(Translate.instant('core.lostconnection'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Upgrades from Font size to new zoom level.
|
||||||
|
*/
|
||||||
|
async upgradeZoomLevel(): Promise<void> {
|
||||||
|
// Check old setting and update the new.
|
||||||
|
try {
|
||||||
|
const fontSize = await CoreConfig.get<number>('CoreSettingsFontSize');
|
||||||
|
if (typeof fontSize == 'undefined') {
|
||||||
|
// Already upgraded.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset the value to solve edge cases.
|
||||||
|
CoreConfig.set(CoreConstants.SETTINGS_ZOOM_LEVEL, CoreZoomLevel.NORMAL);
|
||||||
|
|
||||||
|
if (fontSize < 100) {
|
||||||
|
if (fontSize > 90) {
|
||||||
|
CoreConfig.set(CoreConstants.SETTINGS_ZOOM_LEVEL, CoreZoomLevel.HIGH);
|
||||||
|
} else if (fontSize > 70) {
|
||||||
|
CoreConfig.set(CoreConstants.SETTINGS_ZOOM_LEVEL, CoreZoomLevel.LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CoreConfig.delete('CoreSettingsFontSize');
|
||||||
|
} catch {
|
||||||
|
// Already upgraded.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get saved Zoom Level setting.
|
||||||
|
*
|
||||||
|
* @return The saved zoom Level option.
|
||||||
|
*/
|
||||||
|
async getZoomLevel(): Promise<CoreZoomLevel> {
|
||||||
|
return CoreConfig.get(CoreConstants.SETTINGS_ZOOM_LEVEL, CoreZoomLevel.NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get saved zoom level value.
|
||||||
|
*
|
||||||
|
* @return The saved zoom level value in %.
|
||||||
|
*/
|
||||||
|
async getZoom(): Promise<number> {
|
||||||
|
const zoomLevel = await this.getZoomLevel();
|
||||||
|
|
||||||
|
return CoreConstants.CONFIG.zoomlevels[zoomLevel];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Init Settings related to DOM.
|
* Init Settings related to DOM.
|
||||||
*/
|
*/
|
||||||
async initDomSettings(): Promise<void> {
|
async initDomSettings(): Promise<void> {
|
||||||
// Set the font size based on user preference.
|
// Set the font size based on user preference.
|
||||||
const fontSize = await CoreConfig.get(CoreConstants.SETTINGS_FONT_SIZE, CoreConstants.CONFIG.font_sizes[0]);
|
const zoomLevel = await this.getZoomLevel();
|
||||||
this.setFontSize(fontSize);
|
|
||||||
|
this.applyZoomLevel(zoomLevel);
|
||||||
|
|
||||||
this.initColorScheme();
|
this.initColorScheme();
|
||||||
}
|
}
|
||||||
|
@ -334,11 +394,12 @@ export class CoreSettingsHelperProvider {
|
||||||
/**
|
/**
|
||||||
* Set document default font size.
|
* Set document default font size.
|
||||||
*
|
*
|
||||||
* @param fontSize Font size in percentage.
|
* @param zoomLevel Zoom Level.
|
||||||
*/
|
*/
|
||||||
setFontSize(fontSize: number): void {
|
applyZoomLevel(zoomLevel: CoreZoomLevel): void {
|
||||||
|
const zoom = CoreConstants.CONFIG.zoomlevels[zoomLevel];
|
||||||
// @todo Since zoom is deprecated and fontSize is not working, we should do some research here.
|
// @todo Since zoom is deprecated and fontSize is not working, we should do some research here.
|
||||||
document.documentElement.style.zoom = fontSize + '%';
|
document.documentElement.style.zoom = zoom + '%';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -48,7 +48,10 @@ const mainMenuMoreRoutes: Routes = [
|
||||||
provide: APP_INITIALIZER,
|
provide: APP_INITIALIZER,
|
||||||
multi: true,
|
multi: true,
|
||||||
deps: [CoreSettingsHelperProvider],
|
deps: [CoreSettingsHelperProvider],
|
||||||
useFactory: (helper: CoreSettingsHelperProvider) => () => helper.initDomSettings(),
|
useFactory: (helper: CoreSettingsHelperProvider) => async () => {
|
||||||
|
await helper.upgradeZoomLevel();
|
||||||
|
helper.initDomSettings();
|
||||||
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue