mirror of
https://gitlab.com/openstapps/openstapps.git
synced 2026-03-10 00:32:25 +00:00
feat: add permission check for geoLocation setting
This commit is contained in:
@@ -75,12 +75,18 @@
|
|||||||
<splash height="960" src="resources/ios/splash/Default@2x~iphone.png" width="640" />
|
<splash height="960" src="resources/ios/splash/Default@2x~iphone.png" width="640" />
|
||||||
<splash height="480" src="resources/ios/splash/Default~iphone.png" width="320" />
|
<splash height="480" src="resources/ios/splash/Default~iphone.png" width="320" />
|
||||||
<splash height="2732" src="resources/ios/splash/Default@2x~universal~anyany.png" width="2732" />
|
<splash height="2732" src="resources/ios/splash/Default@2x~universal~anyany.png" width="2732" />
|
||||||
|
<edit-config file="*-Info.plist" mode="merge" target="NSLocationWhenInUseUsageDescription">
|
||||||
|
<string>The app will use your location to provide features for navigation or distances information.</string>
|
||||||
|
</edit-config>
|
||||||
</platform>
|
</platform>
|
||||||
<plugin name="cordova-plugin-whitelist" spec="1.3.3" />
|
<plugin name="cordova-plugin-whitelist" spec="1.3.3" />
|
||||||
<plugin name="cordova-plugin-device" spec="2.0.2" />
|
<plugin name="cordova-plugin-device" spec="2.0.2" />
|
||||||
<plugin name="cordova-plugin-splashscreen" spec="5.0.2" />
|
<plugin name="cordova-plugin-splashscreen" spec="5.0.2" />
|
||||||
<plugin name="cordova-plugin-ionic-webview" spec="2.0.0" />
|
<plugin name="cordova-plugin-ionic-webview" spec="2.0.0" />
|
||||||
<plugin name="cordova-plugin-ionic-keyboard" spec="2.0.5" />
|
<plugin name="cordova-plugin-ionic-keyboard" spec="2.0.5" />
|
||||||
|
<plugin name="cordova-plugin-geolocation" spec="4.0.1">
|
||||||
|
<variable name="GEOLOCATION_USAGE_DESCRIPTION" value="The app will use your location to provide features for navigation or distances information." />
|
||||||
|
</plugin>
|
||||||
<engine name="ios" spec="4.5.5" />
|
<engine name="ios" spec="4.5.5" />
|
||||||
<engine name="browser" spec="5.0.4" />
|
<engine name="browser" spec="5.0.4" />
|
||||||
<engine name="android" spec="7.1.4" />
|
<engine name="android" spec="7.1.4" />
|
||||||
|
|||||||
550
package-lock.json
generated
550
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -31,6 +31,7 @@
|
|||||||
"@angular/platform-browser-dynamic": "6.1.10",
|
"@angular/platform-browser-dynamic": "6.1.10",
|
||||||
"@angular/router": "6.1.10",
|
"@angular/router": "6.1.10",
|
||||||
"@ionic-native/core": "5.0.0-beta.22",
|
"@ionic-native/core": "5.0.0-beta.22",
|
||||||
|
"@ionic-native/geolocation": "5.0.0-beta.22",
|
||||||
"@ionic-native/splash-screen": "5.0.0-beta.22",
|
"@ionic-native/splash-screen": "5.0.0-beta.22",
|
||||||
"@ionic-native/status-bar": "5.0.0-beta.22",
|
"@ionic-native/status-bar": "5.0.0-beta.22",
|
||||||
"@ionic/angular": "4.0.0-beta.13",
|
"@ionic/angular": "4.0.0-beta.13",
|
||||||
@@ -44,6 +45,7 @@
|
|||||||
"cordova-browser": "5.0.4",
|
"cordova-browser": "5.0.4",
|
||||||
"cordova-ios": "4.5.5",
|
"cordova-ios": "4.5.5",
|
||||||
"cordova-plugin-device": "2.0.2",
|
"cordova-plugin-device": "2.0.2",
|
||||||
|
"cordova-plugin-geolocation": "4.0.1",
|
||||||
"cordova-plugin-ionic-keyboard": "2.0.5",
|
"cordova-plugin-ionic-keyboard": "2.0.5",
|
||||||
"cordova-plugin-ionic-webview": "2.3.1",
|
"cordova-plugin-ionic-webview": "2.3.1",
|
||||||
"cordova-plugin-splashscreen": "5.0.2",
|
"cordova-plugin-splashscreen": "5.0.2",
|
||||||
@@ -87,7 +89,10 @@
|
|||||||
"cordova-plugin-device": {},
|
"cordova-plugin-device": {},
|
||||||
"cordova-plugin-splashscreen": {},
|
"cordova-plugin-splashscreen": {},
|
||||||
"cordova-plugin-ionic-webview": {},
|
"cordova-plugin-ionic-webview": {},
|
||||||
"cordova-plugin-ionic-keyboard": {}
|
"cordova-plugin-ionic-keyboard": {},
|
||||||
|
"cordova-plugin-geolocation": {
|
||||||
|
"GEOLOCATION_USAGE_DESCRIPTION": "The app will use your location to provide features for navigation or distances information."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"platforms": [
|
"platforms": [
|
||||||
"ios",
|
"ios",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 StApps
|
* Copyright (C) 2018, 2019 StApps
|
||||||
* This program is free software: you can redistribute it and/or modify it
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License as published by the Free
|
* under the terms of the GNU General Public License as published by the Free
|
||||||
* Software Foundation, version 3.
|
* Software Foundation, version 3.
|
||||||
@@ -13,6 +13,8 @@
|
|||||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
import {Component, Input} from '@angular/core';
|
import {Component, Input} from '@angular/core';
|
||||||
|
import {Geolocation} from '@ionic-native/geolocation/ngx';
|
||||||
|
import {AlertController} from '@ionic/angular';
|
||||||
import {LangChangeEvent, TranslateService} from '@ngx-translate/core';
|
import {LangChangeEvent, TranslateService} from '@ngx-translate/core';
|
||||||
import {
|
import {
|
||||||
SCLanguageName,
|
SCLanguageName,
|
||||||
@@ -32,8 +34,10 @@ export class SettingsItemComponent {
|
|||||||
|
|
||||||
@Input() setting: SCSetting;
|
@Input() setting: SCSetting;
|
||||||
|
|
||||||
constructor(private translateService: TranslateService,
|
constructor(private alertCtrl: AlertController,
|
||||||
private settingsProvider: SettingsProvider) {
|
private translateService: TranslateService,
|
||||||
|
private settingsProvider: SettingsProvider,
|
||||||
|
private geoLocation: Geolocation) {
|
||||||
this.meta = SCSettingMeta;
|
this.meta = SCSettingMeta;
|
||||||
|
|
||||||
this.language = translateService.currentLang as SCLanguageName;
|
this.language = translateService.currentLang as SCLanguageName;
|
||||||
@@ -47,19 +51,80 @@ export class SettingsItemComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* handles value changes of the setting
|
* Checks for user permission to use location,
|
||||||
|
* if no permission is granted, setting is set to false and an alert is presented to the user
|
||||||
|
*/
|
||||||
|
private async checkGeoLocationPermission() {
|
||||||
|
// request geoLocation to test the user permission
|
||||||
|
try {
|
||||||
|
// set enableHighAccuracy, otherwise android platform does not respond
|
||||||
|
const options = {
|
||||||
|
enableHighAccuracy: true,
|
||||||
|
};
|
||||||
|
await this.geoLocation.getCurrentPosition(options);
|
||||||
|
} catch (error) {
|
||||||
|
// if error code is 1 the user denied permission,
|
||||||
|
// other errors like 'timeout' or 'no location' will be ignored here
|
||||||
|
if (error.code === 1) {
|
||||||
|
// ios has special error message for disabled location services, for the setting we ignore it
|
||||||
|
if (error.message.toLowerCase() !== 'location services are disabled.') {
|
||||||
|
// revert setting value
|
||||||
|
this.setting.input.value = false;
|
||||||
|
await this.presentGeoLocationAlert();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shows alert with error message on denied user permission or disabled location services
|
||||||
|
*/
|
||||||
|
private async presentGeoLocationAlert() {
|
||||||
|
const title = this.translateService.instant('settings.geoLocation.permission_denied_title');
|
||||||
|
const message = this.translateService.instant('settings.geoLocation.permission_denied_message');
|
||||||
|
await this.presentAlert(title, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shows alert with given title and message and a 'ok' button
|
||||||
|
*
|
||||||
|
* @param title title of the alert
|
||||||
|
* @param message message of the alert
|
||||||
|
*/
|
||||||
|
async presentAlert(title: string, message: string) {
|
||||||
|
const alert = await this.alertCtrl.create({
|
||||||
|
buttons: ['OK'],
|
||||||
|
header: title,
|
||||||
|
message: message,
|
||||||
|
});
|
||||||
|
await alert.present();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles value changes of the setting
|
||||||
*/
|
*/
|
||||||
async settingChanged(): Promise<void> {
|
async settingChanged(): Promise<void> {
|
||||||
switch (this.setting.name) {
|
if (typeof this.setting.input.value !== 'undefined'
|
||||||
case 'language':
|
&& SettingsProvider.validateValue(this.setting, this.setting.input.value)) {
|
||||||
if (this.setting.input.value !== undefined) {
|
// handle general settings, with special actions
|
||||||
|
switch (this.setting.name) {
|
||||||
|
case 'language':
|
||||||
this.translateService.use(this.setting.input.value.toString());
|
this.translateService.use(this.setting.input.value.toString());
|
||||||
}
|
break;
|
||||||
break;
|
case 'geoLocation':
|
||||||
default:
|
if (this.setting.input.value) {
|
||||||
|
await this.checkGeoLocationPermission();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
await this.settingsProvider
|
||||||
|
.setSettingValue(this.setting.categories[0], this.setting.name, this.setting.input.value);
|
||||||
|
} else {
|
||||||
|
// reset setting
|
||||||
|
this.setting.input.value =
|
||||||
|
await this.settingsProvider.getSettingValue(this.setting.categories[0], this.setting.name);
|
||||||
}
|
}
|
||||||
await this.settingsProvider
|
|
||||||
.setSettingValue(this.setting.categories[0], this.setting.name, this.setting.input.value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
typeOf(val: any) {
|
typeOf(val: any) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 StApps
|
* Copyright (C) 2018, 2019 StApps
|
||||||
* This program is free software: you can redistribute it and/or modify it
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License as published by the Free
|
* under the terms of the GNU General Public License as published by the Free
|
||||||
* Software Foundation, version 3.
|
* Software Foundation, version 3.
|
||||||
@@ -16,6 +16,7 @@ import {CommonModule} from '@angular/common';
|
|||||||
import {NgModule} from '@angular/core';
|
import {NgModule} from '@angular/core';
|
||||||
import {FormsModule} from '@angular/forms';
|
import {FormsModule} from '@angular/forms';
|
||||||
import {RouterModule, Routes} from '@angular/router';
|
import {RouterModule, Routes} from '@angular/router';
|
||||||
|
import {Geolocation} from '@ionic-native/geolocation/ngx';
|
||||||
import {IonicModule} from '@ionic/angular';
|
import {IonicModule} from '@ionic/angular';
|
||||||
import {TranslateModule} from '@ngx-translate/core';
|
import {TranslateModule} from '@ngx-translate/core';
|
||||||
|
|
||||||
@@ -39,6 +40,7 @@ const settingsRoutes: Routes = [
|
|||||||
RouterModule.forChild(settingsRoutes),
|
RouterModule.forChild(settingsRoutes),
|
||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
|
Geolocation,
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
export class SettingsModule {}
|
export class SettingsModule {}
|
||||||
|
|||||||
@@ -293,7 +293,7 @@ describe('SettingsProvider', () => {
|
|||||||
inputType: 'singleChoice',
|
inputType: 'singleChoice',
|
||||||
values: [true, false],
|
values: [true, false],
|
||||||
},
|
},
|
||||||
name: 'locationService',
|
name: 'geoLocation',
|
||||||
order: 0,
|
order: 0,
|
||||||
origin: {
|
origin: {
|
||||||
indexed: '2018-09-11T12:30:00Z',
|
indexed: '2018-09-11T12:30:00Z',
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 StApps
|
* Copyright (C) 2018, 2019 StApps
|
||||||
* This program is free software: you can redistribute it and/or modify it
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License as published by the Free
|
* under the terms of the GNU General Public License as published by the Free
|
||||||
* Software Foundation, version 3.
|
* Software Foundation, version 3.
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"title": "Einstellungen"
|
"title": "Einstellungen",
|
||||||
|
"geoLocation": {
|
||||||
|
"permission_denied_title": "Erlaubnis für Ortungsdienst nicht gegeben",
|
||||||
|
"permission_denied_message": "Erlaube der App die Nutzung des Ortungsdienstes, um diese Funktion zu aktivieren."
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"title": "Settings"
|
"title": "Settings",
|
||||||
|
"geoLocation": {
|
||||||
|
"permission_denied_title": "Location permission not granted",
|
||||||
|
"permission_denied_message": "Allow this app to use location services to activate this feature."
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user