diff --git a/src/app/pages/generate/generate.page.html b/src/app/pages/generate/generate.page.html index 51d9dd4..9fe66cc 100644 --- a/src/app/pages/generate/generate.page.html +++ b/src/app/pages/generate/generate.page.html @@ -215,6 +215,25 @@ + + + + + {{ 'LATITUDE' | translate}} + + + + + + + + {{ 'LONGITUDE' | translate}} + + + + + + diff --git a/src/app/pages/generate/generate.page.ts b/src/app/pages/generate/generate.page.ts index d1bc0ee..8056be8 100644 --- a/src/app/pages/generate/generate.page.ts +++ b/src/app/pages/generate/generate.page.ts @@ -5,7 +5,7 @@ import { Haptics, ImpactStyle, NotificationType } from '@capacitor/haptics'; import { AlertController, LoadingController, ToastController } from '@ionic/angular'; import { TranslateService } from '@ngx-translate/core'; import { format } from 'date-fns'; -import { EnvService } from 'src/app/services/env.service'; +import { EnvService, QrCreateContentTypeType } from 'src/app/services/env.service'; import { Toast } from '@capacitor/toast'; import { fadeIn } from 'src/app/utils/animations'; import { SplashScreen } from '@capacitor/splash-screen'; @@ -23,6 +23,7 @@ export class GeneratePage { freeTxtText: string = "Free Text"; urlText: string = "URL"; contactText: string = "vCard Contact"; + geolocationText: string = "Geolocation"; phoneText: string = "Phone"; smsText: string = "Message"; emailW3CText: string = "Email (W3C Standard)"; @@ -37,6 +38,9 @@ export class GeneratePage { emailSubject: string = ""; emailBody: string = ""; + latitude: number = 0; + longitude: number = 0; + phoneNumber: string = ""; smsMessage: string = ""; @@ -84,17 +88,18 @@ export class GeneratePage { { text: this.wpaText, value: "WPA" }, ] - contentTypes: { text: string, value: "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi" }[] = [ + contentTypes: { text: string, value: QrCreateContentTypeType }[] = [ { text: this.freeTxtText, value: 'freeText' }, { text: this.emailW3CText, value: 'emailW3C' }, { text: this.emailDocomoText, value: 'emailDocomo' }, + { text: this.geolocationText, value: 'geo' }, { text: this.phoneText, value: 'phone' }, { text: this.smsText, value: 'sms' }, { text: this.urlText, value: 'url' }, { text: this.contactText, value: 'contact' }, { text: this.wifiText, value: 'wifi' }, ]; - contentType: "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi" = "freeText"; + contentType: QrCreateContentTypeType = "freeText"; constructor( public translate: TranslateService, @@ -113,6 +118,7 @@ export class GeneratePage { this.freeTxtText = this.translate.instant("FREE_TEXT"); this.urlText = this.translate.instant("URL"); this.contactText = this.translate.instant("VCARD_CONTACT"); + this.geolocationText = this.translate.instant("GEOLOCATION"); this.phoneText = this.translate.instant("PHONE_NO"); this.smsText = this.translate.instant("MESSAGE"); this.emailW3CText = this.translate.instant("EMAIL_W3C_STANDARD"); @@ -122,6 +128,7 @@ export class GeneratePage { { text: this.freeTxtText, value: 'freeText' }, { text: this.emailW3CText, value: 'emailW3C' }, { text: this.emailDocomoText, value: 'emailDocomo' }, + { text: this.geolocationText, value: 'geo' }, { text: this.phoneText, value: 'phone' }, { text: this.smsText, value: 'sms' }, { text: this.urlText, value: 'url' }, @@ -195,6 +202,9 @@ export class GeneratePage { this.emailSubject = ""; this.emailBody = ""; + this.latitude = 0; + this.longitude = 0; + this.phoneNumber = ""; this.smsMessage = ""; @@ -263,6 +273,9 @@ export class GeneratePage { this.qrCodeContent = `MATMSG:TO:${this.toEmails[0]};SUB:${this.emailSubject};BODY:${this.emailBody};;`; this.qrCodeContent = encodeURI(this.qrCodeContent); break; + case "geo": + this.qrCodeContent = `geo:${this.latitude},${this.longitude}`; + break; case "phone": this.qrCodeContent = "tel:"; this.qrCodeContent += this.phoneNumber; @@ -348,7 +361,7 @@ export class GeneratePage { return format(new Date(), "yyyy-MM-dd"); } - getIcon(type: "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi"): string { + getIcon(type: QrCreateContentTypeType): string { switch (type) { case "freeText": return "format_align_left"; @@ -356,6 +369,8 @@ export class GeneratePage { return "link"; case "contact": return "contact_phone"; + case "geo": + return "location_on"; case "phone": return "call"; case "sms": @@ -371,7 +386,7 @@ export class GeneratePage { } } - getText(type: "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi"): string { + getText(type: QrCreateContentTypeType): string { switch (type) { case "freeText": return this.freeTxtText; @@ -379,6 +394,8 @@ export class GeneratePage { return this.urlText; case "contact": return this.contactText; + case "geo": + return this.geolocationText; case "phone": return this.phoneText; case "sms": diff --git a/src/app/pages/result/result.page.html b/src/app/pages/result/result.page.html index 877ba4b..8f46a12 100644 --- a/src/app/pages/result/result.page.html +++ b/src/app/pages/result/result.page.html @@ -96,6 +96,15 @@ [ngTemplateOutletContext]="{ label: 'HIDDEN_NETWORK_?' | translate, content: wifiHidden === true? ('YES' | translate) : ('NO' | translate) }"> + + + + + +
@@ -126,6 +135,13 @@ + + + + + + @@ -245,10 +261,11 @@ {{ 'BROWSE' | translate}} - - + {{ 'OPEN' | translate}} {{ hint }} - diff --git a/src/app/pages/result/result.page.ts b/src/app/pages/result/result.page.ts index 538a4d2..817a40e 100644 --- a/src/app/pages/result/result.page.ts +++ b/src/app/pages/result/result.page.ts @@ -6,7 +6,7 @@ import { Haptics, ImpactStyle } from '@capacitor/haptics'; import { AlertController, LoadingController, ModalController, Platform } from '@ionic/angular'; import { TranslateService } from '@ngx-translate/core'; import { VCardContact } from 'src/app/models/v-card-contact'; -import { EnvService } from 'src/app/services/env.service'; +import { EnvService, QrResultContentTypeType } from 'src/app/services/env.service'; import { Toast } from '@capacitor/toast'; import { MatFormField } from '@angular/material/form-field'; import { BarcodeScanner } from '@capacitor-community/barcode-scanner'; @@ -23,7 +23,7 @@ import { QRCodeElementType } from 'angularx-qrcode'; }) export class ResultPage { - contentType: "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi" = "freeText"; + contentType: QrResultContentTypeType = "freeText"; qrCodeContent: string; qrElementType: QRCodeElementType = "canvas"; @@ -45,6 +45,9 @@ export class ResultPage { wifiEncryption: 'NONE' | 'WEP' | 'WPA'; wifiHidden: boolean = false; + latitude: number; + longitude: number; + base64Encoded: boolean = false; base64EncodedText: string = ""; base64Decoded: boolean = false; @@ -138,6 +141,8 @@ export class ResultPage { delete this.wifiPassword delete this.wifiEncryption delete this.wifiHidden + delete this.latitude + delete this.longitude this.base64Encoded = false; this.base64EncodedText = ""; this.base64Decoded = false; @@ -157,6 +162,7 @@ export class ResultPage { const emailW3CPrefix = "MAILTO:"; const emailDoconoPrefix = "MATMSG:"; const wifiPrefix = "WIFI:"; + const geoPrefix = "GEO:"; const content0 = this.qrCodeContent.trim(); const tContent = this.qrCodeContent.trim().toUpperCase(); if (tContent.substr(0, contactPrefix.length) === contactPrefix) { @@ -183,6 +189,10 @@ export class ResultPage { } else if (tContent.substr(0, wifiPrefix.length) === wifiPrefix) { this.contentType = "wifi"; this.prepareWifi(); + } else if (tContent.substring(0, geoPrefix.length) === geoPrefix) { + this.contentType = "geo"; + this.latitude = +tContent.substring(geoPrefix.length, tContent.indexOf(",")); + this.longitude = +tContent.substring(tContent.indexOf(",") + 1); } else if (this.isValidUrl(content0)) { this.contentType = "url"; } else { @@ -880,6 +890,8 @@ export class ResultPage { return this.translate.instant("EMAIL_W3C_STANDARD"); case 'emailDocomo': return this.translate.instant("EMAIL_NTT_DOCOMO"); + case 'geo': + return this.translate.instant("GEOLOCATION"); case 'phone': return this.translate.instant("PHONE_NO"); case 'sms': @@ -901,6 +913,8 @@ export class ResultPage { return "link"; case "contact": return "contact_phone"; + case 'geo': + return "location_on"; case "phone": return "call"; case "sms": diff --git a/src/app/services/env.service.ts b/src/app/services/env.service.ts index ed145eb..6d53bc9 100644 --- a/src/app/services/env.service.ts +++ b/src/app/services/env.service.ts @@ -25,6 +25,8 @@ export declare type VibrationType = "on" | "off" | 'on-haptic' | 'on-scanned'; export declare type OrientationType = 'portrait' | 'landscape'; export declare type SearchEngineType = 'google' | 'bing' | 'yahoo' | 'duckduckgo' | 'yandex' | 'ecosia' | 'brave'; export declare type ResultPageButtonsType = 'detailed' | 'icon-only'; +export declare type QrResultContentTypeType = "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi" | "geo"; +export declare type QrCreateContentTypeType = "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi" | "geo"; @Injectable({ providedIn: 'root' diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 4ee959e..21f954e 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -92,6 +92,7 @@ "FULL_RESET": "Voller Reset", "FUNCTIONS": "Funktionen", "GENDER": "Geschlecht", + "GEOLOCATION": "Geolokalisierung", "GOOGLE_SEARCH": "Google-Suche", "HAPTIC_FEEDBACK_ONLY": "Nur haptisches Feedback", "HIDDEN_NETWORK_?": "Verstecktes Netzwerk?", @@ -105,6 +106,7 @@ "JOB_TITLE": "Berufsbezeichnung", "LANGUAGE": "Sprache", "LAST_NAME": "Nachname", + "LATITUDE": "Breitengrad", "LEVEL_H": "Level H", "LEVEL_L": "Level L", "LEVEL_M": "Level M", @@ -115,6 +117,7 @@ "LOCK_PORTRAIT": "Porträt sperren", "LOG": "Protokoll", "LOG_BACKUP_AND_RESTORE": "Protokoll, Sicherung und Wiederherstellung", + "LONGITUDE": "Längengrad", "MALE": "Männlich", "MANAGE_RECORDS": "Aufzeichnungen verwalten", "MARGIN": "Rand", diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index bb02842..5bb0dd3 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -92,6 +92,7 @@ "FULL_RESET": "Full Reset", "FUNCTIONS": "Functions", "GENDER": "Gender", + "GEOLOCATION": "Geolocation", "GOOGLE_SEARCH": "Google Search", "HAPTIC_FEEDBACK_ONLY": "Haptic Feedback Only", "HIDDEN_NETWORK_?": "Hidden Network?", @@ -105,6 +106,7 @@ "JOB_TITLE": "Job Title", "LANGUAGE": "Language", "LAST_NAME": "Last Name", + "LATITUDE": "Latitude", "LEVEL_H": "Level H", "LEVEL_L": "Level L", "LEVEL_M": "Level M", @@ -115,6 +117,7 @@ "LOCK_PORTRAIT": "Lock Portrait", "LOG": "Log", "LOG_BACKUP_AND_RESTORE": "Log, Backup & Restore", + "LONGITUDE": "Longitude", "MALE": "Male", "MANAGE_RECORDS": "Manage Records", "MARGIN": "Margin", diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index f6907b8..8bf4172 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -92,6 +92,7 @@ "FULL_RESET": "Réinitialiser complètement", "FUNCTIONS": "Fonctions", "GENDER": "Sexe", + "GEOLOCATION": "Géolocalisation", "GOOGLE_SEARCH": "Recherche Google", "HAPTIC_FEEDBACK_ONLY": "Retour haptique uniquement", "HIDDEN_NETWORK_?": "Réseau caché ?", @@ -105,6 +106,7 @@ "JOB_TITLE": "Titre d'emploi", "LANGUAGE": "Langue", "LAST_NAME": "Nom de famille", + "LATITUDE": "Latitude", "LEVEL_H": "Niveau H", "LEVEL_L": "Niveau L", "LEVEL_M": "Niveau M", @@ -115,6 +117,7 @@ "LOCK_PORTRAIT": "Verrouiller le portrait", "LOG": "Registre", "LOG_BACKUP_AND_RESTORE": "Journalisation, sauvegarde et restauration", + "LONGITUDE": "Longitude", "MALE": "Mâle", "MANAGE_RECORDS": "Gérer les enregistrements", "MARGIN": "Marge", diff --git a/src/assets/i18n/it.json b/src/assets/i18n/it.json index 1559c12..575e0d1 100644 --- a/src/assets/i18n/it.json +++ b/src/assets/i18n/it.json @@ -92,6 +92,7 @@ "FULL_RESET": "Reset", "FUNCTIONS": "Opzioni", "GENDER": "Sesso", + "GEOLOCATION": "Geolocalizzazione", "GOOGLE_SEARCH": "Ricerca con Google", "HAPTIC_FEEDBACK_ONLY": "Feedback disponibile solo tramite Haptic", "HIDDEN_NETWORK_?": "Rete nascosta?", @@ -105,6 +106,7 @@ "JOB_TITLE": "Titolo di lavoro", "LANGUAGE": "Lingua", "LAST_NAME": "Cognome", + "LATITUDE": "Latitudine", "LEVEL_H": "Livello H", "LEVEL_L": "Livello L", "LEVEL_M": "Livello M", @@ -115,6 +117,7 @@ "LOCK_PORTRAIT": "Blocca vista verticale", "LOG": "Log", "LOG_BACKUP_AND_RESTORE": "Logga, Esegui backup & Ripristina", + "LONGITUDE": "Longitudine", "MALE": "Uomo", "MANAGE_RECORDS": "Gestisci record", "MARGIN": "Margine", diff --git a/src/assets/i18n/pt-BR.json b/src/assets/i18n/pt-BR.json index 009dc68..c3274f0 100644 --- a/src/assets/i18n/pt-BR.json +++ b/src/assets/i18n/pt-BR.json @@ -92,6 +92,7 @@ "FULL_RESET": "Redefinição Completa", "FUNCTIONS": "Funções", "GENDER": "Gênero", + "GEOLOCATION": "Geolocalização", "GOOGLE_SEARCH": "Busca Google", "HAPTIC_FEEDBACK_ONLY": "Apenas Feedback Háptico", "HIDDEN_NETWORK_?": "Rede Oculta?", @@ -105,6 +106,7 @@ "JOB_TITLE": "Cargo", "LANGUAGE": "Idioma", "LAST_NAME": "Sobrenome", + "LATITUDE": "Latitude", "LEVEL_H": "Nível H", "LEVEL_L": "Nível L", "LEVEL_M": "Nível M", @@ -115,6 +117,7 @@ "LOCK_PORTRAIT": "Travar em Retrato", "LOG": "Registro", "LOG_BACKUP_AND_RESTORE": "Registro, Backup e Restauração", + "LONGITUDE": "Longitude", "MALE": "Masculino", "MANAGE_RECORDS": "Gerenciar Registros", "MARGIN": "Margem", diff --git a/src/assets/i18n/ru.json b/src/assets/i18n/ru.json index 05fae2e..5eae99d 100644 --- a/src/assets/i18n/ru.json +++ b/src/assets/i18n/ru.json @@ -92,6 +92,7 @@ "FULL_RESET": "Полный сброс", "FUNCTIONS": "Функции", "GENDER": "Пол", + "GEOLOCATION": "Геолокация", "GOOGLE_SEARCH": "Google Search", "HAPTIC_FEEDBACK_ONLY": "Только тактильный отклик", "HIDDEN_NETWORK_?": "Скрытая сеть?", @@ -105,6 +106,7 @@ "JOB_TITLE": "Должность", "LANGUAGE": "Язык", "LAST_NAME": "Фамилия", + "LATITUDE": "Широта", "LEVEL_H": "Уровень H", "LEVEL_L": "Уровень L", "LEVEL_M": "Уровень M", @@ -115,6 +117,7 @@ "LOCK_PORTRAIT": "Портретная", "LOG": "История", "LOG_BACKUP_AND_RESTORE": "История и восстановление", + "LONGITUDE": "Долгота", "MALE": "Мужской", "MANAGE_RECORDS": "Управление записями", "MARGIN": "Отступ", diff --git a/src/assets/i18n/zh-CN.json b/src/assets/i18n/zh-CN.json index 86ab658..bf8df56 100644 --- a/src/assets/i18n/zh-CN.json +++ b/src/assets/i18n/zh-CN.json @@ -92,6 +92,7 @@ "FULL_RESET": "完整重设", "FUNCTIONS": "功能", "GENDER": "性别", + "GEOLOCATION": "地理定位", "GOOGLE_SEARCH": "Google 搜索", "HAPTIC_FEEDBACK_ONLY": "仅触感反馈", "HIDDEN_NETWORK_?": "隐藏的网络?", @@ -105,6 +106,7 @@ "JOB_TITLE": "职位名称", "LANGUAGE": "语言", "LAST_NAME": "姓氏", + "LATITUDE": "纬度", "LEVEL_H": "H 等级", "LEVEL_L": "L 等级", "LEVEL_M": "M 等级", @@ -115,6 +117,7 @@ "LOCK_PORTRAIT": "锁定纵向", "LOG": "记录", "LOG_BACKUP_AND_RESTORE": "记录、备份与还原", + "LONGITUDE": "经度", "MALE": "男性", "MANAGE_RECORDS": "管理记录", "MARGIN": "边距", diff --git a/src/assets/i18n/zh-HK.json b/src/assets/i18n/zh-HK.json index 0c5747e..f741259 100644 --- a/src/assets/i18n/zh-HK.json +++ b/src/assets/i18n/zh-HK.json @@ -92,6 +92,7 @@ "FULL_RESET": "完整重設", "FUNCTIONS": "功能", "GENDER": "性別", + "GEOLOCATION": "地理位置", "GOOGLE_SEARCH": "Google 搜尋", "HAPTIC_FEEDBACK_ONLY": "僅觸感反饋", "HIDDEN_NETWORK_?": "隱藏的網絡?", @@ -105,6 +106,7 @@ "JOB_TITLE": "職位名稱", "LANGUAGE": "語言", "LAST_NAME": "姓氏", + "LATITUDE": "緯度", "LEVEL_H": "H 等級", "LEVEL_L": "L 等級", "LEVEL_M": "M 等級", @@ -115,6 +117,7 @@ "LOCK_PORTRAIT": "鎖定縱向", "LOG": "記錄", "LOG_BACKUP_AND_RESTORE": "記錄、備份與還原", + "LONGITUDE": "經度", "MALE": "男性", "MANAGE_RECORDS": "管理記錄", "MARGIN": "邊距",