From 6059ca934d67949807869047830164c50b1ca827 Mon Sep 17 00:00:00 2001 From: GiZig Date: Mon, 7 Apr 2014 03:32:57 +0200 Subject: [PATCH 01/29] Update strings.xml --- OsmAnd/res/values-fr/strings.xml | 50 ++++++++++++++++---------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 5438b0d82b..9da81853e6 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -144,7 +144,7 @@ Recherche de l\'emplacement… Emplacement[Trouvé] Adresse… - Favoris… + Favori… Non défini Fixé Emplacement actuel… @@ -236,7 +236,7 @@ Les données pour la langue sélectionnée ne sont pas installées. Voulez-vous les obtenir sur le Market ? Inverser l\'itinéraire GPX Utiliser la destination en cours - Suivre la trace depuis le début + Suivre l'ensemble de la trace Vous pouvez basculer sur les cartes vectorielles locales en utilisant le menu (Couches -> Source de la carte… -> Cartes vectorielles OSM) pour voir la carte. Sélectionner le flux audio Sélectionner le canal pour le guidage vocal (dépend de la configuration système) @@ -267,7 +267,7 @@ \n\nL\'option \'Cartes téléchargées\' dans le menu contextuel à droite de l\'écran permet de n\'afficher que les cartes déjà téléchargées sur votre système, avec les couleurs ou polices suivantes : \n\n\'Vert\' - pour les cartes à jour avec le serveur \n\n\'Bleu\' - pour les cartes qui peuvent être mises à jour depuis le serveur - \n\t\'Italique\' - pour les cartes désactivées sur l\'appareil + \n\n\'Italique\' - pour les cartes désactivées sur l\'appareil Niveau de zoom maximum pour l\'utilisation des cartes vectorielles au lieu des tuiles de carte Niveau de zoom vectoriel @@ -279,9 +279,9 @@ Lieux favoris "Les points utilisés fréquemment peuvent être enregistrés en tant que favoris. -\n\tPour créer un lieu Favori, aller dans le menu contextuel de la carte, sélectionner l\'option \'Ajouter aux favoris\' et saisir un nom adapté. Après enregistrement, ce lieu est facilement accessible par le menu \'Menu principal\'->\'Favoris\'. -\n\tUn appui long sur un favori dans le menu \'Favoris\' permet de le modifier, le supprimer ou de créer un itinéraire pour s\'y rendre. -\n\tPour afficher tous les favoris sur la carte, activer le calque affichant tous les favoris directement sur la carte dans \'Menu contextuel de la carte\'->\'Couches\'. " +\n\tPour créer un favori, aller dans le menu contextuel de la carte, sélectionnez l\'option \'Ajouter aux favoris\' et saisissez un nom adapté. Après enregistrement, ce lieu est facilement accessible par \'Menu\' → \'Favoris\'. +\n\tUn appui court sur un favori dans le menu \'Favoris\' permet de créer un itinéraire pour s\'y rendre. +\n\tPour afficher tous les favoris sur la carte, activer la couche \'Favoris\' dans \'Menu\' → \'Couches\'. " OSM en ligne classification des cartes en images Une erreur est survenue lors de la recherche hors-ligne Ne peut interpréter le geo intent:\'%s\' @@ -294,7 +294,7 @@ Mode de fonctionnement Navigation - La navigation vers un point peut être lancée soit directement par un appui long à son emplacement sur la carte (un appui court sur la bulle apparue ouvre alors le menu contextuel avec le choix \'Aller vers le point\'), soit en choisissant \'Navigation\' après un appui court sur un favori ou un résultat de recherche. + La navigation vers un point peut être lancée soit directement par un appui long à son emplacement sur la carte (un appui court sur la bulle apparue ouvre alors le menu contextuel avec le choix \'Aller vers le point\'), soit par un appui court sur un favori ou un résultat de recherche (en choisissant alors \'Navigation\'). \n\nLa destination est alors indiquée par un point orange et un drapeau à damier. OsmAnd affiche la distance qui vous en sépare, et sa direction (par une flèche orange). Recherche @@ -336,7 +336,7 @@ Ajouter une étape à une trace GPX enregistrée Ajouter une étape GPX Territoire - Barrière + Obstacle Éducation Urgence Divertissement @@ -720,7 +720,7 @@ Appliquer Ajouter Non - Nom du favoris + Nom du favori Favoris Le point \'\'{0}\'\' à été ajouté aux favoris. Éditer le favori @@ -784,7 +784,7 @@ Configurer la source des cartes en ligne ou en cache - Paramètres des cartes Configurer l\'affichage des cartes - Ce greffon permet d\'utiliser une grande gamme de cartes au format image en ligne, ou conservée en cache comme carte de base ou comme sur- ou sous-couche de carte. Les cartes peuvent également être préparées hors ligne et copiées dans le dossier OsmAnd. + Ce greffon permet d\'accéder à une grande gamme de cartes sous forme de tuiles téléchargées ou conservées en cache, utilisables comme carte de base, fond de carte, ou sur-couche. Les cartes peuvent également être préparées hors-ligne et copiées dans le dossier OsmAnd. Ce greffon permet d\'utiliser l\'enregistrement des traces et la navigation en mode économie (écran éteint) en réveillant périodiquement le GPS pour enregistrer une position ou jouer une instruction vocale. Ce greffon permet de configurer les fonctionnalités d\'accessibilité. Paramètres avancés @@ -792,7 +792,7 @@ Ce greffon permet de gérer des paramètres de configuration avancés et propres à certains appareils. Ce greffon permet la gestion de paramètres de développement et de débogage tels que la navigation animée ou l\'affichage des temps de rendu. Gestionnaire des greffons - Toucher un greffon pour l\'activer ou le désactiver (Redémarrage d\'OsmAnd peut être nécessaire) + Toucher un greffon pour l\'activer ou le désactiver (le redémarrage d\'OsmAnd peut être nécessaire) Les greffons fournissent à l\'application des fonctionnalités supplémentaires, telles que l\'enregistrement des traces, l\'utilisation de cartes en ligne, le fonctionnement en arrière-plan, le mode accessibilité et bien d\'autres. Gestionnaire de greffons Changements en 0.8.0 : @@ -1014,17 +1014,17 @@ En continu \tVous pouvez modifier l\'orientation de la carte par un appui court sur l\'icône de la boussole \n\tLes choix sont : -\n\t\'Ne pas tourner (nord vers le haut)\' - La carte ne changera pas d\'orientation, le nord sera toujours vers le haut -\n\t\'Direction du déplacement\' - La carte est continuellement alignée dans la direction du déplacement -\n\t\'Boussole\' - La carte est continuellement alignée sur la valeur de la boussole +\n\t\'Ne pas tourner (nord vers le haut)\' - La carte ne changera pas d\'orientation, le nord sera toujours vers le haut. +\n\t\'Direction du déplacement\' - La carte est continuellement alignée dans la direction du déplacement. +\n\t\'Boussole\' - La carte est continuellement alignée sur la valeur de la boussole. "\tLe style de la carte peut, pour certaines cartes vectorielles, être modifié selon qu\'il fait jour (plus clair) ou nuit (plus sombre) \n\tLes couleurs de nuit sont plus sûres pour la conduite nocturne -\n\tVous pouvez configurer la politique de bascule jour/nuit dans \'Navigation\'->\'Mode jour/nuit\' -\n\tLes choix sont: -\n\t\'Lever/coucher du soleil\' +\n\tVous pouvez changer de règle pour la bascule jour/nuit dans \'Menu\' → \'Configurer l\'écran\' → \'Mode jour/nuit\'. +\n\tLes choix sont : +\n\t\'Lever/coucher du soleil\' - Bascule automatique, en fonction de l\'éphéméride (mode par défaut) \n\t\'Jour\' - Toujours utiliser le mode jour \n\t\'Nuit\' - Toujours utiliser le mode nuit -\n\t\'Détection de la luminosité\' - L\'affichage est contrôlé par le capteur de luminosité de votre appareil, s\'il existe " +\n\t\'Détection de la luminosité\' - Bascule contrôlée par le capteur de luminosité de votre appareil, s\'il existe " OsmAnd est un logiciel libre de navigation pouvant fonctionner avec des cartes hors ligne ou en ligne. OsmAnd est un logiciel libre de navigation pouvant fonctionner avec des cartes hors ligne ou en ligne "Changements en 0.8.3 : @@ -1042,7 +1042,7 @@ \n\tDans \'Source de la carte…\' vous pouvez choisir entre les cartes vectorielles préchargées (choix par défaut, nécessaires pour la navigation hors-ligne), ou des sources prédéfinies de tuiles de carte en ligne ou en cache (activer le greffon \'Cartes en ligne\' pour cela), ou des cartes créées manuellement sur un PC grâce à OsmAndMapCreator. \n\tOsmAnd supporte également des sources personnalisées. -\tOsmAnd propose des profils (personnalisables) adaptés aux différents usages. +\tOsmAnd propose des profils (personnalisables) adaptés aux différentes utilisations. \n\tVous pouvez changer de profil via le bouton dédié dans l\'angle inférieur gauche de la carte (icône voiture, vélo, ou piéton), ou lors de la création d\'un itinéraire. Éviter les autoroutes @@ -1087,7 +1087,7 @@ Mode sûr L\'application s\'exécute en mode sûr (désactiver le dans les paramètres). Sélectionner quand afficher uniquement les cartes routières : - Cartes routières uniquement + Cartes uniquement routières Routes uniquement Cartes standards Cartes routières uniquement @@ -1415,9 +1415,9 @@ Arrêt de l\'auto-zoom Zoom éloigné Zoom très éloigné - OsmAnd supporte l\'affichage des cartes vectorielles hors-ligne dans différents styles de carte en fonction de vos besoins : - \n\nÀ la place du style de carte \'default\', vous pouvez dans \'Menu\' → \'Configuration\' → \'Styles de rendu\' sélectionner par exemple : - \n\t* le style \'Touring view\', qui fournit les informations les plus détaillées pour le voyage et le tourisme, incluant des optimisations pour les conducteurs professionnels (contraste élevé, les diverses routes sont distinguables). + OsmAnd permet l\'affichage des cartes vectorielles hors-ligne selon différents styles de rendu en fonction de vos besoins. + \n\nÀ la place du style de rendu \'default\', vous pouvez dans \'Menu\' → \'Configurer l'\écran\' → \'Styles de rendu\' sélectionner par exemple : + \n\t* le style \'Touring view\', qui fournit les informations les plus détaillées possibles pour le voyage et le tourisme, incluant des optimisations pour les conducteurs professionnels (contraste élevé, diverses routes bien distinguables). \n\t* \'High contrast roads\' affiche les routes avec des couleurs très accentuées pour les situations de forte luminosité. \n\t* \'Cycle-map\' est optimisé pour l\'affichage des routes pour cyclistes. \n\t* \'Winter and ski\' crée une vue hivernale du paysage, et montre les domaines skiables (nécessite le téléchargement de la carte \'World ski\') @@ -1486,9 +1486,9 @@ \n\t* IMPORTANT : Les cartes doivent être postérieures à février 2014. \n\t* Navigation entièrement mise à jour (rapide et précise). \n\t* Nouvel écran d\'élaboration de l\'itinéraire (plus intuitif et plus puissant) - \n\t** Possibilité d\'utiliser les itinéraires GPX via le bouton Paramètres d\'itinéraire + \n\t* Possibilité d\'utiliser les itinéraires GPX via le bouton Paramètres d\'itinéraire \n\t* Boutons se masquant automatiquement durant la navigation - \n\t* Calcul d\'un itinéraire hors-ligne jusqu\'au début de l\'itinéraire GPX (option \'Suivre la trace depuis le début\') + \n\t* Calcul d\'un itinéraire hors-ligne jusqu\'au début de l\'itinéraire GPX (option \'Suivre l\'ensemble de la trace\') \n\t* Simulation active dans les tunnels \n\t* Nombreuses petites améliorations de l\'expérience utilisateur et de l\'utilisabilité \n\t* Paramétrage de la vitesse d\'élocution From 0d1f077f9e5273a5110549f6e8f97303ccf41138 Mon Sep 17 00:00:00 2001 From: sonora Date: Mon, 7 Apr 2014 21:39:18 +0200 Subject: [PATCH 02/29] fix apostrophies --- OsmAnd/res/values-fr/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 9da81853e6..d676e18c6e 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -1,4 +1,4 @@ -Modifications hors ligne +Modifications hors ligne Toujours utiliser l\'édition hors ligne "Changements en 0.7.1 : \n\t- Modification hors ligne des PI @@ -236,7 +236,7 @@ Les données pour la langue sélectionnée ne sont pas installées. Voulez-vous les obtenir sur le Market ? Inverser l\'itinéraire GPX Utiliser la destination en cours - Suivre l'ensemble de la trace + Suivre l\'ensemble de la trace Vous pouvez basculer sur les cartes vectorielles locales en utilisant le menu (Couches -> Source de la carte… -> Cartes vectorielles OSM) pour voir la carte. Sélectionner le flux audio Sélectionner le canal pour le guidage vocal (dépend de la configuration système) From da2801ca3eecdec06d40b26679bbb816aebd7bf8 Mon Sep 17 00:00:00 2001 From: GiZig Date: Thu, 10 Apr 2014 04:22:45 +0200 Subject: [PATCH 03/29] Update strings.xml --- OsmAnd/res/values-fr/strings.xml | 150 +++++++++++++++---------------- 1 file changed, 75 insertions(+), 75 deletions(-) diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index d676e18c6e..57d896d26a 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -1,7 +1,7 @@ -Modifications hors ligne - Toujours utiliser l\'édition hors ligne +Modifications hors-ligne + Toujours utiliser l\'édition hors-ligne "Changements en 0.7.1 : -\n\t- Modification hors ligne des PI +\n\t- Modification hors-ligne des PI \n\t- Option de suivi en ligne - envoyer ses coordonnées à un service web de façon périodique (lire la configuration dans les articles HowTo) \n\t- Afficher l\'itinéraire en cours d\'enregistrement sur la carte \n\t- Détection de la direction: \'Faites demi-tour\' est affiché et annoncé lors d\'un déplacement dans la direction opposée, ou après avoir raté un virage @@ -24,15 +24,15 @@ Activer le suivi en ligne Préciser l\'intervalle pour le suivi en ligne Intervalle pour le suivi en ligne - Précisez l\'adresse web pour le suivi en ligne avec la syntaxe : lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6} + Préciser l\'adresse web pour le suivi en ligne avec la syntaxe : lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6} Adresse web pour le suivi en ligne Veuillez activer \'Enregistrer l\'itinéraire en GPX\' en paramètre de suivi. Afficher la trace en cours Changements en 0.7.0 : -\n\t- Données Wikipedia hors ligne avec articles +\n\t- Données Wikipedia hors-ligne avec articles \n\t- Cartes mises à jour \n\t- Petites améliorations diverses - Cette version gratuite de OsmAnd est limitée à %1$s téléchargements et ne supporte pas les articles Wikipedia hors ligne. + Cette version gratuite de OsmAnd est limitée à %1$s téléchargements et ne supporte pas les articles Wikipedia hors-ligne. Version gratuite Afficher description PI Amérique du Nord @@ -50,7 +50,7 @@ Wikipédia Monde Voix enregistrées (fonctions limitées) Voix de synthèse TTS (à préférer) - Wikipédia (hors ligne) + Wikipédia (hors-ligne) Défini par l\'utilisateur Un fichier de favoris précédemment exporté existe déjà. Voulez vous le remplacer ? Paramètres de profil @@ -74,13 +74,13 @@ Permet d\'utiliser OsmAnd pendant que l\'écran est désactivé Orientation de la carte - Vous n\'avez pas actuellement de carte vectorielle pour cet emplacement.\n\t\n\tVous pouvez en télécharger dans \'Paramètres\' -> \'Données hors ligne\', ou basculer sur les cartes en ligne via \'Paramètres\' -> \'Sources de carte\'. - Téléchargement réussi.\n\t\n\tPour l\'utiliser, activer dans \'Paramètres\' -> \'Sources de carte\' -> \'Cartes vectorielles\'. + Vous n\'avez pas actuellement de carte vectorielle pour cet emplacement.\n\t\n\tVous pouvez en télécharger dans \'Paramètres\' → \'Données hors-ligne\', ou basculer sur les cartes en ligne via \'Paramètres\' → \'Sources de carte\'. + Téléchargement réussi.\n\t\n\tPour l\'utiliser, allez dans \'Menu\' → \'Couches\' → \'Source de la carte…\' → \'Cartes vectorielles OSM\'. Mode jour/nuit Améliorer les données OSM - \tOsmAnd utilise des cartes issues des données OpenStreetMap.org (OSM). En plus de la visualisation des cartes et du calcul d\'itinéraires, OsmAnd peut également être utilisé pour améliorer la qualité des données OSM. Vous pouvez facilement créer et télécharger des nouveaux points d\'intérêt (PI) ou des rapports de bogues cartographiques en quelques clics ! -\n\tPour cela il faudra d\'abord fournir vos paramètres de connexion OSM dans \'Paramètres\' -> \'Général\' -> \'Édition OSM\'. + \tOsmAnd utilise des cartes issues des données OpenStreetMap.org (OSM). En plus de la visualisation des cartes et du calcul d\'itinéraires, OsmAnd peut également être utilisé pour améliorer la qualité des données OSM. Vous pouvez facilement créer et téléverser des nouveaux points d\'intérêt (PI) ou des rapports de bogues cartographiques en quelques clics ! +\n\tPour cela il faudra d\'abord fournir vos paramètres de connexion OSM dans \'Paramètres\' → \'Général\' → \'Édition OSM\'. \n\tPour ajouter un nouveau PI, utiliser l\'option \'Créer un point d\'intérêt\' dans le menu contextuel de la carte. Saisir les informations dans la boite de dialogue \'Créer un point d\'intérêt\' avant d\'enregistrer. \n\tLes erreurs de cartographie peuvent être signalées immédiatement via les bogues OSM, permettant à la communauté OSM de corriger plus rapidement le problème. \n\tPour créer un bogue OSM utiliser l\'option \'Ouvrir un bogue OSM\' dans le menu contextuel de la carte. Saisir une description détaillée du problème et le poster avec le bouton \'Ajouter\'. @@ -90,7 +90,7 @@ Changements en 0.6.9 : -\n\t- Amélioration du rendu des cartes hors ligne +\n\t- Amélioration du rendu des cartes hors-ligne \n\t- Rendu hors-ligne acceléré - voir dans les options expérimentales (ne marche pas sur tous les appareils) \n\t- Changements cosmétiques \n\t- Infos d\'altitude @@ -152,11 +152,11 @@ Recherche autour de : Rechercher autour du point Changement pour 0.6.7 : -\n\t- Gestionnaire de données hors ligne (téléchargement, suppression, sauvegarde des données hors ligne directement dans OsmAnd) +\n\t- Gestionnaire de données hors-ligne (téléchargement, suppression, sauvegarde des données hors-ligne directement dans OsmAnd) \n\t- Favoris et groupes (catégorisation, suppression, gestion) \n\t- Explorateur GPX dans l\'application (voir les itinéraires, distance, vitesse moyenne, altitude, etc.) \n\t- Navigation GPX (options utiles, continuer un itinéraire après plantage, identification des rond-points) -\n\t- Fonction d\'enregistrement des itinéraires au format GPX pour utilisation ultérieure hors ligne +\n\t- Fonction d\'enregistrement des itinéraires au format GPX pour utilisation ultérieure hors-ligne \n\t- Amélioration gestion GPX (filtrage emplacements imprécis et enregistrement de la précision, altitude et vitesse) \n\t- Téléchargement des traces GPX à la communauté OSM (http://download.osmand.net/gpx/) \n\t- Améliorations du rendu vectoriel @@ -181,7 +181,7 @@ Autres Pas nécessaire La carte mondiale de base est absente (couvrant le monde entier à faible zoom). Pensez à télécharger World_basemap_x.obf pour avoir un environnement complet. - Il n\'y a pas de cartes (\'hors-ligne\') sur la carte SD. Pensez à en télécharger pour utiliser OsmAnd hors ligne. + Il n\'y a pas de cartes (\'hors-ligne\') sur la carte SD. Pensez à en télécharger pour utiliser OsmAnd hors-ligne. \n\nAppui long pour afficher sur la carte \nVitesse moyenne : %1$s \nVitesse maximum : %2$s @@ -193,7 +193,7 @@ %1$d sur %2$d éléments restaurés. Pas d\'éléments à %1$s Vous allez %1$s %2$s éléments. Continuer ? - Gestionnaire de données hors ligne + Gestionnaire de données hors-ligne Restaurer Sauvegarder Supprimer @@ -279,7 +279,7 @@ Lieux favoris "Les points utilisés fréquemment peuvent être enregistrés en tant que favoris. -\n\tPour créer un favori, aller dans le menu contextuel de la carte, sélectionnez l\'option \'Ajouter aux favoris\' et saisissez un nom adapté. Après enregistrement, ce lieu est facilement accessible par \'Menu\' → \'Favoris\'. +\n\tPour créer un favori, allez dans le menu contextuel de la carte, sélectionnez l\'option \'Ajouter aux favoris\' et saisissez un nom adapté. Après enregistrement, ce lieu est facilement accessible par \'Menu\' → \'Favoris\'. \n\tUn appui court sur un favori dans le menu \'Favoris\' permet de créer un itinéraire pour s\'y rendre. \n\tPour afficher tous les favoris sur la carte, activer la couche \'Favoris\' dans \'Menu\' → \'Couches\'. " OSM en ligne classification des cartes en images @@ -287,7 +287,7 @@ Ne peut interpréter le geo intent:\'%s\' Recherche d\'adresses dans les cartes hors-ligne Système - Changer la langue d\'affichage + Sélectionner la langue d\'affichage Langue d\'affichage Source de cartes @@ -318,7 +318,7 @@ Suivant Précédent - Modifier les unités de distance et vitesse + Sélectionner les unités de distance et vitesse à utiliser Unités de mesure Miles/pieds Miles/yards @@ -338,7 +338,7 @@ Territoire Obstacle Éducation - Urgence + Urgences Divertissement Argent Géocache @@ -405,7 +405,7 @@ Sélectionner tout Recharger Itinéraire le plus rapide - Activer pour calculer l\'itinéraire le plus rapide et désactiver pour calculer le plus court. + Activer pour calculer l\'itinéraire le plus rapide et désactiver pour calculer le plus court Le zoom {0} télécharge {1} carreaux ({2} Mb ) Télécharger la carte Sélectionnez le zoom maximum pour précharger la zone visible @@ -479,20 +479,20 @@ Utiliser le pointeur Configurer le délai d\'attente pour déterminer l\'emplacement Délai d\'attente - Arrêter le service de navigation en arrière plan + Arrêter le service de navigation en arrière-plan Où suis-je ? Service de navigation OsmAnd Réseau GPS secondes min. - Choisir un intervalle d\'actualisation de votre position dans le service en arrière plan + Choisir un intervalle d\'actualisation de votre position dans le service en arrière-plan Intervalle de positionnement - Choisir un fournisseur de géolocalisation pour le service arrière plan + Choisir un fournisseur de géolocalisation pour le service arrière-plan Fournisseur de géolocalisation Activer le service en arrière-plan pour suivre votre position en continu Service de positionnement - Le service d\'arrière plan requiert l\'activation de la géolocalisation. + Le service d\'arrière-plan requiert l\'activation de la géolocalisation. Masquer le filtre Afficher le filtre Filtre @@ -531,26 +531,26 @@ Paysage, portrait, ou selon la position de l\'appareil Le format des heures d\'ouverture n\'est pas supporté pour l\'édition Ajouter une nouvelle règle - Routes + Lignes Arrêt arrêts - Chercher la route suivante - Chercher la route précédente + Chercher l\'itinéraire suivant + Chercher l\'itinéraire précédent Terminer la recherche - Sélectionnez arrêt pour sortir - à faire après - à faire avant - arrêts à faire + Sélectionnez la destination + reste à parcourir + distance préliminaire + nombre d\'arrêts : Distance du trajet Transport OK - Afficher les arrêts des transports publics sur la carte - Afficher les arrêts des transports + Afficher les arrêts de transport en commun sur la carte + Afficher les arrêts de transport public Application de navigation OsmAnd Mise à jour des données PI réussie ({0} ont été chargés) Erreur de mise à jour des index locaux Erreur lors du chargement des données du serveur - Il n\'y a pas de données hors ligne pour cette région + Il n\'y a pas de données hors-ligne pour cette région Mise à jour de PI n\'est pas disponible pour un petit niveau de zoom Points d\'Intérêts Mettre à jour les données locales depuis internet ? @@ -568,7 +568,7 @@ Recherche de l\'adresse… Recherche de l\'adresse via OSM Nominatim Numéro de la maison, rue, ville - Hors ligne + Hors-ligne Internet Niveau de zoom maximum Choisir un niveau de zoom maximum pour le téléchargement @@ -639,9 +639,9 @@ Zoom auto. sur la carte Paramètres supplémentaires Paramètres - Enregistrer la trace actuelle sur carte SD + Enregistrer la trace actuelle sur la carte SD Enregistrer la trace GPX - Choisir l\'intervalle d\'enregistrement de la trace + Choisir l\'intervalle d\'enregistrement pour la trace Intervalle d\'enregistrement Les traces seront enregistrées et groupées par jour dans le répertoire des traces Enregistrer la trace dans un fichier GPX @@ -669,7 +669,7 @@ Afficher PI sur la carte (utiliser le dernier filtre) Afficher PI Choisir la source des tuiles de carte (en ligne ou en cache) - Source des cartes + Source de la carte Source cartographique Utiliser internet Afficher l\'emplacement @@ -778,10 +778,10 @@ Carte mondiale de base requise pour le bon fonctionnement, sélectionnée pour téléchargement. Activer le greffon des cartes en ligne pour sélectionner différentes sources de cartes - Cartes en ligne (tuiles) - Utiliser les cartes en ligne (télécharger et conserver en cache les tuiles de carte sur la carte SD) + Carte en ligne (tuiles) + Utiliser une carte en ligne (télécharger et conserver en cache les tuiles de carte sur la carte SD) Cartes en ligne - Configurer la source des cartes en ligne ou en cache + Configurer la source de la carte en ligne ou en cache - Paramètres des cartes Configurer l\'affichage des cartes Ce greffon permet d\'accéder à une grande gamme de cartes sous forme de tuiles téléchargées ou conservées en cache, utilisables comme carte de base, fond de carte, ou sur-couche. Les cartes peuvent également être préparées hors-ligne et copiées dans le dossier OsmAnd. @@ -796,8 +796,8 @@ Les greffons fournissent à l\'application des fonctionnalités supplémentaires, telles que l\'enregistrement des traces, l\'utilisation de cartes en ligne, le fonctionnement en arrière-plan, le mode accessibilité et bien d\'autres. Gestionnaire de greffons Changements en 0.8.0 : -\n\t- *Fonctionnalité des greffons*\n\t- La majorité des fonctionnalités sont regroupées par familles et peuvent être activées/désactivées dans le Gestionnaire de Greffons. Vous pouvez activer les sources de cartes image (en ligne ou en cache), les paramètres de suivi en ligne et autres nouvelles possibilités.\n\t- *Nouvelles cartes hors ligne*\n\t- Le rendu des cartes devient plus rapide et précis (les côtes et zones d\'eau sont corrigées).\n\t- Vous devez re-télécharger toutes les données de cartes hors-ligne, car les anciennes cartes ne fonctionnent plus.\n\t- *Calcul d\'itinéraire hors-ligne*\n\t- Le calcul d\'itinéraire hors ligne devient beaucoup plus stable\n\t- *Utilisation et ergonomie*\n\t- Améliorée dans de nombreux domaines - Ce greffon permet de gérer la contribution à OpenStreetMap (OSM) telle que la collection / modification de points d\'intérêt OSM, l\'ouverture / commentaires de bogues OSM et la contribution de traces GPX (nécessite un compte OSM). +\n\t- *Fonctionnalité des greffons*\n\t- La majorité des fonctionnalités sont regroupées par familles et peuvent être activées/désactivées dans le Gestionnaire de Greffons. Vous pouvez activer les sources de cartes image (en ligne ou en cache), les paramètres de suivi en ligne et autres nouvelles possibilités.\n\t- *Nouvelles cartes hors-ligne*\n\t- Le rendu des cartes devient plus rapide et précis (les côtes et zones d\'eau sont corrigées).\n\t- Vous devez re-télécharger toutes les données de cartes hors-ligne, car les anciennes cartes ne fonctionnent plus.\n\t- *Calcul d\'itinéraire hors-ligne*\n\t- Le calcul d\'itinéraire hors-ligne devient beaucoup plus stable\n\t- *Utilisation et ergonomie*\n\t- Améliorée dans de nombreux domaines + Ce greffon gère la contribution à OpenStreetMap (OSM), comme la création ou modification de points d\'intérêt OSM, l\'ouverture ou le commentaire de bogues OSM, et l\'envoi de traces GPX (nécessite un compte OSM). Cartes vectorielles (hors-ligne) peuvent s\'afficher plus rapidement. Peut ne pas fonctionner sur certains appareils. Diffuse les commandes sonores disponibles pour la voix sélectionnée @@ -806,7 +806,7 @@ Tester les commandes vocales Changements en 0.7.2 : -\n\t- Rendu pré-compilé pour tous les appareils\n\t- Édition hors ligne des PI\n\t- Accessibilité\n\t- Corrections de bogues +\n\t- Rendu pré-compilé pour tous les appareils\n\t- Édition hors-ligne des PI\n\t- Accessibilité\n\t- Corrections de bogues Envoyer les traces GPX à OSM ? Visibilité Libellés @@ -991,7 +991,7 @@ Éviter les voies non revêtues Éviter les ferries Éviter… -Éviter péages, voies non carrossables, ferries, autoroutes +Éviter péages, voies non revêtues, ferries, autoroutes Annonces visuelles… Afficher les avertissements (limitations de vitesse, stops, ralentisseurs, radars), les voies de circulation Itinéraires fluorescents @@ -1014,9 +1014,9 @@ En continu \tVous pouvez modifier l\'orientation de la carte par un appui court sur l\'icône de la boussole \n\tLes choix sont : -\n\t\'Ne pas tourner (nord vers le haut)\' - La carte ne changera pas d\'orientation, le nord sera toujours vers le haut. +\n\t\'Ne pas tourner (nord vers le haut)\' - La carte ne change pas d\'orientation, le nord est toujours vers le haut. \n\t\'Direction du déplacement\' - La carte est continuellement alignée dans la direction du déplacement. -\n\t\'Boussole\' - La carte est continuellement alignée sur la valeur de la boussole. +\n\t\'Boussole\' - La carte est continuellement alignée sur les informations de la boussole. "\tLe style de la carte peut, pour certaines cartes vectorielles, être modifié selon qu\'il fait jour (plus clair) ou nuit (plus sombre) \n\tLes couleurs de nuit sont plus sûres pour la conduite nocturne \n\tVous pouvez changer de règle pour la bascule jour/nuit dans \'Menu\' → \'Configurer l\'écran\' → \'Mode jour/nuit\'. @@ -1025,8 +1025,8 @@ \n\t\'Jour\' - Toujours utiliser le mode jour \n\t\'Nuit\' - Toujours utiliser le mode nuit \n\t\'Détection de la luminosité\' - Bascule contrôlée par le capteur de luminosité de votre appareil, s\'il existe " -OsmAnd est un logiciel libre de navigation pouvant fonctionner avec des cartes hors ligne ou en ligne. -OsmAnd est un logiciel libre de navigation pouvant fonctionner avec des cartes hors ligne ou en ligne +OsmAnd est un logiciel libre de navigation pouvant fonctionner avec des cartes hors-ligne ou en ligne. +OsmAnd est un logiciel libre de navigation pouvant fonctionner avec des cartes hors-ligne ou en ligne "Changements en 0.8.3 : \n* Points intermédiaires \n* Amélioration des instructions de navigation @@ -1036,8 +1036,8 @@ \n* Nombreuses corrections de bugs " Coller à la route pendant la navigation Coller à la route -" OsmAnd (OSM Automated Navigation Directions) OsmAnd est un logiciel libre de navigation exploitant une grande variété de données issues OpenStreetMap (OSM). Toutes les données (cartes vectorielles ou à base de tuiles) peuvent être stockées dans la mémoire du téléphone pour un usage hors ligne. OsmAnd permet également le routage en ligne et hors ligne avec des instructions vocales pas à pas. Fonctionnalités principales : - Fonctionne complètement hors ligne (stockage des cartes téléchargées au format vectoriel ou tuile dans un répertoire paramétrable) - Cartes hors lignes compactes disponibles pour le monde entier - Téléchargement des cartes pour un pays ou une région directement depuis l\'application - Possibilité de superposer plusieurs couches, telles que des traces GPX ou de navigation, des points d\'intérêt (PI), des favoris, des courbes de niveau, les arrêts de transport en commun, et bien d\'autres cartes avec une transparence personnalisable - Recherche hors ligne d\'adresses et de lieux (PI) - Navigation hors ligne pour de courtes distances (expérimentale) - Mode voiture, vélo et piéton avec : - Option de vue jour/nuit automatique - Option de zoom automatique lors des déplacements - Orientation automatique de la carte (fixe, boussole, cap) Limitations de la version gratuite de OsmAnd : - Nombre de téléchargement de cartes limité - Pas d\'accès aux PI Wikipédia hors ligne. OsmAnd est activement développé et notre projet et ses progrès futurs dépendent des contributions financières pour financer le développement et le test de nouvelles fonctionnalités. Veuillez considérer l\'achat d\'OsmAnd+, le financement d\'une fonctionnalité spécifique, ou un donation sur osmand.net. " -" OsmAnd+ (OSM Automated Navigation Directions) OsmAnd+ est un logiciel libre de navigation exploitant une grande variété de données issues OpenStreetMap (OSM). Toutes les données (cartes vectorielles ou à base de tuiles) peuvent être stockées dans la mémoire du téléphone pour un usage hors ligne. OsmAnd permet également le routage en ligne et hors ligne avec des instructions vocales pas à pas. OsmAnd+ est la version payante de l\'application, en l\'achetant vous supportez le projet, financez le développement de nouvelles fonctionnalités, et recevez les dernières mises à jour. Fonctionnalités principales : - Fonctionne complètement hors ligne (stockage des cartes téléchargées au format vectoriel ou tuile dans un répertoire paramétrable) - Cartes hors lignes compactes disponibles pour le monde entier - Téléchargement illimité des cartes pour un pays ou une région directement depuis l\'application - Points d\'intérêt (PI) Wikipédia hors ligne, parfait pour le tourisme - Possibilité de superposer plusieurs couches, telles que des traces GPX ou de navigation, des points d\'intérêt, des favoris, des courbes de niveau, les arrêts de transport en commun, et bien d\'autres cartes avec une transparence personnalisable - Recherche hors ligne d\'adresses et de lieux (PI) - Navigation hors ligne pour de courtes distances (expérimentale) - Mode voiture, vélo et piéton avec : - Option de vue jour/nuit automatique - Option de zoom automatique lors des déplacements - Orientation automatique de la carte (fixe, boussole, cap) - Affichage des limitations de vitesse, voix enregistrées et voix de synthèse" +" OsmAnd (OSM Automated Navigation Directions) OsmAnd est un logiciel libre de navigation exploitant une grande variété de données issues OpenStreetMap (OSM). Toutes les données (cartes vectorielles ou à base de tuiles) peuvent être stockées dans la mémoire du téléphone pour un usage hors-ligne. OsmAnd permet également le routage en ligne et hors-ligne avec des instructions vocales pas à pas. Fonctionnalités principales : - Fonctionne complètement hors-ligne (stockage des cartes téléchargées au format vectoriel ou tuile dans un répertoire paramétrable) - Cartes hors-lignes compactes disponibles pour le monde entier - Téléchargement des cartes pour un pays ou une région directement depuis l\'application - Possibilité de superposer plusieurs couches, telles que des traces GPX ou de navigation, des points d\'intérêt (PI), des favoris, des courbes de niveau, les arrêts de transport en commun, et bien d\'autres cartes avec une transparence personnalisable - Recherche hors-ligne d\'adresses et de lieux (PI) - Navigation hors-ligne pour de courtes distances (expérimentale) - Mode voiture, vélo et piéton avec : - Option de vue jour/nuit automatique - Option de zoom automatique lors des déplacements - Orientation automatique de la carte (fixe, boussole, cap) Limitations de la version gratuite de OsmAnd : - Nombre de téléchargement de cartes limité - Pas d\'accès aux PI Wikipédia hors-ligne. OsmAnd est activement développé et notre projet et ses progrès futurs dépendent des contributions financières pour financer le développement et le test de nouvelles fonctionnalités. Veuillez considérer l\'achat d\'OsmAnd+, le financement d\'une fonctionnalité spécifique, ou un donation sur osmand.net. " +" OsmAnd+ (OSM Automated Navigation Directions) OsmAnd+ est un logiciel libre de navigation exploitant une grande variété de données issues OpenStreetMap (OSM). Toutes les données (cartes vectorielles ou à base de tuiles) peuvent être stockées dans la mémoire du téléphone pour un usage hors-ligne. OsmAnd permet également le routage en ligne et hors-ligne avec des instructions vocales pas à pas. OsmAnd+ est la version payante de l\'application, en l\'achetant vous supportez le projet, financez le développement de nouvelles fonctionnalités, et recevez les dernières mises à jour. Fonctionnalités principales : - Fonctionne complètement hors-ligne (stockage des cartes téléchargées au format vectoriel ou tuile dans un répertoire paramétrable) - Cartes es compactes disponibles pour le monde entier - Téléchargement illimité des cartes pour un pays ou une région directement depuis l\'application - Points d\'intérêt (PI) Wikipédia hors-ligne, parfait pour le tourisme - Possibilité de superposer plusieurs couches, telles que des traces GPX ou de navigation, des points d\'intérêt, des favoris, des courbes de niveau, les arrêts de transport en commun, et bien d\'autres cartes avec une transparence personnalisable - Recherche hors-ligne d\'adresses et de lieux (PI) - Navigation hors-ligne pour de courtes distances (expérimentale) - Mode voiture, vélo et piéton avec : - Option de vue jour/nuit automatique - Option de zoom automatique lors des déplacements - Orientation automatique de la carte (fixe, boussole, cap) - Affichage des limitations de vitesse, voix enregistrées et voix de synthèse" \tLa source des cartes et des couches affichées est modifiable via \'Menu\' -> \'Couches\'. \n\tDans \'Source de la carte…\' vous pouvez choisir entre les cartes vectorielles préchargées (choix par défaut, nécessaires pour la navigation hors-ligne), ou des sources prédéfinies de tuiles de carte en ligne ou en cache (activer le greffon \'Cartes en ligne\' pour cela), ou des cartes créées manuellement sur un PC grâce à OsmAndMapCreator. \n\tOsmAnd supporte également des sources personnalisées. @@ -1064,7 +1064,7 @@ Mode avancé… Parking Urgences - Transports publics + Transports en commun Divertissements Restauration Tourisme @@ -1082,7 +1082,7 @@ L\'appplication ZXing Barcode Scanner n\'est pas installée. La chercher dans Market ? Clôturer les modifications Le service OsmAnd tourne toujours en tâche de fond. Voulez-vous l\'arrêter ? - "Changements en 1.0 :\n\t* Amélioration de la navigation, plus rapide et plus précise (jusqu\'à 250 km)\n\t* Cartographie des routes\n\t* La carte ne perd plus la position courante après les interruptions\n\t* Active le service d\'arrière plan pendant la navigation " + "Changements en 1.0 :\n\t* Amélioration de la navigation, plus rapide et plus précise (jusqu\'à 250 km)\n\t* Cartographie des routes\n\t* La carte ne perd plus la position courante après les interruptions\n\t* Active le service d\'arrière-plan pendant la navigation " Exécuter l\'application dans le mode sûr (ne pas utiliser de code natif). Mode sûr L\'application s\'exécute en mode sûr (désactiver le dans les paramètres). @@ -1110,17 +1110,17 @@ Le greffon OsMoDroid est une extension OsmAnd pour l\'application OsMoDroid qui permet la création de traces. Pour plus d\'information à propos du service, consulter le site http://esya.ru. Greffon OsMoDroid Courbes de niveau - Ce greffon permet de télécharger les courbes de niveaux (Téléchargement de cartes -> Menu -> Autres cartes) pour une région spécifique et de les utiliser avec les cartes hors-ligne. - Greffon des courbes de niveau + Ce greffon permet de télécharger les courbes de niveaux (\'Paramètres\' → \'Données hors-ligne\' → \'Télécharger des donées hors-ligne\', sélectionner \'Courbes de niveau\' dans le menu) pour une région spécifique, et de les utiliser avec les cartes hors-ligne. + Courbes de niveau Autres cartes Courbes de niveau parties -L\'emplacement à associer à la note n\'est pas encore défini. \"Utiliser l\'emplacement ...\" pour attribuer une note à l\'emplacement spécifié +L\'emplacement à associer à la note n\'est pas encore défini. Utilisez le menu contextuel de la carte pour associer à la note l\'emplacement ainsi spécifié. arrêter Notes audio - Prendre des notes audio/vidéo durant le voyage + Ce greffon permet de prendre des notes audio/vidéo/photo durant le voyage Notes audio/vidéo Greffon OsmAnd pour les courbes de niveau hors-ligne @@ -1135,7 +1135,7 @@ Sélectionner le format vidéo de sortie Format d\'enregistrement vidéo de sortie Utiliser l\'application système pour les vidéos - Option caméra vidéo + Option caméra Configurer les paramètres audio et vidéo Paramètres audio/vidéo Une erreur s\'est produite lors de l\'enregistrement @@ -1147,7 +1147,7 @@ non disponible Prendre une note audio Prendre une note vidéo - Couche d\'enregistrements + Enregistrements L\'enregistrement ne peut pas être lu Supprimer l\'enregistrement Lire @@ -1193,7 +1193,7 @@ \n * Corrections de bogues (navigation, recherche, enregistrement vidéo, instructions vocales, améliorations d\\\'affichage)\n * Configuration plus facile de la couche d\\\'ombrage de relief (nécessite le greffon des courbes de niveau)\n * Accepte les liens de positions de maps.google.com\n * Nouveau widget (GPS info)\n * Ajout support multi-fenêtre pour les appareils Samsung récents\n * Filtre Kalman pour la boussole\n * Support des montres Pebble" Aucun(e) - Autoroutes de préférence + Privilégier les autoroutes Privilégier… Autoroutes de préférence Sélectionner sur demande @@ -1294,7 +1294,7 @@ Commencer à modifier Finir de modifier Sauvegarder comme GPX - Ouvrir une fichier GPX existant + Ouvrir un fichier GPX existant Veuillez attendre jusqu\'à ce que la tâche actuelle soit terminée temps précision @@ -1302,8 +1302,8 @@ altitude nom du fichier GPX Sauvegarde du fichier GPX à {0} réussi - Créer un chemin pour mesurer la distance entre des points, ouvrir un fichier GPX existant pour le modifier et le sauvegarder. Peut être utilisé pour préparer un itinéraire avec un fichier GPX. - Calculatrice de Distance & Outil de Planification + Ce greffon permet de créer un chemin (ou d\'ouvrir et modifier un fichier GPX existant) pour mesurer la distance entre des points, et de le sauvegarder au format GPX. Peut être utilisé pour préparer un itinéraire GPX. + Mesure de distance et outil de planification Ne plus montrer Fichier de modifications OSM %1$s généré avec succès Échec de la sauvegarde des modifications OSM @@ -1332,7 +1332,7 @@ Styles de cartes À propos Note de version, licences, membres du projet - Astuces + Aide Zooms téléchargés: %1$s Expire (minutes): %1$s Téléchargeable: %1$s @@ -1373,16 +1373,16 @@ \nTemps en déplacement : %1$d:%2$02d:%3$02d Destination %1$s Mot de passe OSM (optionnel) - Type de focus - Sélectionner le type de focus de l\'appareil photo - Focus automatique - Focus hyperfocal - Profondeur de champ étendu (EDOF) - Le focus est réglé à l\'infini - Mode focus macro + Mise au point + Sélectionner le type de mise au point de l\'appareil photo + Mise au point automatique + Hyperfocale + Profondeur de champ étendue (EDOF) + À l\'infini + Mode macro L\'appareil photo essaie continuellement de faire la mise au point - Jouer un son lors de la prise de photos - Choisir de jouer un son lors de la prise de photos + Émettre un son lors de la prise de photos + Choisir d\'émettre un son lors de la prise de photos @@ -1416,7 +1416,7 @@ Zoom éloigné Zoom très éloigné OsmAnd permet l\'affichage des cartes vectorielles hors-ligne selon différents styles de rendu en fonction de vos besoins. - \n\nÀ la place du style de rendu \'default\', vous pouvez dans \'Menu\' → \'Configurer l'\écran\' → \'Styles de rendu\' sélectionner par exemple : + \n\nÀ la place du style de rendu \'default\', vous pouvez dans \'Menu\' → \'Configurer l\'écran\' → \'Styles de rendu\' sélectionner par exemple : \n\t* le style \'Touring view\', qui fournit les informations les plus détaillées possibles pour le voyage et le tourisme, incluant des optimisations pour les conducteurs professionnels (contraste élevé, diverses routes bien distinguables). \n\t* \'High contrast roads\' affiche les routes avec des couleurs très accentuées pour les situations de forte luminosité. \n\t* \'Cycle-map\' est optimisé pour l\'affichage des routes pour cyclistes. From b0442193ca89cb485713d51d0b1d23efa658d949 Mon Sep 17 00:00:00 2001 From: vshcherb Date: Thu, 10 Apr 2014 01:45:15 +0200 Subject: [PATCH 04/29] Update contribution activity --- .../plus/activities/SettingsActivity.java | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/activities/SettingsActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsActivity.java index b1d7a00c04..cef4b0611c 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsActivity.java @@ -143,19 +143,23 @@ public class SettingsActivity extends SettingsBaseActivity { edition = getString(R.string.local_index_installed) + " :\t" + DateFormat.getDateFormat(getApplicationContext()).format(date); } catch (Exception e) { } + SpannableString content = new SpannableString(vt + version +"\n" + + edition +"\n\n"+ + getString(R.string.about_content)); + content.setSpan(new ClickableSpan() { + @Override + public void onClick(View widget) { + final Intent mapIntent = new Intent(SettingsActivity.this, ContributionVersionActivity.class); + startActivityForResult(mapIntent, 0); + } + + }, st, st + version.length(), 0); + tv.setText(content); + } else { + tv.setText(vt + version +"\n\n" + + getString(R.string.about_content)); } - SpannableString content = new SpannableString(vt + version +"\n" + - edition +"\n\n"+ - getString(R.string.about_content)); - content.setSpan(new ClickableSpan() { - @Override - public void onClick(View widget) { - final Intent mapIntent = new Intent(SettingsActivity.this, ContributionVersionActivity.class); - startActivityForResult(mapIntent, 0); - } - - }, st, st + version.length(), 0); - tv.setText(content); + tv.setPadding(5, 0, 5, 5); tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 19); tv.setMovementMethod(LinkMovementMethod.getInstance()); From 3fe967d797e9f56a3cca3402d8e9d95880c02d3b Mon Sep 17 00:00:00 2001 From: vshcherb Date: Fri, 11 Apr 2014 01:04:08 +0200 Subject: [PATCH 05/29] Update collator --- OsmAnd-java/src/net/osmand/PlatformUtil.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd-java/src/net/osmand/PlatformUtil.java b/OsmAnd-java/src/net/osmand/PlatformUtil.java index c7c6145615..a3517ff0ba 100644 --- a/OsmAnd-java/src/net/osmand/PlatformUtil.java +++ b/OsmAnd-java/src/net/osmand/PlatformUtil.java @@ -30,7 +30,8 @@ public class PlatformUtil { public static net.osmand.Collator primaryCollator() { // romanian locale encounters diacritics as differnet symbols - final java.text.Collator instance = Locale.getDefault().getLanguage().equals("ro") ? java.text.Collator.getInstance(Locale.US) + final java.text.Collator instance = Locale.getDefault().getLanguage().equals("ro") || + Locale.getDefault().getLanguage().equals("sk")? java.text.Collator.getInstance(Locale.US) : java.text.Collator.getInstance(); instance.setStrength(java.text.Collator.PRIMARY); return wrapCollator(instance); From e316c81d6f60c56fe3d896dcb4c797e93a6d411d Mon Sep 17 00:00:00 2001 From: vshcherb Date: Fri, 11 Apr 2014 18:17:11 +0200 Subject: [PATCH 06/29] Remove client context interface --- OsmAnd/src/net/osmand/plus/ClientContext.java | 1 + .../net/osmand/plus/FavouritesDbHelper.java | 4 +- OsmAnd/src/net/osmand/plus/GPXUtilities.java | 2 +- .../net/osmand/plus/NavigationService.java | 7 ++- .../net/osmand/plus/OsmandApplication.java | 19 +++++++ OsmAnd/src/net/osmand/plus/Version.java | 38 +++++++------- .../activities/DownloadIndexActivity.java | 11 ++-- .../activities/SettingsGeneralActivity.java | 3 +- .../search/SearchAddressOnlineFragment.java | 2 +- .../osmand/plus/api/InternalOsmAndAPI.java | 18 ------- .../plus/api/InternalOsmAndAPIImpl.java | 50 ------------------- .../plus/download/DownloadFileHelper.java | 5 +- .../plus/download/DownloadIndexesThread.java | 2 +- .../download/DownloadOsmandIndexesHelper.java | 2 +- .../osmand/plus/download/DownloadTracker.java | 20 ++++---- .../net/osmand/plus/download/IndexItem.java | 3 +- .../plus/download/IndexItemCategory.java | 3 +- .../osmand/plus/routing/RouteProvider.java | 7 ++- .../osmand/plus/routing/RoutingHelper.java | 4 +- .../voice/AbstractPrologCommandPlayer.java | 5 +- .../plus/voice/MediaCommandPlayerImpl.java | 3 +- 21 files changed, 83 insertions(+), 126 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/ClientContext.java b/OsmAnd/src/net/osmand/plus/ClientContext.java index 48cbd8c6b4..082aedae2c 100644 --- a/OsmAnd/src/net/osmand/plus/ClientContext.java +++ b/OsmAnd/src/net/osmand/plus/ClientContext.java @@ -48,4 +48,5 @@ public interface ClientContext { public Location getLastKnownLocation(); + } diff --git a/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java b/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java index 25eebff4a0..a0ce8ab24b 100644 --- a/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java +++ b/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java @@ -37,10 +37,10 @@ public class FavouritesDbHelper { private List favoritePointsFromGPXFile = null; private List cachedFavoritePoints = new ArrayList(); private Map> favoriteGroups = null; - private final ClientContext context; + private final OsmandApplication context; private SQLiteConnection conn; - public FavouritesDbHelper(ClientContext context) { + public FavouritesDbHelper(OsmandApplication context) { this.context = context; } diff --git a/OsmAnd/src/net/osmand/plus/GPXUtilities.java b/OsmAnd/src/net/osmand/plus/GPXUtilities.java index ab4e459f88..75c5ff54bd 100644 --- a/OsmAnd/src/net/osmand/plus/GPXUtilities.java +++ b/OsmAnd/src/net/osmand/plus/GPXUtilities.java @@ -173,7 +173,7 @@ public class GPXUtilities { } - public static String writeGpxFile(File fout, GPXFile file, ClientContext ctx) { + public static String writeGpxFile(File fout, GPXFile file, OsmandApplication ctx) { FileOutputStream output = null; try { SimpleDateFormat format = new SimpleDateFormat(GPX_TIME_FORMAT); diff --git a/OsmAnd/src/net/osmand/plus/NavigationService.java b/OsmAnd/src/net/osmand/plus/NavigationService.java index f4e4e29b50..d2f86e4426 100644 --- a/OsmAnd/src/net/osmand/plus/NavigationService.java +++ b/OsmAnd/src/net/osmand/plus/NavigationService.java @@ -117,8 +117,7 @@ public class NavigationService extends Service implements LocationListener { public int onStartCommand(Intent intent, int flags, int startId) { handler = new Handler(); OsmandApplication app = (OsmandApplication) getApplication(); - ClientContext cl = app; - settings = cl.getSettings(); + settings = app.getSettings(); startedForNavigation = intent.getBooleanExtra(NAVIGATION_START_SERVICE_PARAM, false); if (startedForNavigation) { @@ -159,12 +158,12 @@ public class NavigationService extends Service implements LocationListener { // registering icon at top level // Leave icon visible even for navigation for proper display // if (!startedForNavigation) { - showNotificationInStatusBar(cl); + showNotificationInStatusBar(app); // } return START_REDELIVER_INTENT; } - private void showNotificationInStatusBar(ClientContext cl) { + private void showNotificationInStatusBar(OsmandApplication cl) { broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { diff --git a/OsmAnd/src/net/osmand/plus/OsmandApplication.java b/OsmAnd/src/net/osmand/plus/OsmandApplication.java index 849190e856..e596769774 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandApplication.java +++ b/OsmAnd/src/net/osmand/plus/OsmandApplication.java @@ -56,6 +56,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageInfo; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Configuration; import android.graphics.Shader.TileMode; import android.graphics.drawable.BitmapDrawable; @@ -841,4 +842,22 @@ public class OsmandApplication extends Application implements ClientContext { } return ((AccessibilityManager) getSystemService(Context.ACCESSIBILITY_SERVICE)).isEnabled(); } + + public String getVersionName() { + try { + PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), 0); + return info.versionName; + } catch (NameNotFoundException e) { + return ""; + } + } + + public int getVersionCode() { + try { + PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), 0); + return info.versionCode; + } catch (NameNotFoundException e) { + return 0; + } + } } diff --git a/OsmAnd/src/net/osmand/plus/Version.java b/OsmAnd/src/net/osmand/plus/Version.java index 3e46375fe9..c272cd8962 100644 --- a/OsmAnd/src/net/osmand/plus/Version.java +++ b/OsmAnd/src/net/osmand/plus/Version.java @@ -11,19 +11,19 @@ public class Version { private final static String FREE_VERSION_NAME = "net.osmand"; - public static boolean isGpsStatusEnabled(ClientContext ctx) { + public static boolean isGpsStatusEnabled(OsmandApplication ctx) { return ctx.getString(R.string.versionFeatures).contains("+gps_status") && !isBlackberry(ctx); } - public static boolean isBlackberry(ClientContext ctx) { + public static boolean isBlackberry(OsmandApplication ctx) { return ctx.getString(R.string.versionFeatures).contains("+blackberry"); } - public static boolean isMarketEnabled(ClientContext ctx) { + public static boolean isMarketEnabled(OsmandApplication ctx) { return isGooglePlayEnabled(ctx) || isAmazonEnabled(ctx); } - public static String marketPrefix(ClientContext ctx) { + public static String marketPrefix(OsmandApplication ctx) { if (isAmazonEnabled(ctx)) { return "amzn://apps/android?p="; } else if (isGooglePlayEnabled(ctx)) { @@ -32,56 +32,56 @@ public class Version { return "http://osmand.net/apps?"; } - public static boolean isAmazonEnabled(ClientContext ctx) { + public static boolean isAmazonEnabled(OsmandApplication ctx) { return ctx.getString(R.string.versionFeatures).contains("+amazon"); } - public static boolean isGooglePlayEnabled(ClientContext ctx) { + public static boolean isGooglePlayEnabled(OsmandApplication ctx) { return ctx.getString(R.string.versionFeatures).contains("+play_market"); } - public static boolean isFreeVersionEnabled(ClientContext ctx) { + public static boolean isFreeVersionEnabled(OsmandApplication ctx) { return ctx.getString(R.string.versionFeatures).contains("+free_version"); } - public static boolean isParkingPluginInlined(ClientContext ctx) { + public static boolean isParkingPluginInlined(OsmandApplication ctx) { return ctx.getString(R.string.versionFeatures).contains("+parking_plugin"); } - private Version(ClientContext ctx) { + private Version(OsmandApplication ctx) { appVersion = ctx.getString(R.string.app_version); appName = ctx.getString(R.string.app_name); } private static Version ver = null; - private static Version getVersion(ClientContext ctx){ + private static Version getVersion(OsmandApplication ctx){ if(ver == null){ ver = new Version(ctx); } return ver; } - public static String getFullVersion(ClientContext ctx){ + public static String getFullVersion(OsmandApplication ctx){ Version v = getVersion(ctx); return v.appName + " " + v.appVersion; } - public static String getAppVersion(ClientContext ctx){ + public static String getAppVersion(OsmandApplication ctx){ Version v = getVersion(ctx); return v.appVersion; } - public static String getAppName(ClientContext ctx){ + public static String getAppName(OsmandApplication ctx){ Version v = getVersion(ctx); return v.appName; } - public static boolean isProductionVersion(ClientContext ctx){ + public static boolean isProductionVersion(OsmandApplication ctx){ Version v = getVersion(ctx); return !v.appVersion.contains("#"); } - public static String getVersionAsURLParam(ClientContext ctx) { + public static String getVersionAsURLParam(OsmandApplication ctx) { try { return "osmandver=" + URLEncoder.encode(getVersionForTracker(ctx), "UTF-8"); } catch (UnsupportedEncodingException e) { @@ -89,17 +89,17 @@ public class Version { } } - public static boolean isFreeVersion(ClientContext ctx){ - return ctx.getInternalAPI().getPackageName().equals(FREE_VERSION_NAME) || isFreeVersionEnabled(ctx); + public static boolean isFreeVersion(OsmandApplication ctx){ + return ctx.getPackageName().equals(FREE_VERSION_NAME) || isFreeVersionEnabled(ctx); } - public static boolean isDeveloperVersion(ClientContext ctx){ + public static boolean isDeveloperVersion(OsmandApplication ctx){ return "osmand~".equalsIgnoreCase(getAppName(ctx)); } - public static String getVersionForTracker(ClientContext ctx) { + public static String getVersionForTracker(OsmandApplication ctx) { String v = Version.getAppName(ctx); if(Version.isProductionVersion(ctx)){ v = Version.getFullVersion(ctx); diff --git a/OsmAnd/src/net/osmand/plus/activities/DownloadIndexActivity.java b/OsmAnd/src/net/osmand/plus/activities/DownloadIndexActivity.java index d74791808b..b2dd15933b 100644 --- a/OsmAnd/src/net/osmand/plus/activities/DownloadIndexActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/DownloadIndexActivity.java @@ -14,7 +14,6 @@ import java.util.TimeZone; import net.osmand.IndexConstants; import net.osmand.access.AccessibleAlertBuilder; import net.osmand.access.AccessibleToast; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; import net.osmand.plus.OsmandSettings; @@ -349,7 +348,7 @@ public class DownloadIndexActivity extends OsmandExpandableListActivity { filtered.add(fileItem); } } - listAdapter.setIndexFiles(filtered, IndexItemCategory.categorizeIndexItems(getClientContext(), filtered)); + listAdapter.setIndexFiles(filtered, IndexItemCategory.categorizeIndexItems(getMyApplication(), filtered)); listAdapter.notifyDataSetChanged(); } @@ -362,7 +361,7 @@ public class DownloadIndexActivity extends OsmandExpandableListActivity { IndexItem es = listAdapter.getChild(j, i); if (!getEntriesToDownload().containsKey(es)) { selected++; - getEntriesToDownload().put(es, es.createDownloadEntry(getClientContext(), type, new ArrayList(1))); + getEntriesToDownload().put(es, es.createDownloadEntry(getMyApplication(), type, new ArrayList(1))); } } } @@ -502,7 +501,7 @@ public class DownloadIndexActivity extends OsmandExpandableListActivity { return true; } - List download = e.createDownloadEntry(getClientContext(), type, new ArrayList()); + List download = e.createDownloadEntry(getMyApplication(), type, new ArrayList()); if (download.size() > 0) { // if(!fileToUnzip.exists()){ // builder.setMessage(MessageFormat.format(getString(R.string.download_question), baseName, extractDateAndSize(e.getValue()))); @@ -622,10 +621,6 @@ public class DownloadIndexActivity extends OsmandExpandableListActivity { - public ClientContext getClientContext() { - return getMyApplication(); - } - public void updateProgress(boolean updateOnlyProgress) { BasicProgressAsyncTask basicProgressAsyncTask = downloadListIndexThread.getCurrentRunningTask(); diff --git a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java index 3e6bbd9148..fc5e133bd3 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java @@ -13,6 +13,7 @@ import net.osmand.IndexConstants; import net.osmand.access.AccessibleToast; import net.osmand.plus.ApplicationMode; import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.OsmandSettings.DrivingRegion; import net.osmand.plus.OsmandSettings.MetricsConstants; @@ -185,7 +186,7 @@ public class SettingsGeneralActivity extends SettingsBaseActivity { } registerListPreference(settings.APPLICATION_MODE, screen, entries, appModes); - if (!Version.isBlackberry((ClientContext) getApplication())) { + if (!Version.isBlackberry((OsmandApplication) getApplication())) { PreferenceScreen cat = getPreferenceScreen(); int nav = getResources().getConfiguration().navigation; if (nav == Configuration.NAVIGATION_DPAD || nav == Configuration.NAVIGATION_TRACKBALL || diff --git a/OsmAnd/src/net/osmand/plus/activities/search/SearchAddressOnlineFragment.java b/OsmAnd/src/net/osmand/plus/activities/search/SearchAddressOnlineFragment.java index 8ed4783e84..01d8bac6cf 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/SearchAddressOnlineFragment.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/SearchAddressOnlineFragment.java @@ -165,7 +165,7 @@ public class SearchAddressOnlineFragment extends SherlockFragment implements Sea URL url = new URL(b.toString()); URLConnection conn = url.openConnection(); conn.setDoInput(true); - conn.setRequestProperty("User-Agent", Version.getFullVersion((ClientContext) getActivity().getApplication())); //$NON-NLS-1$ + conn.setRequestProperty("User-Agent", Version.getFullVersion((OsmandApplication) getActivity().getApplication())); //$NON-NLS-1$ conn.connect(); InputStream is = conn.getInputStream(); XmlPullParser parser = Xml.newPullParser(); diff --git a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPI.java b/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPI.java index b20b94eaaf..dc4bd69741 100644 --- a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPI.java +++ b/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPI.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.List; -import net.osmand.NativeLibrary; import net.osmand.ResultMatcher; import net.osmand.data.Amenity; import net.osmand.plus.PoiFilter; @@ -19,17 +18,8 @@ public interface InternalOsmAndAPI { public XmlPullParser newPullParser(); - public String getPackageName(); - - public String getVersionName(); - - public int getVersionCode(); - public InputStream openAsset(String name) throws IOException; - public NativeLibrary getNativeLibrary(); - - public List searchAmenities(PoiFilter filter, double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, double lat, double lon, ResultMatcher matcher); @@ -38,13 +28,6 @@ public interface InternalOsmAndAPI { double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, double lat, double lon, ResultMatcher matcher); - public String getDeviceName(); - - public String getBrandName(); - - public String getModelName(); - - public TargetPointsHelper getTargetPointsHelper(); public boolean isNavigationServiceStarted(); @@ -54,5 +37,4 @@ public interface InternalOsmAndAPI { public void stopNavigationService(); - } diff --git a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java b/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java index 778791f371..8351500243 100644 --- a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java +++ b/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java @@ -40,23 +40,12 @@ public class InternalOsmAndAPIImpl implements InternalOsmAndAPI { return Xml.newPullParser(); } - @Override - public String getPackageName() { - return app.getPackageName(); - } - @Override public InputStream openAsset(String name) throws IOException { return app.getAssets().open(name); } - @Override - public NativeLibrary getNativeLibrary() { - return NativeOsmandLibrary.getLoadedLibrary(); - } - - @Override public List searchAmenities(PoiFilter filter, double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, double lat, double lon, ResultMatcher matcher) { @@ -69,45 +58,6 @@ public class InternalOsmAndAPIImpl implements InternalOsmAndAPI { return app.getResourceManager().searchAmenitiesByName(searchQuery, topLatitude, leftLongitude, bottomLatitude, rightLongitude, lat, lon, matcher); } - @Override - public String getVersionName() { - try { - PackageInfo info = app.getPackageManager().getPackageInfo(app.getPackageName(), 0); - return info.versionName; - } catch (NameNotFoundException e) { - return ""; - } - } - - @Override - public int getVersionCode() { - try { - PackageInfo info = app.getPackageManager().getPackageInfo(app.getPackageName(), 0); - return info.versionCode; - } catch (NameNotFoundException e) { - return 0; - } - } - - @Override - public String getDeviceName() { - return Build.DEVICE; - } - - @Override - public String getBrandName() { - return Build.BRAND; - } - - @Override - public String getModelName() { - return Build.MODEL; - } - - @Override - public TargetPointsHelper getTargetPointsHelper() { - return app.getTargetPointsHelper(); - } @Override public boolean isNavigationServiceStarted() { diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java b/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java index 862e47c97e..06d0f34e59 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java @@ -15,6 +15,7 @@ import net.osmand.IProgress; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; import net.osmand.util.Algorithms; @@ -27,11 +28,11 @@ public class DownloadFileHelper { private static final int BUFFER_SIZE = 32256; protected static final int TRIES_TO_DOWNLOAD = 15; protected static final long TIMEOUT_BETWEEN_DOWNLOADS = 8000; - private final ClientContext ctx; + private final OsmandApplication ctx; private boolean interruptDownloading = false; - public DownloadFileHelper(ClientContext ctx){ + public DownloadFileHelper(OsmandApplication ctx){ this.ctx = ctx; } diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java index 5540419c25..3f91307e06 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java @@ -371,7 +371,7 @@ public class DownloadIndexesThread { String dt = uiActivity.getMyApplication().getResourceManager().getIndexFileNames().get(basemap.getTargetFileName()); if (!basemapExists || !Algorithms.objectEquals(dt, basemap.getDate())) { List downloadEntry = basemap - .createDownloadEntry(uiActivity.getClientContext(), uiActivity.getType(), + .createDownloadEntry(uiActivity.getMyApplication(), uiActivity.getType(), new ArrayList()); uiActivity.getEntriesToDownload().put(basemap, downloadEntry); AccessibleToast.makeText(uiActivity, R.string.basemap_was_selected_to_download, diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java b/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java index e09194e415..2c0cb84b3b 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java @@ -216,7 +216,7 @@ public class DownloadOsmandIndexesHelper { } @Override - public List createDownloadEntry(ClientContext ctx, DownloadActivityType type, List res) { + public List createDownloadEntry(OsmandApplication ctx, DownloadActivityType type, List res) { res.add(new DownloadEntry(this, assetName, destFile, dateModified)); return res; } diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadTracker.java b/OsmAnd/src/net/osmand/plus/download/DownloadTracker.java index 843f865791..e20925fae4 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadTracker.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadTracker.java @@ -13,24 +13,26 @@ import java.util.Map.Entry; import java.util.Random; import net.osmand.PlatformUtil; -import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.Version; import org.apache.commons.logging.Log; +import android.os.Build; + public class DownloadTracker { private static final Log log = PlatformUtil.getLog(DownloadTracker.class); - private Map getCustomVars(ClientContext ctx) { + private Map getCustomVars(OsmandApplication ctx) { Map map = new LinkedHashMap(); map.put("App", Version.getFullVersion(ctx)); - map.put("Device", ctx.getInternalAPI().getDeviceName()); - map.put("Brand", ctx.getInternalAPI().getBrandName()); - map.put("Model", ctx.getInternalAPI().getModelName()); - map.put("Package", ctx.getInternalAPI().getPackageName()); + map.put("Device", Build.DEVICE); + map.put("Brand", Build.BRAND); + map.put("Model", Build.MODEL); + map.put("Package", ctx.getPackageName()); - map.put("Version name", ctx.getInternalAPI().getVersionName()); - map.put("Version code", ctx.getInternalAPI().getVersionCode()+""); + map.put("Version name", ctx.getVersionName()); + map.put("Version code", ctx.getVersionCode()+""); return map; } @@ -41,7 +43,7 @@ public class DownloadTracker { static final String beaconUrl = "http://www.google-analytics.com/__utm.gif"; static final String analyticsVersion = "4.3"; // Analytics version - AnalyticsVersion - public void trackEvent(ClientContext a, + public void trackEvent(OsmandApplication a, String category, String action, String label, int value, String trackingAcount) { Map parameters = new LinkedHashMap(); try { diff --git a/OsmAnd/src/net/osmand/plus/download/IndexItem.java b/OsmAnd/src/net/osmand/plus/download/IndexItem.java index 94d951cc2a..15cc1c6478 100644 --- a/OsmAnd/src/net/osmand/plus/download/IndexItem.java +++ b/OsmAnd/src/net/osmand/plus/download/IndexItem.java @@ -15,6 +15,7 @@ import java.util.TimeZone; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; @@ -141,7 +142,7 @@ public class IndexItem implements Comparable { return size; } - public List createDownloadEntry(ClientContext ctx, DownloadActivityType type, + public List createDownloadEntry(OsmandApplication ctx, DownloadActivityType type, List downloadEntries) { String fileName = this.fileName; File parent = null; diff --git a/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java b/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java index d78392f494..d42500f9c7 100644 --- a/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java +++ b/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.TreeMap; import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; @@ -26,7 +27,7 @@ public class IndexItemCategory implements Comparable { return order < another.order ? -1 : 1; } - public static List categorizeIndexItems(ClientContext ctx, Collection indexItems) { + public static List categorizeIndexItems(OsmandApplication ctx, Collection indexItems) { boolean skipWiki = Version.isFreeVersion(ctx); final Map cats = new TreeMap(); for (IndexItem i : indexItems) { diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java index 88027fbe4c..02da021b7f 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java @@ -42,6 +42,7 @@ import net.osmand.plus.R; import net.osmand.plus.TargetPointsHelper; import net.osmand.plus.Version; import net.osmand.plus.activities.SettingsNavigationActivity; +import net.osmand.plus.render.NativeOsmandLibrary; import net.osmand.router.GeneralRouter; import net.osmand.router.GeneralRouter.GeneralRouterProfile; import net.osmand.router.GeneralRouter.RoutingParameter; @@ -612,14 +613,16 @@ public class RouteProvider { //cf.planRoadDirection = 1; } // BUILD context - RoutingContext ctx = router.buildRoutingContext(cf, params.ctx.getInternalAPI().getNativeLibrary(), files, + NativeOsmandLibrary lib = settings.SAFE_MODE.get() ? null : NativeOsmandLibrary.getLoadedLibrary(); + RoutingContext ctx = router.buildRoutingContext(cf, + lib, files, RouteCalculationMode.NORMAL); RoutingContext complexCtx = null; boolean complex = params.mode.isDerivedRoutingFrom(ApplicationMode.CAR) && !settings.DISABLE_COMPLEX_ROUTING.get() && precalculated == null; if(complex) { - complexCtx = router.buildRoutingContext(cf, params.ctx.getInternalAPI().getNativeLibrary(), files, + complexCtx = router.buildRoutingContext(cf, lib,files, RouteCalculationMode.COMPLEX); complexCtx.calculationProgress = params.calculationProgress; complexCtx.leftSideNavigation = params.leftSide; diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 4d8148b634..97491c645f 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -407,7 +407,7 @@ public class RoutingHelper { showMessage(app.getString(R.string.arrived_at_intermediate_point)); route.passIntermediatePoint(); - TargetPointsHelper targets = app.getInternalAPI().getTargetPointsHelper(); + TargetPointsHelper targets = app.getTargetPointsHelper(); List ns = targets.getIntermediatePointNames(); int toDel = targets.getIntermediatePoints().size() - route.getIntermediatePointsToPass(); int currentIndex = toDel - 1; @@ -429,7 +429,7 @@ public class RoutingHelper { Location lastPoint = routeNodes.get(routeNodes.size() - 1); if (currentRoute > routeNodes.size() - 3 && currentLocation.distanceTo(lastPoint) < POSITION_TOLERANCE * 1.5) { showMessage(app.getString(R.string.arrived_at_destination)); - TargetPointsHelper targets = app.getInternalAPI().getTargetPointsHelper(); + TargetPointsHelper targets = app.getTargetPointsHelper(); String description = targets.getPointNavigateDescription(); if(isFollowingMode) { voiceRouter.arrivedDestinationPoint(description); diff --git a/OsmAnd/src/net/osmand/plus/voice/AbstractPrologCommandPlayer.java b/OsmAnd/src/net/osmand/plus/voice/AbstractPrologCommandPlayer.java index 18159429e9..45aa7098de 100644 --- a/OsmAnd/src/net/osmand/plus/voice/AbstractPrologCommandPlayer.java +++ b/OsmAnd/src/net/osmand/plus/voice/AbstractPrologCommandPlayer.java @@ -13,6 +13,7 @@ import net.osmand.IndexConstants; import net.osmand.PlatformUtil; import net.osmand.plus.ApplicationMode; import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.OsmandSettings.MetricsConstants; import net.osmand.plus.R; @@ -35,7 +36,7 @@ public abstract class AbstractPrologCommandPlayer implements CommandPlayer { private static final Log log = PlatformUtil.getLog(AbstractPrologCommandPlayer.class); - protected ClientContext ctx; + protected OsmandApplication ctx; protected File voiceDir; protected Prolog prologSystem; protected static final String P_VERSION = "version"; @@ -56,7 +57,7 @@ public abstract class AbstractPrologCommandPlayer implements CommandPlayer { protected int streamType; private int currentVersion; - protected AbstractPrologCommandPlayer(ClientContext ctx, String voiceProvider, String configFile, int[] sortedVoiceVersions) + protected AbstractPrologCommandPlayer(OsmandApplication ctx, String voiceProvider, String configFile, int[] sortedVoiceVersions) throws CommandPlayerException { this.ctx = ctx; diff --git a/OsmAnd/src/net/osmand/plus/voice/MediaCommandPlayerImpl.java b/OsmAnd/src/net/osmand/plus/voice/MediaCommandPlayerImpl.java index 0623ae37b8..4c2751650c 100644 --- a/OsmAnd/src/net/osmand/plus/voice/MediaCommandPlayerImpl.java +++ b/OsmAnd/src/net/osmand/plus/voice/MediaCommandPlayerImpl.java @@ -8,6 +8,7 @@ import java.util.List; import net.osmand.PlatformUtil; import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import org.apache.commons.logging.Log; @@ -32,7 +33,7 @@ public class MediaCommandPlayerImpl extends AbstractPrologCommandPlayer implemen private List filesToPlay = Collections.synchronizedList(new ArrayList()); - public MediaCommandPlayerImpl(ClientContext ctx, String voiceProvider) + public MediaCommandPlayerImpl(OsmandApplication ctx, String voiceProvider) throws CommandPlayerException { super(ctx, voiceProvider, CONFIG_FILE, MEDIA_VOICE_VERSION); From 607ddc17b77312e9575a93a0df56faa2bca43364 Mon Sep 17 00:00:00 2001 From: vshcherb Date: Fri, 11 Apr 2014 18:23:11 +0200 Subject: [PATCH 07/29] Remove client context interface --- OsmAnd/src/net/osmand/PlatformUtil.java | 11 ++++++++-- OsmAnd/src/net/osmand/plus/GPXUtilities.java | 10 +++++---- .../net/osmand/plus/NameFinderPoiFilter.java | 2 +- .../src/net/osmand/plus/SpecialPhrases.java | 6 +++--- .../plus/access/RelativeDirectionStyle.java | 3 ++- .../osmand/plus/api/InternalOsmAndAPI.java | 12 ----------- .../plus/api/InternalOsmAndAPIImpl.java | 21 ------------------- .../net/osmand/plus/helpers/GpxUiHelper.java | 2 +- 8 files changed, 22 insertions(+), 45 deletions(-) diff --git a/OsmAnd/src/net/osmand/PlatformUtil.java b/OsmAnd/src/net/osmand/PlatformUtil.java index 4a1dd76a83..76afb9fe30 100644 --- a/OsmAnd/src/net/osmand/PlatformUtil.java +++ b/OsmAnd/src/net/osmand/PlatformUtil.java @@ -6,6 +6,9 @@ import org.apache.commons.logging.Log; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; +import org.xmlpull.v1.XmlSerializer; + +import android.util.Xml; /** * That class is replacing of standard LogFactory due to @@ -22,7 +25,6 @@ import org.xmlpull.v1.XmlPullParserFactory; */ public class PlatformUtil { public static String TAG = "net.osmand"; //$NON-NLS-1$ - public static boolean AVIAN_LIBRARY = false; private static class OsmandLogImplementation implements Log { private final String fullName; @@ -159,7 +161,12 @@ public class PlatformUtil { } public static XmlPullParser newXMLPullParser() throws XmlPullParserException { - return XmlPullParserFactory.newInstance().newPullParser(); + // return XmlPullParserFactory.newInstance().newPullParser(); + return Xml.newPullParser(); + } + + public static XmlSerializer newSerializer() { + return Xml.newSerializer(); } public static net.osmand.Collator primaryCollator(){ diff --git a/OsmAnd/src/net/osmand/plus/GPXUtilities.java b/OsmAnd/src/net/osmand/plus/GPXUtilities.java index 75c5ff54bd..c4ea6d0bb7 100644 --- a/OsmAnd/src/net/osmand/plus/GPXUtilities.java +++ b/OsmAnd/src/net/osmand/plus/GPXUtilities.java @@ -32,6 +32,8 @@ import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; +import android.content.Context; + public class GPXUtilities { public final static Log log = PlatformUtil.getLog(GPXUtilities.class); @@ -179,7 +181,7 @@ public class GPXUtilities { SimpleDateFormat format = new SimpleDateFormat(GPX_TIME_FORMAT); format.setTimeZone(TimeZone.getTimeZone("UTC")); output = new FileOutputStream(fout); - XmlSerializer serializer = ctx.getInternalAPI().newSerializer(); + XmlSerializer serializer = PlatformUtil.newSerializer(); serializer.setOutput(output, "UTF-8"); //$NON-NLS-1$ serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); //$NON-NLS-1$ serializer.startDocument("UTF-8", true); //$NON-NLS-1$ @@ -332,7 +334,7 @@ public class GPXUtilities { return text; } - public static GPXFile loadGPXFile(ClientContext ctx, File f) { + public static GPXFile loadGPXFile(Context ctx, File f) { FileInputStream fis = null; try { fis = new FileInputStream(f); @@ -355,12 +357,12 @@ public class GPXUtilities { } } - public static GPXFile loadGPXFile(ClientContext ctx, InputStream f) { + public static GPXFile loadGPXFile(Context ctx, InputStream f) { GPXFile res = new GPXFile(); SimpleDateFormat format = new SimpleDateFormat(GPX_TIME_FORMAT); format.setTimeZone(TimeZone.getTimeZone("UTC")); try { - XmlPullParser parser = ctx.getInternalAPI().newPullParser(); + XmlPullParser parser = PlatformUtil.newXMLPullParser(); parser.setInput(getUTF8Reader(f)); //$NON-NLS-1$ Stack parserState = new Stack(); boolean extensionReadMode = false; diff --git a/OsmAnd/src/net/osmand/plus/NameFinderPoiFilter.java b/OsmAnd/src/net/osmand/plus/NameFinderPoiFilter.java index ed68268f47..77c063e94a 100644 --- a/OsmAnd/src/net/osmand/plus/NameFinderPoiFilter.java +++ b/OsmAnd/src/net/osmand/plus/NameFinderPoiFilter.java @@ -64,7 +64,7 @@ public class NameFinderPoiFilter extends PoiFilter { log.info(urlq); URL url = new URL(urlq); //$NON-NLS-1$ InputStream stream = url.openStream(); - XmlPullParser parser = application.getInternalAPI().newPullParser(); + XmlPullParser parser = PlatformUtil.newXMLPullParser(); parser.setInput(stream, "UTF-8"); //$NON-NLS-1$ int eventType; int namedDepth= 0; diff --git a/OsmAnd/src/net/osmand/plus/SpecialPhrases.java b/OsmAnd/src/net/osmand/plus/SpecialPhrases.java index de6836fc6f..95941aed77 100644 --- a/OsmAnd/src/net/osmand/plus/SpecialPhrases.java +++ b/OsmAnd/src/net/osmand/plus/SpecialPhrases.java @@ -50,7 +50,7 @@ public class SpecialPhrases { * @param lang the language to use * @throws IOException when reading the text file failed */ - public static void setLanguage(ClientContext ctx, OsmandSettings settings) throws IOException { + public static void setLanguage(OsmandApplication ctx, OsmandSettings settings) throws IOException { String lang = getPreferredLanguage(settings).getLanguage(); m = new HashMap(); // The InputStream opens the resourceId and sends it to the buffer @@ -58,10 +58,10 @@ public class SpecialPhrases { BufferedReader br = null; try { try { - is = ctx.getInternalAPI().openAsset("specialphrases/specialphrases_" + lang + ".txt"); + is = ctx.getAssets().open("specialphrases/specialphrases_" + lang + ".txt"); } catch (IOException ex) { // second try: default to English, if this fails, the error is thrown outside - is = ctx.getInternalAPI().openAsset("specialphrases/specialphrases_en.txt"); + is = ctx.getAssets().open("specialphrases/specialphrases_en.txt"); } br = new BufferedReader(new InputStreamReader(is)); String readLine = null; diff --git a/OsmAnd/src/net/osmand/plus/access/RelativeDirectionStyle.java b/OsmAnd/src/net/osmand/plus/access/RelativeDirectionStyle.java index f4f8849b6d..80746ff25b 100644 --- a/OsmAnd/src/net/osmand/plus/access/RelativeDirectionStyle.java +++ b/OsmAnd/src/net/osmand/plus/access/RelativeDirectionStyle.java @@ -1,5 +1,6 @@ package net.osmand.plus.access; +import android.content.Context; import net.osmand.plus.ClientContext; import net.osmand.plus.R; @@ -14,7 +15,7 @@ public enum RelativeDirectionStyle { this.key = key; } - public String toHumanString(ClientContext ctx) { + public String toHumanString(Context ctx) { return ctx.getString(key); } diff --git a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPI.java b/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPI.java index dc4bd69741..411baa5504 100644 --- a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPI.java +++ b/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPI.java @@ -1,25 +1,13 @@ package net.osmand.plus.api; -import java.io.IOException; -import java.io.InputStream; import java.util.List; import net.osmand.ResultMatcher; import net.osmand.data.Amenity; import net.osmand.plus.PoiFilter; -import net.osmand.plus.TargetPointsHelper; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlSerializer; public interface InternalOsmAndAPI { - public XmlSerializer newSerializer(); - - public XmlPullParser newPullParser(); - - public InputStream openAsset(String name) throws IOException; - public List searchAmenities(PoiFilter filter, double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, double lat, double lon, ResultMatcher matcher); diff --git a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java b/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java index 8351500243..927ca79797 100644 --- a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java +++ b/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java @@ -4,22 +4,16 @@ import java.io.IOException; import java.io.InputStream; import java.util.List; -import net.osmand.NativeLibrary; import net.osmand.ResultMatcher; import net.osmand.data.Amenity; import net.osmand.plus.NavigationService; import net.osmand.plus.OsmandApplication; import net.osmand.plus.PoiFilter; -import net.osmand.plus.TargetPointsHelper; -import net.osmand.plus.render.NativeOsmandLibrary; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlSerializer; import android.content.Intent; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; -import android.os.Build; import android.util.Xml; public class InternalOsmAndAPIImpl implements InternalOsmAndAPI { @@ -30,21 +24,6 @@ public class InternalOsmAndAPIImpl implements InternalOsmAndAPI { this.app = app; } - @Override - public XmlSerializer newSerializer() { - return Xml.newSerializer(); - } - - @Override - public XmlPullParser newPullParser() { - return Xml.newPullParser(); - } - - @Override - public InputStream openAsset(String name) throws IOException { - return app.getAssets().open(name); - } - @Override public List searchAmenities(PoiFilter filter, double topLatitude, double leftLongitude, double bottomLatitude, diff --git a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java index feb30e8383..bfa5d432cf 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java @@ -385,7 +385,7 @@ public class GpxUiHelper { GPXFile r = currentFile; for(String fname : filename) { final File f = new File(dir, fname); - GPXFile res = GPXUtilities.loadGPXFile((ClientContext) activity.getApplication(), f); + GPXFile res = GPXUtilities.loadGPXFile(activity.getApplication(), f); GPXUtilities.mergeGPXFileInto(res, r); r = res; } From 0fc54942264d62f2a375636cc7a8c9f0258deba7 Mon Sep 17 00:00:00 2001 From: vshcherb Date: Fri, 11 Apr 2014 18:39:58 +0200 Subject: [PATCH 08/29] Remove client context interface --- OsmAnd/src/net/osmand/plus/ClientContext.java | 8 +-- .../net/osmand/plus/NameFinderPoiFilter.java | 2 +- .../src/net/osmand/plus/OsmAndFormatter.java | 8 +-- .../net/osmand/plus/OsmandApplication.java | 15 ---- .../src/net/osmand/plus/OsmandSettings.java | 36 ++++++++-- OsmAnd/src/net/osmand/plus/PoiFilter.java | 20 +++--- .../src/net/osmand/plus/PoiFiltersHelper.java | 4 +- .../net/osmand/plus/SearchByNameFilter.java | 4 +- .../plus/access/RelativeDirectionStyle.java | 3 +- .../activities/DownloadIndexActivity.java | 2 +- .../activities/search/GeoIntentActivity.java | 3 +- .../search/SearchAddressOnlineFragment.java | 2 +- .../search/SearchHistoryFragment.java | 2 +- .../search/SearchTransportFragment.java | 23 +++---- .../net/osmand/plus/api/AudioFocusHelper.java | 13 ++++ .../osmand/plus/api/AudioFocusHelperImpl.java | 9 ++- .../osmand/plus/api/ExternalServiceAPI.java | 24 ------- .../plus/api/ExternalServiceAPIImpl.java | 68 ------------------- .../osmand/plus/api/InternalOsmAndAPI.java | 28 -------- .../plus/api/InternalOsmAndAPIImpl.java | 68 ------------------- .../plus/download/DownloadFileHelper.java | 2 +- .../plus/routing/RouteDirectionInfo.java | 4 +- .../osmand/plus/routing/RoutingHelper.java | 14 ++-- .../plus/views/mapwidgets/BaseMapWidget.java | 5 +- .../voice/AbstractPrologCommandPlayer.java | 16 ++++- 25 files changed, 113 insertions(+), 270 deletions(-) create mode 100644 OsmAnd/src/net/osmand/plus/api/AudioFocusHelper.java delete mode 100644 OsmAnd/src/net/osmand/plus/api/ExternalServiceAPI.java delete mode 100644 OsmAnd/src/net/osmand/plus/api/ExternalServiceAPIImpl.java delete mode 100644 OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPI.java delete mode 100644 OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java diff --git a/OsmAnd/src/net/osmand/plus/ClientContext.java b/OsmAnd/src/net/osmand/plus/ClientContext.java index 082aedae2c..bc9cf60fc8 100644 --- a/OsmAnd/src/net/osmand/plus/ClientContext.java +++ b/OsmAnd/src/net/osmand/plus/ClientContext.java @@ -3,8 +3,6 @@ package net.osmand.plus; import java.io.File; import net.osmand.Location; -import net.osmand.plus.api.ExternalServiceAPI; -import net.osmand.plus.api.InternalOsmAndAPI; import net.osmand.plus.api.SQLiteAPI; import net.osmand.plus.api.SettingsAPI; import net.osmand.plus.render.RendererRegistry; @@ -28,14 +26,10 @@ public interface ClientContext { public RendererRegistry getRendererRegistry(); - public OsmandSettings getSettings(); + //public OsmandSettings getSettings(); public SettingsAPI getSettingsAPI(); - public ExternalServiceAPI getExternalServiceAPI(); - - public InternalOsmAndAPI getInternalAPI(); - public SQLiteAPI getSQLiteAPI(); // public RendererAPI getRendererAPI(); diff --git a/OsmAnd/src/net/osmand/plus/NameFinderPoiFilter.java b/OsmAnd/src/net/osmand/plus/NameFinderPoiFilter.java index 77c063e94a..844fa6edd0 100644 --- a/OsmAnd/src/net/osmand/plus/NameFinderPoiFilter.java +++ b/OsmAnd/src/net/osmand/plus/NameFinderPoiFilter.java @@ -31,7 +31,7 @@ public class NameFinderPoiFilter extends PoiFilter { private String query = ""; //$NON-NLS-1$ private String lastError = ""; //$NON-NLS-1$ - public NameFinderPoiFilter(ClientContext application) { + public NameFinderPoiFilter(OsmandApplication application) { super(null, application); this.name = application.getString(R.string.poi_filter_nominatim); //$NON-NLS-1$ this.distanceToSearchValues = new double[] {1, 2, 5, 10, 20, 50, 100, 200, 500 }; diff --git a/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java b/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java index 564d8a659a..aa534027db 100644 --- a/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java +++ b/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java @@ -15,7 +15,7 @@ public class OsmAndFormatter { private final static float YARDS_IN_ONE_METER = 1.0936f; private final static float FOOTS_IN_ONE_METER = YARDS_IN_ONE_METER * 3f; - public static double calculateRoundedDist(double distInMeters, ClientContext ctx) { + public static double calculateRoundedDist(double distInMeters, OsmandApplication ctx) { OsmandSettings settings = ctx.getSettings(); MetricsConstants mc = settings.METRIC_SYSTEM.get(); double mainUnitInMeter = 1; @@ -48,7 +48,7 @@ public class OsmAndFormatter { return (generator / point); } - public static String getFormattedDistance(float meters, ClientContext ctx) { + public static String getFormattedDistance(float meters, OsmandApplication ctx) { OsmandSettings settings = ctx.getSettings(); MetricsConstants mc = settings.METRIC_SYSTEM.get(); int mainUnitStr; @@ -81,7 +81,7 @@ public class OsmAndFormatter { } } - public static String getFormattedAlt(double alt, ClientContext ctx) { + public static String getFormattedAlt(double alt, OsmandApplication ctx) { OsmandSettings settings = ctx.getSettings(); MetricsConstants mc = settings.METRIC_SYSTEM.get(); if (mc == MetricsConstants.KILOMETERS_AND_METERS) { @@ -91,7 +91,7 @@ public class OsmAndFormatter { } } - public static String getFormattedSpeed(float metersperseconds, ClientContext ctx) { + public static String getFormattedSpeed(float metersperseconds, OsmandApplication ctx) { OsmandSettings settings = ctx.getSettings(); MetricsConstants mc = settings.METRIC_SYSTEM.get(); ApplicationMode am = settings.getApplicationMode(); diff --git a/OsmAnd/src/net/osmand/plus/OsmandApplication.java b/OsmAnd/src/net/osmand/plus/OsmandApplication.java index e596769774..7195e50a53 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandApplication.java +++ b/OsmAnd/src/net/osmand/plus/OsmandApplication.java @@ -27,8 +27,6 @@ import net.osmand.plus.activities.LiveMonitoringHelper; import net.osmand.plus.activities.OsmandIntents; import net.osmand.plus.activities.SavingTrackHelper; import net.osmand.plus.activities.SettingsActivity; -import net.osmand.plus.api.ExternalServiceAPI; -import net.osmand.plus.api.InternalOsmAndAPI; import net.osmand.plus.api.SQLiteAPI; import net.osmand.plus.api.SQLiteAPIImpl; import net.osmand.plus.api.SettingsAPI; @@ -112,8 +110,6 @@ public class OsmandApplication extends Application implements ClientContext { private Locale prefferedLocale = null; SettingsAPI settingsAPI; - ExternalServiceAPI externalServiceAPI; - InternalOsmAndAPI internalOsmAndAPI; SQLiteAPI sqliteAPI; BRouterServiceConnection bRouterServiceConnection; @@ -132,8 +128,6 @@ public class OsmandApplication extends Application implements ClientContext { super.onCreate(); settingsAPI = new net.osmand.plus.api.SettingsAPIImpl(this); - externalServiceAPI = new net.osmand.plus.api.ExternalServiceAPIImpl(this); - internalOsmAndAPI = new net.osmand.plus.api.InternalOsmAndAPIImpl(this); sqliteAPI = new SQLiteAPIImpl(this); try { @@ -705,15 +699,6 @@ public class OsmandApplication extends Application implements ClientContext { return settingsAPI; } - @Override - public ExternalServiceAPI getExternalServiceAPI() { - return externalServiceAPI; - } - - @Override - public InternalOsmAndAPI getInternalAPI() { - return internalOsmAndAPI; - } @Override public SQLiteAPI getSQLiteAPI() { diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index 7c65288c38..80ca3e2084 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -28,7 +28,13 @@ import net.osmand.plus.api.SettingsAPI.SettingsEditor; import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.routing.RouteProvider.RouteService; import net.osmand.render.RenderingRulesStorage; +import android.content.Context; +import android.hardware.Sensor; +import android.hardware.SensorManager; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; import android.os.Build; +import android.os.Environment; public class OsmandSettings { @@ -195,12 +201,29 @@ public class OsmandSettings { public boolean isInternetConnectionAvailable(boolean update){ long delta = System.currentTimeMillis() - lastTimeInternetConnectionChecked; if(delta < 0 || delta > 15000 || update){ - internetConnectionAvailable = ctx.getExternalServiceAPI().isInternetConnected(); + internetConnectionAvailable = isInternetConnected(); } return internetConnectionAvailable; } + public boolean isWifiConnected() { + ConnectivityManager mgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo ni = mgr.getActiveNetworkInfo(); + return ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI; + } + private boolean isInternetConnected() { + ConnectivityManager mgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo active = mgr.getActiveNetworkInfo(); + if(active == null){ + return false; + } else { + NetworkInfo.State state = active.getState(); + return state != NetworkInfo.State.DISCONNECTED && state != NetworkInfo.State.DISCONNECTING; + } + } + + /////////////// PREFERENCES classes //////////////// public abstract class CommonPreference extends PreferenceWithListener { @@ -997,7 +1020,7 @@ public class OsmandSettings { public static final String EXTERNAL_STORAGE_DIR = "external_storage_dir"; //$NON-NLS-1$ public File getExternalStorageDirectory() { - String defaultLocation = ctx.getExternalServiceAPI().getExternalStorageDirectory(); + String defaultLocation = Environment.getExternalStorageDirectory().getAbsolutePath(); return new File(settingsAPI.getString(globalPreferences, EXTERNAL_STORAGE_DIR, defaultLocation)); } @@ -1005,7 +1028,7 @@ public class OsmandSettings { public static final int VERSION_DEFAULTLOCATION_CHANGED = 19; public String getDefaultExternalStorageLocation() { - String defaultLocation = ctx.getExternalServiceAPI().getExternalStorageDirectory(); + String defaultLocation = Environment.getExternalStorageDirectory().getAbsolutePath(); return defaultLocation; } @@ -1677,8 +1700,11 @@ public class OsmandSettings { return this == NIGHT; } - public static DayNightMode[] possibleValues(ClientContext context) { - if (context.getExternalServiceAPI().isLightSensorEnabled()) { + public static DayNightMode[] possibleValues(Context context) { + SensorManager mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); + Sensor mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); + boolean isLightSensorEnabled = mLight != null; + if (isLightSensorEnabled) { return DayNightMode.values(); } else { return new DayNightMode[] { AUTO, DAY, NIGHT }; diff --git a/OsmAnd/src/net/osmand/plus/PoiFilter.java b/OsmAnd/src/net/osmand/plus/PoiFilter.java index ca0f24713b..e34d2b4255 100644 --- a/OsmAnd/src/net/osmand/plus/PoiFilter.java +++ b/OsmAnd/src/net/osmand/plus/PoiFilter.java @@ -30,7 +30,7 @@ public class PoiFilter { protected String nameFilter; protected boolean isStandardFilter; - protected final ClientContext application; + protected final OsmandApplication app; protected int distanceInd = 1; // in kilometers @@ -38,8 +38,8 @@ public class PoiFilter { // constructor for standard filters - public PoiFilter(AmenityType type, ClientContext application){ - this.application = application; + public PoiFilter(AmenityType type, OsmandApplication application){ + this.app = application; isStandardFilter = true; filterId = STD_PREFIX + type; name = type == null ? application.getString(R.string.poi_filter_closest_poi) : OsmAndFormatter.toPublicString(type, @@ -52,8 +52,8 @@ public class PoiFilter { } // constructor for user defined filters - public PoiFilter(String name, String filterId, Map> acceptedTypes, ClientContext app){ - application = app; + public PoiFilter(String name, String filterId, Map> acceptedTypes, OsmandApplication app){ + this.app = app; isStandardFilter = false; if(filterId == null){ filterId = USER_PREFIX + name.replace(' ', '_').toLowerCase(); @@ -109,9 +109,9 @@ public class PoiFilter { public String getSearchArea(){ double val = distanceToSearchValues[distanceInd]; if(val >= 1){ - return " < " + OsmAndFormatter.getFormattedDistance(((int)val * 1000), application); //$NON-NLS-1$//$NON-NLS-2$ + return " < " + OsmAndFormatter.getFormattedDistance(((int)val * 1000), app); //$NON-NLS-1$//$NON-NLS-2$ } else { - return " < " + OsmAndFormatter.getFormattedDistance(500, application); //$NON-NLS-1$ + return " < " + OsmAndFormatter.getFormattedDistance(500, app); //$NON-NLS-1$ } } @@ -147,7 +147,7 @@ public class PoiFilter { public ResultMatcher getResultMatcher(final ResultMatcher matcher){ final String filter = nameFilter; if(filter != null) { - final boolean en = application.getSettings().USE_ENGLISH_NAMES.get(); + final boolean en = app.getSettings().USE_ENGLISH_NAMES.get(); return new ResultMatcher() { @Override public boolean publish(Amenity object) { @@ -170,7 +170,7 @@ public class PoiFilter { protected List searchAmenities(double lat, double lon, double topLatitude, double bottomLatitude, double leftLongitude, double rightLongitude, final ResultMatcher matcher) { - return application.getInternalAPI().searchAmenities(this, + return app.getResourceManager().searchAmenities(this, topLatitude, leftLongitude, bottomLatitude, rightLongitude, lat, lon, matcher); } @@ -328,7 +328,7 @@ public class PoiFilter { } public ClientContext getApplication() { - return application; + return app; } } diff --git a/OsmAnd/src/net/osmand/plus/PoiFiltersHelper.java b/OsmAnd/src/net/osmand/plus/PoiFiltersHelper.java index 0829b4bbec..b7ac0010a9 100644 --- a/OsmAnd/src/net/osmand/plus/PoiFiltersHelper.java +++ b/OsmAnd/src/net/osmand/plus/PoiFiltersHelper.java @@ -16,7 +16,7 @@ import net.osmand.plus.api.SQLiteAPI.SQLiteCursor; import net.osmand.plus.api.SQLiteAPI.SQLiteStatement; public class PoiFiltersHelper { - private final ClientContext application; + private final OsmandApplication application; private NameFinderPoiFilter nameFinderPOIFilter; private List cacheTopStandardFilters; @@ -37,7 +37,7 @@ public class PoiFiltersHelper { private static final String[] DEL = new String[] {}; - public PoiFiltersHelper(ClientContext application){ + public PoiFiltersHelper(OsmandApplication application){ this.application = application; } public NameFinderPoiFilter getNameFinderPOIFilter() { diff --git a/OsmAnd/src/net/osmand/plus/SearchByNameFilter.java b/OsmAnd/src/net/osmand/plus/SearchByNameFilter.java index 88621c5b85..e2f872baea 100644 --- a/OsmAnd/src/net/osmand/plus/SearchByNameFilter.java +++ b/OsmAnd/src/net/osmand/plus/SearchByNameFilter.java @@ -18,7 +18,7 @@ public class SearchByNameFilter extends PoiFilter { private String query = ""; //$NON-NLS-1$ - public SearchByNameFilter(ClientContext application) { + public SearchByNameFilter(OsmandApplication application) { super(application.getString(R.string.poi_filter_by_name), FILTER_ID, new LinkedHashMap>(), application); this.distanceToSearchValues = new double[] {100, 1000, 5000}; this.isStandardFilter = true; @@ -44,7 +44,7 @@ public class SearchByNameFilter extends PoiFilter { searchedAmenities.clear(); final int limit = distanceInd == 0 ? 500 : -1; - List result = application.getInternalAPI().searchAmenitiesByName(query, + List result = app.getResourceManager().searchAmenitiesByName(query, topLatitude, leftLongitude, bottomLatitude, rightLongitude, lat, lon, new ResultMatcher() { boolean elimit = false; @Override diff --git a/OsmAnd/src/net/osmand/plus/access/RelativeDirectionStyle.java b/OsmAnd/src/net/osmand/plus/access/RelativeDirectionStyle.java index 80746ff25b..4e7870ca41 100644 --- a/OsmAnd/src/net/osmand/plus/access/RelativeDirectionStyle.java +++ b/OsmAnd/src/net/osmand/plus/access/RelativeDirectionStyle.java @@ -1,8 +1,7 @@ package net.osmand.plus.access; -import android.content.Context; -import net.osmand.plus.ClientContext; import net.osmand.plus.R; +import android.content.Context; public enum RelativeDirectionStyle { diff --git a/OsmAnd/src/net/osmand/plus/activities/DownloadIndexActivity.java b/OsmAnd/src/net/osmand/plus/activities/DownloadIndexActivity.java index b2dd15933b..a91a7e7cd7 100644 --- a/OsmAnd/src/net/osmand/plus/activities/DownloadIndexActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/DownloadIndexActivity.java @@ -564,7 +564,7 @@ public class DownloadIndexActivity extends OsmandExpandableListActivity { protected void downloadFilesCheckInternet() { - if(!getMyApplication().getExternalServiceAPI().isWifiConnected()) { + if(!getMyApplication().getSettings().isWifiConnected()) { Builder builder = new AlertDialog.Builder(this); builder.setMessage(getString(R.string.download_using_mobile_internet)); builder.setPositiveButton(R.string.default_buttons_yes, new DialogInterface.OnClickListener() { diff --git a/OsmAnd/src/net/osmand/plus/activities/search/GeoIntentActivity.java b/OsmAnd/src/net/osmand/plus/activities/search/GeoIntentActivity.java index 4dc7efc826..f99a4079e7 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/GeoIntentActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/GeoIntentActivity.java @@ -16,7 +16,6 @@ import net.osmand.data.City; import net.osmand.data.LatLon; import net.osmand.data.MapObject; import net.osmand.data.Street; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -148,7 +147,7 @@ public class GeoIntentActivity extends OsmandListActivity { int dist = (int) (MapUtils.getDistance(location, model .getLocation().getLatitude(), model.getLocation() .getLongitude())); - distanceLabel.setText(OsmAndFormatter.getFormattedDistance(dist,(ClientContext) getApplication())); + distanceLabel.setText(OsmAndFormatter.getFormattedDistance(dist,(OsmandApplication) getApplication())); } else { distanceLabel.setText(""); //$NON-NLS-1$ } diff --git a/OsmAnd/src/net/osmand/plus/activities/search/SearchAddressOnlineFragment.java b/OsmAnd/src/net/osmand/plus/activities/search/SearchAddressOnlineFragment.java index 01d8bac6cf..77353391d9 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/SearchAddressOnlineFragment.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/SearchAddressOnlineFragment.java @@ -258,7 +258,7 @@ public class SearchAddressOnlineFragment extends SherlockFragment implements Sea TextView distanceLabel = (TextView) row.findViewById(R.id.distance_label); if(location != null){ int dist = (int) (MapUtils.getDistance(location, model.lat, model.lon)); - distanceLabel.setText(OsmAndFormatter.getFormattedDistance(dist, (ClientContext) getActivity().getApplication())); + distanceLabel.setText(OsmAndFormatter.getFormattedDistance(dist, (OsmandApplication) getActivity().getApplication())); } else { distanceLabel.setText(""); //$NON-NLS-1$ } diff --git a/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java b/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java index 3e728416a1..ea869b4b4f 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java @@ -143,7 +143,7 @@ public class SearchHistoryFragment extends SherlockListFragment implements Sear final HistoryEntry model = getItem(position); if (location != null) { int dist = (int) (MapUtils.getDistance(location, model.getLat(), model.getLon())); - distance = OsmAndFormatter.getFormattedDistance(dist, (ClientContext) getActivity().getApplication()) + " "; + distance = OsmAndFormatter.getFormattedDistance(dist, (OsmandApplication) getActivity().getApplication()) + " "; } label.setText(distance + model.getName(), BufferType.SPANNABLE); ((Spannable) label.getText()).setSpan(new ForegroundColorSpan(getResources().getColor(R.color.color_distance)), 0, distance.length(), 0); diff --git a/OsmAnd/src/net/osmand/plus/activities/search/SearchTransportFragment.java b/OsmAnd/src/net/osmand/plus/activities/search/SearchTransportFragment.java index a76b0159f0..f77184f833 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/SearchTransportFragment.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/SearchTransportFragment.java @@ -10,7 +10,6 @@ import java.util.List; import net.osmand.data.LatLon; import net.osmand.data.TransportRoute; import net.osmand.data.TransportStop; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -79,7 +78,7 @@ public class SearchTransportFragment extends SherlockFragment implements SearchA public View onCreateView(android.view.LayoutInflater inflater, android.view.ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.search_transport, container, false); - settings = ((OsmandApplication) getApplication()).getSettings(); + settings = getApplication().getSettings(); searchTransportLevel = (Button) view.findViewById(R.id.SearchTransportLevelButton); searchTransportLevel.setText(R.string.search_POI_level_btn); @@ -263,19 +262,19 @@ public class SearchTransportFragment extends SherlockFragment implements SearchA } ind++; } - text.append(getString(R.string.transport_route_distance)).append(" ").append(OsmAndFormatter.getFormattedDistance((int) dist, (ClientContext) getApplication())); //$NON-NLS-1$/ + text.append(getString(R.string.transport_route_distance)).append(" ").append(OsmAndFormatter.getFormattedDistance((int) dist, getApplication())); //$NON-NLS-1$/ if(!part){ text.append(", ").append(getString(R.string.transport_stops_to_pass)).append(" ").append(eInd - stInd); //$NON-NLS-1$ //$NON-NLS-2$ LatLon endStop = getEndStop(position - 1); if (endStop != null) { String before = OsmAndFormatter.getFormattedDistance((int) MapUtils.getDistance(endStop, route.getStart().getLocation()), - (ClientContext) getApplication()); + getApplication()); text.append(", ").append(getString(R.string.transport_to_go_before)).append(" ").append(before); //$NON-NLS-2$//$NON-NLS-1$ } LatLon stStop = getStartStop(position + 1); if (stStop != null) { - String after = OsmAndFormatter.getFormattedDistance((int) MapUtils.getDistance(stStop, route.getStop().getLocation()), (ClientContext) getApplication()); + String after = OsmAndFormatter.getFormattedDistance((int) MapUtils.getDistance(stStop, route.getStop().getLocation()), getApplication()); text.append(", ").append(getString(R.string.transport_to_go_after)).append(" ").append(after); //$NON-NLS-1$ //$NON-NLS-2$ } } @@ -306,9 +305,9 @@ public class SearchTransportFragment extends SherlockFragment implements SearchA String name = st.getName(settings.usingEnglishNames()); if(locationToGo != null){ n.append(name).append(" - ["); //$NON-NLS-1$ - n.append(OsmAndFormatter.getFormattedDistance((int) MapUtils.getDistance(locationToGo, st.getLocation()), (ClientContext) getApplication())).append("]"); //$NON-NLS-1$ + n.append(OsmAndFormatter.getFormattedDistance((int) MapUtils.getDistance(locationToGo, st.getLocation()), getApplication())).append("]"); //$NON-NLS-1$ } else if(locationToStart != null){ - n.append("[").append(OsmAndFormatter.getFormattedDistance((int) MapUtils.getDistance(locationToStart, st.getLocation()), (ClientContext) getApplication())).append("] - "); //$NON-NLS-1$ //$NON-NLS-2$ + n.append("[").append(OsmAndFormatter.getFormattedDistance((int) MapUtils.getDistance(locationToStart, st.getLocation()), getApplication())).append("] - "); //$NON-NLS-1$ //$NON-NLS-2$ n.append(name); } else { n.append(name); @@ -494,7 +493,7 @@ public class SearchTransportFragment extends SherlockFragment implements SearchA labelW.append(" - ["); //$NON-NLS-1$ if (locationToGo != null) { - labelW.append(OsmAndFormatter.getFormattedDistance(stop.getDistToLocation(), (ClientContext) getApplication())); + labelW.append(OsmAndFormatter.getFormattedDistance(stop.getDistToLocation(), getApplication())); } else { labelW.append(getString(R.string.transport_search_none)); } @@ -506,7 +505,7 @@ public class SearchTransportFragment extends SherlockFragment implements SearchA } int dist = locationToStart == null ? 0 : (int) (MapUtils.getDistance(stop.getStart().getLocation(), locationToStart)); - String distance = OsmAndFormatter.getFormattedDistance(dist, (ClientContext) getApplication()) + " "; //$NON-NLS-1$ + String distance = OsmAndFormatter.getFormattedDistance(dist, getApplication()) + " "; //$NON-NLS-1$ label.setText(distance + labelW, TextView.BufferType.SPANNABLE); ((Spannable) label.getText()).setSpan(new ForegroundColorSpan(getResources().getColor(R.color.color_distance)), 0, distance.length() - 1, 0); return (row); @@ -530,7 +529,7 @@ public class SearchTransportFragment extends SherlockFragment implements SearchA if(st != null && end != null){ int dist = (int) MapUtils.getDistance(st, end); - text.setText(MessageFormat.format(getString(R.string.transport_searching_route), OsmAndFormatter.getFormattedDistance(dist, (ClientContext) getApplication()))); + text.setText(MessageFormat.format(getString(R.string.transport_searching_route), OsmAndFormatter.getFormattedDistance(dist, getApplication()))); } else { text.setText(getString(R.string.transport_searching_transport)); } @@ -577,12 +576,12 @@ public class SearchTransportFragment extends SherlockFragment implements SearchA labelW.append(" ("); //$NON-NLS-1$ labelW.append(info.getStopNumbers()).append(" ").append(getString(R.string.transport_stops)).append(", "); //$NON-NLS-1$ //$NON-NLS-2$ int startDist = (int) MapUtils.getDistance(getEndStop(position - 1), info.getStart().getLocation()); - labelW.append(getString(R.string.transport_to_go_before)).append(" ").append(OsmAndFormatter.getFormattedDistance(startDist, (ClientContext) getApplication())); //$NON-NLS-1$ + labelW.append(getString(R.string.transport_to_go_before)).append(" ").append(OsmAndFormatter.getFormattedDistance(startDist, getApplication())); //$NON-NLS-1$ if (position == getCount() - 1) { LatLon stop = getStartStop(position + 1); if(stop != null) { int endDist = (int) MapUtils.getDistance(stop, info.getStop().getLocation()); - labelW.append(", ").append(getString(R.string.transport_to_go_after)).append(" ").append(OsmAndFormatter.getFormattedDistance(endDist, (ClientContext) getApplication())); //$NON-NLS-1$ //$NON-NLS-2$ + labelW.append(", ").append(getString(R.string.transport_to_go_after)).append(" ").append(OsmAndFormatter.getFormattedDistance(endDist, getApplication())); //$NON-NLS-1$ //$NON-NLS-2$ } } diff --git a/OsmAnd/src/net/osmand/plus/api/AudioFocusHelper.java b/OsmAnd/src/net/osmand/plus/api/AudioFocusHelper.java new file mode 100644 index 0000000000..4bfc940b4a --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/api/AudioFocusHelper.java @@ -0,0 +1,13 @@ +package net.osmand.plus.api; + +import android.content.Context; + +public interface AudioFocusHelper { + + boolean requestFocus(Context context, int streamType); + + void onAudioFocusChange(int focusChange); + + boolean abandonFocus(Context context, int streamType); + +} diff --git a/OsmAnd/src/net/osmand/plus/api/AudioFocusHelperImpl.java b/OsmAnd/src/net/osmand/plus/api/AudioFocusHelperImpl.java index 08a2f56162..f33bb811a4 100644 --- a/OsmAnd/src/net/osmand/plus/api/AudioFocusHelperImpl.java +++ b/OsmAnd/src/net/osmand/plus/api/AudioFocusHelperImpl.java @@ -1,7 +1,6 @@ package net.osmand.plus.api; import net.osmand.PlatformUtil; -import net.osmand.plus.ClientContext; import org.apache.commons.logging.Log; @@ -14,18 +13,18 @@ import android.media.AudioManager; * * @author genly */ -public class AudioFocusHelperImpl implements AudioManager.OnAudioFocusChangeListener, net.osmand.plus.api.ExternalServiceAPI.AudioFocusHelper { +public class AudioFocusHelperImpl implements AudioManager.OnAudioFocusChangeListener, AudioFocusHelper { private static final Log log = PlatformUtil.getLog(AudioFocusHelperImpl.class); @Override - public boolean requestFocus(ClientContext context, int streamType) { - AudioManager mAudioManager = (AudioManager) ((Context) context).getSystemService(Context.AUDIO_SERVICE); + public boolean requestFocus(Context context, int streamType) { + AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); return AudioManager.AUDIOFOCUS_REQUEST_GRANTED == mAudioManager.requestAudioFocus(this, streamType, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); } @Override - public boolean abandonFocus(ClientContext context, int streamType) { + public boolean abandonFocus(Context context, int streamType) { AudioManager mAudioManager = (AudioManager) ((Context) context).getSystemService(Context.AUDIO_SERVICE); return AudioManager.AUDIOFOCUS_REQUEST_GRANTED == mAudioManager.abandonAudioFocus(this); } diff --git a/OsmAnd/src/net/osmand/plus/api/ExternalServiceAPI.java b/OsmAnd/src/net/osmand/plus/api/ExternalServiceAPI.java deleted file mode 100644 index da7ac2b043..0000000000 --- a/OsmAnd/src/net/osmand/plus/api/ExternalServiceAPI.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.osmand.plus.api; - -import net.osmand.plus.ClientContext; - -public interface ExternalServiceAPI { - - public boolean isWifiConnected(); - - public boolean isInternetConnected(); - - - public boolean isLightSensorEnabled(); - - public String getExternalStorageDirectory(); - - public AudioFocusHelper getAudioFocuseHelper(); - - public interface AudioFocusHelper { - - public boolean requestFocus(ClientContext context, int streamType); - - public boolean abandonFocus(ClientContext context, int streamType); - } -} diff --git a/OsmAnd/src/net/osmand/plus/api/ExternalServiceAPIImpl.java b/OsmAnd/src/net/osmand/plus/api/ExternalServiceAPIImpl.java deleted file mode 100644 index f119619bf1..0000000000 --- a/OsmAnd/src/net/osmand/plus/api/ExternalServiceAPIImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -package net.osmand.plus.api; - -import net.osmand.PlatformUtil; -import net.osmand.plus.OsmandApplication; - -import org.apache.commons.logging.Log; - -import android.content.Context; -import android.hardware.Sensor; -import android.hardware.SensorManager; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.os.Environment; - -public class ExternalServiceAPIImpl implements ExternalServiceAPI { - - private OsmandApplication app; - private static final Log log = PlatformUtil.getLog(ExternalServiceAPIImpl.class); - - public ExternalServiceAPIImpl(OsmandApplication app) { - this.app = app; - } - - @Override - public boolean isWifiConnected() { - ConnectivityManager mgr = (ConnectivityManager) app.getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo ni = mgr.getActiveNetworkInfo(); - return ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI; - } - - @Override - public boolean isInternetConnected() { - ConnectivityManager mgr = (ConnectivityManager) app.getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo active = mgr.getActiveNetworkInfo(); - if(active == null){ - return false; - } else { - NetworkInfo.State state = active.getState(); - return state != NetworkInfo.State.DISCONNECTED && state != NetworkInfo.State.DISCONNECTING; - } - } - - @Override - public boolean isLightSensorEnabled() { - SensorManager mSensorManager = (SensorManager)app.getSystemService(Context.SENSOR_SERVICE); - Sensor mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); - return mLight != null; - } - - @Override - public String getExternalStorageDirectory() { - return Environment.getExternalStorageDirectory().getAbsolutePath(); - } - - @Override - public AudioFocusHelper getAudioFocuseHelper() { - if (android.os.Build.VERSION.SDK_INT >= 8) { - try { - return (AudioFocusHelper) Class.forName("net.osmand.plus.api.AudioFocusHelperImpl").newInstance(); - } catch (Exception e) { - log.error(e.getMessage(), e); - return null; - } - } - return null; - } - -} diff --git a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPI.java b/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPI.java deleted file mode 100644 index 411baa5504..0000000000 --- a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPI.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.osmand.plus.api; - -import java.util.List; - -import net.osmand.ResultMatcher; -import net.osmand.data.Amenity; -import net.osmand.plus.PoiFilter; - -public interface InternalOsmAndAPI { - - public List searchAmenities(PoiFilter filter, - double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, - double lat, double lon, ResultMatcher matcher); - - public List searchAmenitiesByName(String searchQuery, - double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, - double lat, double lon, ResultMatcher matcher); - - - public boolean isNavigationServiceStarted(); - - public boolean isNavigationServiceStartedForNavigation(); - - public void startNavigationService(boolean forNavigation); - - public void stopNavigationService(); - -} diff --git a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java b/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java deleted file mode 100644 index 927ca79797..0000000000 --- a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -package net.osmand.plus.api; - -import java.io.IOException; -import java.io.InputStream; -import java.util.List; - -import net.osmand.ResultMatcher; -import net.osmand.data.Amenity; -import net.osmand.plus.NavigationService; -import net.osmand.plus.OsmandApplication; -import net.osmand.plus.PoiFilter; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlSerializer; - -import android.content.Intent; -import android.util.Xml; - -public class InternalOsmAndAPIImpl implements InternalOsmAndAPI { - - private OsmandApplication app; - - public InternalOsmAndAPIImpl(OsmandApplication app) { - this.app = app; - } - - - @Override - public List searchAmenities(PoiFilter filter, double topLatitude, double leftLongitude, double bottomLatitude, - double rightLongitude, double lat, double lon, ResultMatcher matcher) { - return app.getResourceManager().searchAmenities(filter, topLatitude, leftLongitude, bottomLatitude, rightLongitude, lat, lon, matcher); - } - - @Override - public List searchAmenitiesByName(String searchQuery, double topLatitude, double leftLongitude, double bottomLatitude, - double rightLongitude, double lat, double lon, ResultMatcher matcher) { - return app.getResourceManager().searchAmenitiesByName(searchQuery, topLatitude, leftLongitude, bottomLatitude, rightLongitude, lat, lon, matcher); - } - - - @Override - public boolean isNavigationServiceStarted() { - return app.getNavigationService() != null; - } - - @Override - public boolean isNavigationServiceStartedForNavigation() { - return app.getNavigationService() != null && app.getNavigationService().startedForNavigation(); - } - - @Override - public void startNavigationService(boolean forNavigation) { - Intent serviceIntent = new Intent(app, NavigationService.class); - if(forNavigation) { - serviceIntent.putExtra(NavigationService.NAVIGATION_START_SERVICE_PARAM, true); - } - app.startService(serviceIntent); - } - - @Override - public void stopNavigationService() { - Intent serviceIntent = new Intent(app, NavigationService.class); - app.stopService(serviceIntent); - - } - - -} diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java b/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java index 06d0f34e59..b5554c4aac 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java @@ -195,7 +195,7 @@ public class DownloadFileHelper { } public boolean isWifiConnected(){ - return ctx.getExternalServiceAPI().isWifiConnected(); + return ctx.getSettings().isWifiConnected(); } public boolean downloadFile(DownloadEntry de, IProgress progress, diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteDirectionInfo.java b/OsmAnd/src/net/osmand/plus/routing/RouteDirectionInfo.java index 03198c689b..906b36f782 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteDirectionInfo.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteDirectionInfo.java @@ -1,7 +1,7 @@ package net.osmand.plus.routing; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmAndFormatter; +import net.osmand.plus.OsmandApplication; import net.osmand.router.TurnType; public class RouteDirectionInfo { @@ -34,7 +34,7 @@ public class RouteDirectionInfo { this.turnType = turnType; } - public String getDescriptionRoute(ClientContext ctx) { + public String getDescriptionRoute(OsmandApplication ctx) { return descriptionRoute + " " + OsmAndFormatter.getFormattedDistance(distance, ctx); } diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 97491c645f..7d579785c4 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -4,6 +4,8 @@ package net.osmand.plus.routing; import java.util.ArrayList; import java.util.List; +import android.content.Intent; + import net.osmand.Location; import net.osmand.PlatformUtil; import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion; @@ -13,6 +15,7 @@ import net.osmand.data.LatLon; import net.osmand.plus.ApplicationMode; import net.osmand.plus.GPXUtilities.GPXFile; import net.osmand.plus.GPXUtilities.WptPt; +import net.osmand.plus.NavigationService; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -96,12 +99,15 @@ public class RoutingHelper { public void setFollowingMode(boolean follow) { isFollowingMode = follow; if(follow) { - if(!app.getInternalAPI().isNavigationServiceStarted()) { - app.getInternalAPI().startNavigationService(true); + if(app.getNavigationService() != null) { + Intent serviceIntent = new Intent(app, NavigationService.class); + serviceIntent.putExtra(NavigationService.NAVIGATION_START_SERVICE_PARAM, true); + app.startService(serviceIntent); } } else { - if(app.getInternalAPI().isNavigationServiceStartedForNavigation()) { - app.getInternalAPI().stopNavigationService(); + if(app.getNavigationService() != null && app.getNavigationService().startedForNavigation()) { + Intent serviceIntent = new Intent(app, NavigationService.class); + app.stopService(serviceIntent); } } } diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/BaseMapWidget.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/BaseMapWidget.java index 2a33a395e2..e5024f1f47 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/BaseMapWidget.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/BaseMapWidget.java @@ -1,6 +1,7 @@ package net.osmand.plus.views.mapwidgets; import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.views.OsmandMapLayer.DrawSettings; import net.osmand.plus.views.ShadowText; import android.content.Context; @@ -99,8 +100,8 @@ public abstract class BaseMapWidget extends View implements UpdateableWidget { return false; } - public ClientContext getClientContext(){ - return (ClientContext) getContext().getApplicationContext(); + public OsmandApplication getClientContext(){ + return (OsmandApplication) getContext().getApplicationContext(); } diff --git a/OsmAnd/src/net/osmand/plus/voice/AbstractPrologCommandPlayer.java b/OsmAnd/src/net/osmand/plus/voice/AbstractPrologCommandPlayer.java index 45aa7098de..56119afd23 100644 --- a/OsmAnd/src/net/osmand/plus/voice/AbstractPrologCommandPlayer.java +++ b/OsmAnd/src/net/osmand/plus/voice/AbstractPrologCommandPlayer.java @@ -12,12 +12,11 @@ import java.util.List; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; import net.osmand.plus.ApplicationMode; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.OsmandSettings.MetricsConstants; import net.osmand.plus.R; -import net.osmand.plus.api.ExternalServiceAPI.AudioFocusHelper; +import net.osmand.plus.api.AudioFocusHelper; import org.apache.commons.logging.Log; @@ -230,11 +229,22 @@ public abstract class AbstractPrologCommandPlayer implements CommandPlayer { protected void requestAudioFocus() { log.debug("requestAudioFocus"); - mAudioFocusHelper = ctx.getExternalServiceAPI().getAudioFocuseHelper(); + if (android.os.Build.VERSION.SDK_INT >= 8) { + mAudioFocusHelper = getAudioFocus(); + } if (mAudioFocusHelper != null) { mAudioFocusHelper.requestFocus(ctx, streamType); } } + + private AudioFocusHelper getAudioFocus() { + try { + return new net.osmand.plus.api.AudioFocusHelperImpl(); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return null; + } protected void abandonAudioFocus() { log.debug("abandonAudioFocus"); From 82662ffbf7705cf0bb6202dfda03d937eacd0e29 Mon Sep 17 00:00:00 2001 From: vshcherb Date: Fri, 11 Apr 2014 18:50:59 +0200 Subject: [PATCH 09/29] Delte ClientContext class --- .../src/net/osmand/plus/ApplicationMode.java | 2 +- OsmAnd/src/net/osmand/plus/ClientContext.java | 46 ------------------- .../src/net/osmand/plus/OsmAndFormatter.java | 9 ++-- .../net/osmand/plus/OsmandApplication.java | 16 +------ .../src/net/osmand/plus/OsmandSettings.java | 6 +-- OsmAnd/src/net/osmand/plus/PoiFilter.java | 6 ++- .../src/net/osmand/plus/PoiFiltersHelper.java | 4 +- .../src/net/osmand/plus/SQLiteTileSource.java | 5 +- .../net/osmand/plus/SearchHistoryHelper.java | 6 +-- .../osmand/plus/access/AccessibilityMode.java | 4 +- .../activities/SettingsGeneralActivity.java | 1 - .../search/SearchAddressOnlineFragment.java | 1 - .../search/SearchHistoryFragment.java | 3 +- .../plus/download/DownloadFileHelper.java | 1 - .../plus/download/DownloadIndexAdapter.java | 7 +-- .../download/DownloadOsmandIndexesHelper.java | 2 - .../net/osmand/plus/download/IndexItem.java | 7 ++- .../plus/download/IndexItemCategory.java | 1 - .../net/osmand/plus/helpers/GpxUiHelper.java | 1 - .../plus/render/NativeOsmandLibrary.java | 6 +-- .../plus/routing/RouteCalculationResult.java | 12 ++--- .../osmand/plus/routing/RouteProvider.java | 4 +- .../net/osmand/plus/routing/VoiceRouter.java | 4 +- .../mapwidgets/AppearanceWidgetsFactory.java | 16 +++---- .../plus/views/mapwidgets/BaseMapWidget.java | 1 - .../mapwidgets/MapInfoWidgetsFactory.java | 2 +- .../mapwidgets/RouteInfoWidgetsFactory.java | 2 +- .../plus/voice/MediaCommandPlayerImpl.java | 1 - 28 files changed, 56 insertions(+), 120 deletions(-) delete mode 100644 OsmAnd/src/net/osmand/plus/ClientContext.java diff --git a/OsmAnd/src/net/osmand/plus/ApplicationMode.java b/OsmAnd/src/net/osmand/plus/ApplicationMode.java index 88cdc51e60..dea67aaaad 100644 --- a/OsmAnd/src/net/osmand/plus/ApplicationMode.java +++ b/OsmAnd/src/net/osmand/plus/ApplicationMode.java @@ -259,7 +259,7 @@ public class ApplicationMode { return ctx.getString(key); } - public String toHumanStringCtx(ClientContext ctx) { + public String toHumanStringCtx(Context ctx) { return ctx.getString(key); } diff --git a/OsmAnd/src/net/osmand/plus/ClientContext.java b/OsmAnd/src/net/osmand/plus/ClientContext.java deleted file mode 100644 index bc9cf60fc8..0000000000 --- a/OsmAnd/src/net/osmand/plus/ClientContext.java +++ /dev/null @@ -1,46 +0,0 @@ -package net.osmand.plus; - -import java.io.File; - -import net.osmand.Location; -import net.osmand.plus.api.SQLiteAPI; -import net.osmand.plus.api.SettingsAPI; -import net.osmand.plus.render.RendererRegistry; -import net.osmand.plus.routing.RoutingHelper; - - -/* - * In Android version ClientContext should be cast to Android.Context for backward compatibility - */ -public interface ClientContext { - - public String getString(int resId, Object... args); - - public File getAppPath(String extend); - - public void showShortToastMessage(int msgId, Object... args); - - public void showToastMessage(int msgId, Object... args); - - public void showToastMessage(String msg); - - public RendererRegistry getRendererRegistry(); - - //public OsmandSettings getSettings(); - - public SettingsAPI getSettingsAPI(); - - public SQLiteAPI getSQLiteAPI(); - - // public RendererAPI getRendererAPI(); - - public void runInUIThread(Runnable run); - - public void runInUIThread(Runnable run, long delay); - - public RoutingHelper getRoutingHelper(); - - public Location getLastKnownLocation(); - - -} diff --git a/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java b/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java index aa534027db..46437376cb 100644 --- a/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java +++ b/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java @@ -8,6 +8,7 @@ import net.osmand.data.Amenity; import net.osmand.data.AmenityType; import net.osmand.data.City.CityType; import net.osmand.plus.OsmandSettings.MetricsConstants; +import android.content.Context; public class OsmAndFormatter { private final static float METERS_IN_KILOMETER = 1000f; @@ -116,7 +117,7 @@ public class OsmAndFormatter { } - public static String toPublicString(CityType t, ClientContext ctx) { + public static String toPublicString(CityType t, Context ctx) { switch (t) { case CITY: return ctx.getString(R.string.city_type_city); @@ -134,7 +135,7 @@ public class OsmAndFormatter { return ""; } - public static String toPublicString(AmenityType t, ClientContext ctx) { + public static String toPublicString(AmenityType t, Context ctx) { Class cl = R.string.class; try { Field fld = cl.getField("amenity_type_"+t.getCategoryName()); @@ -147,7 +148,7 @@ public class OsmAndFormatter { } - public static String getPoiSimpleFormat(Amenity amenity, ClientContext ctx, boolean en){ + public static String getPoiSimpleFormat(Amenity amenity, Context ctx, boolean en){ return toPublicString(amenity.getType(), ctx) + " : " + getPoiStringWithoutType(amenity, en); //$NON-NLS-1$ } @@ -167,7 +168,7 @@ public class OsmAndFormatter { return type + " " + n; //$NON-NLS-1$ } - public static String getAmenityDescriptionContent(ClientContext ctx, Amenity amenity, boolean shortDescription) { + public static String getAmenityDescriptionContent(Context ctx, Amenity amenity, boolean shortDescription) { StringBuilder d = new StringBuilder(); for(Entry e : amenity.getAdditionalInfo().entrySet()) { String key = e.getKey(); diff --git a/OsmAnd/src/net/osmand/plus/OsmandApplication.java b/OsmAnd/src/net/osmand/plus/OsmandApplication.java index 7195e50a53..e26bf35032 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandApplication.java +++ b/OsmAnd/src/net/osmand/plus/OsmandApplication.java @@ -78,7 +78,7 @@ import com.actionbarsherlock.app.SherlockExpandableListActivity; import com.actionbarsherlock.app.SherlockListActivity; -public class OsmandApplication extends Application implements ClientContext { +public class OsmandApplication extends Application { public static final String EXCEPTION_PATH = "exception.log"; //$NON-NLS-1$ private static final org.apache.commons.logging.Log LOG = PlatformUtil.getLog(OsmandApplication.class); @@ -679,38 +679,31 @@ public class OsmandApplication extends Application implements ClientContext { return targetPointsHelper; } - @Override public void showShortToastMessage(int msgId, Object... args) { AccessibleToast.makeText(this, getString(msgId, args), Toast.LENGTH_SHORT).show(); } - @Override public void showToastMessage(int msgId, Object... args) { AccessibleToast.makeText(this, getString(msgId, args), Toast.LENGTH_LONG).show(); } - @Override public void showToastMessage(String msg) { AccessibleToast.makeText(this, msg, Toast.LENGTH_LONG).show(); } - @Override public SettingsAPI getSettingsAPI() { return settingsAPI; } - @Override public SQLiteAPI getSQLiteAPI() { return sqliteAPI; } - @Override public void runInUIThread(Runnable run) { uiHandler.post(run); } - @Override public void runInUIThread(Runnable run, long delay) { uiHandler.postDelayed(run, delay); } @@ -730,7 +723,6 @@ public class OsmandApplication extends Application implements ClientContext { uiHandler.sendMessageDelayed(msg, delay); } - @Override public File getAppPath(String path) { if(path == null) { path = ""; @@ -738,12 +730,6 @@ public class OsmandApplication extends Application implements ClientContext { return new File(getSettings().getExternalStorageDirectory(), IndexConstants.APP_DIR + path); } - @Override - public Location getLastKnownLocation() { - return locationProvider.getLastKnownLocation(); - } - - public void applyTheme(Context c) { int t = R.style.OsmandLightDarkActionBarTheme; if (osmandSettings.OSMAND_THEME.get() == OsmandSettings.OSMAND_DARK_THEME) { diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index 80ca3e2084..0af25c800a 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -119,7 +119,7 @@ public class OsmandSettings { profilePreferences = getProfilePreferences(currentMode); } - public ClientContext getContext() { + public OsmandApplication getContext() { return ctx; } @@ -1680,7 +1680,7 @@ public class OsmandSettings { this.key = key; } - public String toHumanString(ClientContext ctx){ + public String toHumanString(Context ctx){ return ctx.getString(key); } @@ -1726,7 +1726,7 @@ public class OsmandSettings { this.ttsString = ttsString; } - public String toHumanString(ClientContext ctx){ + public String toHumanString(Context ctx){ return ctx.getString(key); } diff --git a/OsmAnd/src/net/osmand/plus/PoiFilter.java b/OsmAnd/src/net/osmand/plus/PoiFilter.java index e34d2b4255..5df97e9a91 100644 --- a/OsmAnd/src/net/osmand/plus/PoiFilter.java +++ b/OsmAnd/src/net/osmand/plus/PoiFilter.java @@ -15,6 +15,10 @@ import net.osmand.data.Amenity; import net.osmand.data.AmenityType; import net.osmand.util.MapUtils; +import org.apache.http.client.protocol.ClientContext; + +import android.content.Context; + public class PoiFilter { public final static String STD_PREFIX = "std_"; //$NON-NLS-1$ @@ -327,7 +331,7 @@ public class PoiFilter { this.isStandardFilter = isStandardFilter; } - public ClientContext getApplication() { + public Context getApplication() { return app; } diff --git a/OsmAnd/src/net/osmand/plus/PoiFiltersHelper.java b/OsmAnd/src/net/osmand/plus/PoiFiltersHelper.java index b7ac0010a9..90fbb7e22f 100644 --- a/OsmAnd/src/net/osmand/plus/PoiFiltersHelper.java +++ b/OsmAnd/src/net/osmand/plus/PoiFiltersHelper.java @@ -301,10 +301,10 @@ public class PoiFiltersHelper { private static final String CATEGORIES_COL_SUBCATEGORY = "subcategory"; //$NON-NLS-1$ private static final String CATEGORIES_TABLE_CREATE = "CREATE TABLE " + CATEGORIES_NAME + " (" + //$NON-NLS-1$ //$NON-NLS-2$ CATEGORIES_FILTER_ID + ", " + CATEGORIES_COL_CATEGORY + ", " + CATEGORIES_COL_SUBCATEGORY + ");"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - private ClientContext context; + private OsmandApplication context; private SQLiteConnection conn; - PoiFilterDbHelper(ClientContext context) { + PoiFilterDbHelper(OsmandApplication context) { this.context = context; } diff --git a/OsmAnd/src/net/osmand/plus/SQLiteTileSource.java b/OsmAnd/src/net/osmand/plus/SQLiteTileSource.java index f8b07c3dc0..5d603235f7 100644 --- a/OsmAnd/src/net/osmand/plus/SQLiteTileSource.java +++ b/OsmAnd/src/net/osmand/plus/SQLiteTileSource.java @@ -18,6 +18,7 @@ import net.osmand.plus.api.SQLiteAPI.SQLiteCursor; import net.osmand.util.Algorithms; import org.apache.commons.logging.Log; +import org.apache.http.client.protocol.ClientContext; import android.database.sqlite.SQLiteDiskIOException; import android.graphics.Bitmap; @@ -42,12 +43,12 @@ public class SQLiteTileSource implements ITileSource { private int expirationTimeMillis = -1; // never static final int tileSize = 256; - private ClientContext ctx; + private OsmandApplication ctx; private boolean onlyReadonlyAvailable = false; - public SQLiteTileSource(ClientContext ctx, File f, List toFindUrl){ + public SQLiteTileSource(OsmandApplication ctx, File f, List toFindUrl){ this.ctx = ctx; this.file = f; if (f != null) { diff --git a/OsmAnd/src/net/osmand/plus/SearchHistoryHelper.java b/OsmAnd/src/net/osmand/plus/SearchHistoryHelper.java index 72b3ce0fcb..1cbdc4c974 100644 --- a/OsmAnd/src/net/osmand/plus/SearchHistoryHelper.java +++ b/OsmAnd/src/net/osmand/plus/SearchHistoryHelper.java @@ -9,14 +9,14 @@ import net.osmand.plus.api.SQLiteAPI.SQLiteCursor; public class SearchHistoryHelper { private static final int HISTORY_LIMIT = 50; - private ClientContext context; + private OsmandApplication context; private List loadedEntries = null; - public SearchHistoryHelper(ClientContext context) { + public SearchHistoryHelper(OsmandApplication context) { this.context = context; } - public static SearchHistoryHelper getInstance(ClientContext context){ + public static SearchHistoryHelper getInstance(OsmandApplication context){ return new SearchHistoryHelper(context); } diff --git a/OsmAnd/src/net/osmand/plus/access/AccessibilityMode.java b/OsmAnd/src/net/osmand/plus/access/AccessibilityMode.java index f71179329f..c6bb62c2c6 100644 --- a/OsmAnd/src/net/osmand/plus/access/AccessibilityMode.java +++ b/OsmAnd/src/net/osmand/plus/access/AccessibilityMode.java @@ -1,7 +1,7 @@ package net.osmand.plus.access; -import net.osmand.plus.ClientContext; import net.osmand.plus.R; +import android.content.Context; public enum AccessibilityMode { @@ -15,7 +15,7 @@ public enum AccessibilityMode { this.key = key; } - public String toHumanString(ClientContext ctx) { + public String toHumanString(Context ctx) { return ctx.getString(key); } diff --git a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java index fc5e133bd3..657ebb850c 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java @@ -12,7 +12,6 @@ import net.osmand.IProgress; import net.osmand.IndexConstants; import net.osmand.access.AccessibleToast; import net.osmand.plus.ApplicationMode; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.OsmandSettings.DrivingRegion; diff --git a/OsmAnd/src/net/osmand/plus/activities/search/SearchAddressOnlineFragment.java b/OsmAnd/src/net/osmand/plus/activities/search/SearchAddressOnlineFragment.java index 77353391d9..0c123e827d 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/SearchAddressOnlineFragment.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/SearchAddressOnlineFragment.java @@ -12,7 +12,6 @@ import net.londatiga.android.QuickAction; import net.osmand.PlatformUtil; import net.osmand.access.AccessibleToast; import net.osmand.data.LatLon; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; diff --git a/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java b/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java index ea869b4b4f..09ba8e999e 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java @@ -4,7 +4,6 @@ import java.util.List; import net.londatiga.android.QuickAction; import net.osmand.data.LatLon; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -49,7 +48,7 @@ public class SearchHistoryFragment extends SherlockListFragment implements Sear @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - helper = SearchHistoryHelper.getInstance((ClientContext) getActivity().getApplicationContext()); + helper = SearchHistoryHelper.getInstance((OsmandApplication) getActivity().getApplicationContext()); } @Override diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java b/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java index b5554c4aac..241ae42e11 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java @@ -14,7 +14,6 @@ import java.util.zip.ZipInputStream; import net.osmand.IProgress; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java index 7855aaa51e..391c10fd44 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java @@ -5,10 +5,11 @@ import java.util.Collection; import java.util.List; import java.util.Map; -import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.DownloadIndexActivity; import net.osmand.plus.activities.OsmandBaseExpandableListAdapter; +import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.Typeface; @@ -119,7 +120,7 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem } } List filter = new ArrayList(); - ClientContext c = downloadActivity.getMyApplication(); + Context c = downloadActivity; for (IndexItem item : indexFiles) { boolean add = true; final String visibleName = item.getVisibleName(c).toLowerCase(); @@ -230,7 +231,7 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem TextView item = (TextView) row.findViewById(R.id.download_item); TextView description = (TextView) row.findViewById(R.id.download_descr); IndexItem e = (IndexItem) getChild(groupPosition, childPosition); - ClientContext clctx = downloadActivity.getMyApplication(); + OsmandApplication clctx = downloadActivity.getMyApplication(); String eName = e.getVisibleDescription(clctx) + "\n" + e.getVisibleName(clctx); item.setText(eName.trim()); //$NON-NLS-1$ String d = e.getDate() + "\n" + e.getSizeDescription(clctx); diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java b/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java index 2c0cb84b3b..df0dc3046f 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java @@ -10,13 +10,11 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.TimeZone; import java.util.zip.GZIPInputStream; import net.osmand.AndroidUtils; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.Version; diff --git a/OsmAnd/src/net/osmand/plus/download/IndexItem.java b/OsmAnd/src/net/osmand/plus/download/IndexItem.java index 15cc1c6478..b0c0e7c7ae 100644 --- a/OsmAnd/src/net/osmand/plus/download/IndexItem.java +++ b/OsmAnd/src/net/osmand/plus/download/IndexItem.java @@ -14,7 +14,6 @@ import java.util.TimeZone; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; @@ -52,7 +51,7 @@ public class IndexItem implements Comparable { this.type = type; } - public String getVisibleDescription(ClientContext ctx) { + public String getVisibleDescription(Context ctx) { String s = ""; //$NON-NLS-1$ if (type == DownloadActivityType.SRTM_COUNTRY_FILE) { return ctx.getString(R.string.download_srtm_maps); @@ -66,7 +65,7 @@ public class IndexItem implements Comparable { return s; } - public String getVisibleName(ClientContext ctx) { + public String getVisibleName(Context ctx) { String s = ""; if (fileName.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP)) { s = ctx.getString(R.string.voice) + "\n"; @@ -134,7 +133,7 @@ public class IndexItem implements Comparable { return date; } - public String getSizeDescription(ClientContext ctx) { + public String getSizeDescription(Context ctx) { return size + " MB"; } diff --git a/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java b/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java index d42500f9c7..840f7ad511 100644 --- a/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java +++ b/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java @@ -7,7 +7,6 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; diff --git a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java index bfa5d432cf..07fbf870c4 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java @@ -9,7 +9,6 @@ import java.util.List; import net.osmand.CallbackWithObject; import net.osmand.IndexConstants; import net.osmand.access.AccessibleToast; -import net.osmand.plus.ClientContext; import net.osmand.plus.ContextMenuAdapter; import net.osmand.plus.GPXUtilities; import net.osmand.plus.GPXUtilities.GPXFile; diff --git a/OsmAnd/src/net/osmand/plus/render/NativeOsmandLibrary.java b/OsmAnd/src/net/osmand/plus/render/NativeOsmandLibrary.java index 1a594b5383..f1a48fa986 100644 --- a/OsmAnd/src/net/osmand/plus/render/NativeOsmandLibrary.java +++ b/OsmAnd/src/net/osmand/plus/render/NativeOsmandLibrary.java @@ -3,7 +3,7 @@ package net.osmand.plus.render; import net.osmand.NativeLibrary; import net.osmand.PlatformUtil; -import net.osmand.plus.ClientContext; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.render.OsmandRenderer.RenderingContext; import net.osmand.render.RenderingRuleSearchRequest; import net.osmand.render.RenderingRulesStorage; @@ -29,7 +29,7 @@ public class NativeOsmandLibrary extends NativeLibrary { } - public static NativeOsmandLibrary getLibrary(RenderingRulesStorage storage, ClientContext ctx) { + public static NativeOsmandLibrary getLibrary(RenderingRulesStorage storage, OsmandApplication ctx) { if (!isLoaded()) { synchronized (NativeOsmandLibrary.class) { if (!isLoaded()) { @@ -73,7 +73,7 @@ public class NativeOsmandLibrary extends NativeLibrary { return isNativeSupported != null; } - public static boolean isNativeSupported(RenderingRulesStorage storage, ClientContext ctx) { + public static boolean isNativeSupported(RenderingRulesStorage storage, OsmandApplication ctx) { if(storage != null) { getLibrary(storage, ctx); } diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java index 23b745482d..7893f08b48 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java @@ -14,7 +14,6 @@ import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule; import net.osmand.data.DataTileManager; import net.osmand.data.LatLon; import net.osmand.plus.ApplicationMode; -import net.osmand.plus.ClientContext; import net.osmand.plus.GPXUtilities.WptPt; import net.osmand.plus.R; import net.osmand.plus.routing.AlarmInfo.AlarmInfoType; @@ -22,6 +21,7 @@ import net.osmand.router.RouteSegmentResult; import net.osmand.router.TurnType; import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; +import android.content.Context; public class RouteCalculationResult { // could not be null and immodifiable! @@ -93,7 +93,7 @@ public class RouteCalculationResult { } public RouteCalculationResult(List list, Location start, LatLon end, List intermediates, - ClientContext ctx, boolean leftSide, float routingTime) { + Context ctx, boolean leftSide, float routingTime) { this.routingTime = routingTime; List computeDirections = new ArrayList(); this.errorMessage = null; @@ -141,7 +141,7 @@ public class RouteCalculationResult { return Collections.emptyList(); } - private static void calculateIntermediateIndexes(ClientContext ctx, List locations, + private static void calculateIntermediateIndexes(Context ctx, List locations, List intermediates, List localDirections, int[] intermediatePoints) { if(intermediates != null && localDirections != null) { int[] interLocations = new int[intermediates.size()]; @@ -226,7 +226,7 @@ public class RouteCalculationResult { * PREPARATION */ private static List convertVectorResult(List directions, List locations, List list, - List alarms, ClientContext ctx) { + List alarms, Context ctx) { float prevDirectionTime = 0; float prevDirectionDistance = 0; List segmentsToPopulate = new ArrayList(); @@ -296,7 +296,7 @@ public class RouteCalculationResult { } protected static void addMissingTurnsToRoute(List locations, - List originalDirections, Location start, LatLon end, ApplicationMode mode, ClientContext ctx, + List originalDirections, Location start, LatLon end, ApplicationMode mode, Context ctx, boolean leftSide){ if(locations.isEmpty()){ return; @@ -459,7 +459,7 @@ public class RouteCalculationResult { } - public static String toString(TurnType type, ClientContext ctx) { + public static String toString(TurnType type, Context ctx) { if(type.isRoundAbout()){ return ctx.getString(R.string.route_roundabout, type.getExitOut()); } else if(type.getValue().equals(TurnType.C)) { diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java index 02da021b7f..d9d7b92828 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java @@ -28,7 +28,6 @@ import net.osmand.binary.BinaryMapIndexReader; import net.osmand.data.DataTileManager; import net.osmand.data.LatLon; import net.osmand.plus.ApplicationMode; -import net.osmand.plus.ClientContext; import net.osmand.plus.GPXUtilities; import net.osmand.plus.GPXUtilities.GPXFile; import net.osmand.plus.GPXUtilities.Route; @@ -66,6 +65,7 @@ import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; +import android.content.Context; import android.os.Bundle; import btools.routingapp.IBRouterService; @@ -514,7 +514,7 @@ public class RouteProvider { return sublist; } - protected String getString(ClientContext ctx, int resId){ + protected String getString(Context ctx, int resId){ if(ctx == null){ return ""; //$NON-NLS-1$ } diff --git a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java index d94ebb2f46..7c39e70bc8 100644 --- a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java +++ b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java @@ -4,7 +4,6 @@ package net.osmand.plus.routing; import net.osmand.Location; import net.osmand.binary.RouteDataObject; import net.osmand.plus.ApplicationMode; -import net.osmand.plus.ClientContext; import net.osmand.plus.routing.AlarmInfo.AlarmInfoType; import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo; import net.osmand.plus.voice.AbstractPrologCommandPlayer; @@ -15,6 +14,7 @@ import net.osmand.router.TurnType; import net.osmand.util.Algorithms; import alice.tuprolog.Struct; import alice.tuprolog.Term; +import android.content.Context; public class VoiceRouter { @@ -653,7 +653,7 @@ public class VoiceRouter { } } - public void onApplicationTerminate(ClientContext ctx) { + public void onApplicationTerminate(Context ctx) { if (player != null) { player.clear(); } diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/AppearanceWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/AppearanceWidgetsFactory.java index 40a4f8b79f..6461bb36fe 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/AppearanceWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/AppearanceWidgetsFactory.java @@ -1,8 +1,10 @@ package net.osmand.plus.views.mapwidgets; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.widget.Toast; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + import net.osmand.access.AccessibleToast; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -13,11 +15,9 @@ import net.osmand.plus.views.MapInfoLayer; import net.osmand.plus.views.OsmandMapTileView; import net.osmand.render.RenderingRuleProperty; import net.osmand.render.RenderingRulesStorage; - -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.widget.Toast; public class AppearanceWidgetsFactory { diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/BaseMapWidget.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/BaseMapWidget.java index e5024f1f47..af9c535029 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/BaseMapWidget.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/BaseMapWidget.java @@ -1,6 +1,5 @@ package net.osmand.plus.views.mapwidgets; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmandApplication; import net.osmand.plus.views.OsmandMapLayer.DrawSettings; import net.osmand.plus.views.ShadowText; diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java index 21922571b8..bee72d72ea 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java @@ -46,7 +46,7 @@ public class MapInfoWidgetsFactory { @Override public boolean updateInfo(DrawSettings d) { // draw speed - Location loc = map.getMyApplication().getLastKnownLocation(); + Location loc = map.getMyApplication().getLocationProvider().getLastKnownLocation(); if (loc != null && loc.hasAltitude()) { double compAlt = loc.getAltitude(); if (cachedAlt != (int) compAlt) { diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java index 5462731cb0..b9547eadb5 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java @@ -340,7 +340,7 @@ public class RouteInfoWidgetsFactory { @Override public boolean updateInfo(DrawSettings drawSettings) { - Location loc = app.getLastKnownLocation(); + Location loc = app.getLocationProvider().getLastKnownLocation(); // draw speed if (loc != null && loc.hasSpeed()) { // .1 mps == 0.36 kph diff --git a/OsmAnd/src/net/osmand/plus/voice/MediaCommandPlayerImpl.java b/OsmAnd/src/net/osmand/plus/voice/MediaCommandPlayerImpl.java index 4c2751650c..089457c0c5 100644 --- a/OsmAnd/src/net/osmand/plus/voice/MediaCommandPlayerImpl.java +++ b/OsmAnd/src/net/osmand/plus/voice/MediaCommandPlayerImpl.java @@ -7,7 +7,6 @@ import java.util.Collections; import java.util.List; import net.osmand.PlatformUtil; -import net.osmand.plus.ClientContext; import net.osmand.plus.OsmandApplication; import org.apache.commons.logging.Log; From c7c6a74efc5e84dab69d450b67a4a09a408abec3 Mon Sep 17 00:00:00 2001 From: vshcherb Date: Sat, 12 Apr 2014 00:29:50 +0200 Subject: [PATCH 10/29] Fix crash --- .../net/osmand/plus/activities/SettingsNavigationActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/src/net/osmand/plus/activities/SettingsNavigationActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsNavigationActivity.java index 67dbb6a1bf..415ae35e77 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsNavigationActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsNavigationActivity.java @@ -245,6 +245,7 @@ public class SettingsNavigationActivity extends SettingsBaseActivity { routerServicePreference.setSummary(getString(R.string.router_service_descr) + " [" + settings.ROUTER_SERVICE.get() + "]"); prepareRoutingPrefs(getPreferenceScreen()); + super.updateAllSettings(); } return true; } From 2dc9e63dc947c12117d609fa665dc7fe00310e3f Mon Sep 17 00:00:00 2001 From: vshcherb Date: Sat, 12 Apr 2014 23:37:18 +0200 Subject: [PATCH 11/29] Fix collator issue --- OsmAnd-java/src/net/osmand/Collator.java | 2 +- .../src/net/osmand/CollatorStringMatcher.java | 2 +- .../src/net/osmand/OsmAndCollator.java | 40 +++++++++++++++++++ OsmAnd-java/src/net/osmand/PlatformUtil.java | 34 ---------------- .../osmand/binary/BinaryMapIndexReader.java | 3 +- OsmAnd-java/src/net/osmand/data/City.java | 4 +- .../src/net/osmand/data/MapObject.java | 6 +-- .../osmand/router/RoutePlannerFrontEnd.java | 2 + OsmAnd/src/net/osmand/PlatformUtil.java | 28 ------------- .../search/SearchByNameAbstractActivity.java | 3 +- .../search/SearchCityByNameActivity.java | 4 +- .../RegionAddressRepositoryBinary.java | 5 ++- 12 files changed, 58 insertions(+), 75 deletions(-) create mode 100644 OsmAnd-java/src/net/osmand/OsmAndCollator.java diff --git a/OsmAnd-java/src/net/osmand/Collator.java b/OsmAnd-java/src/net/osmand/Collator.java index 3991947b01..7fd96f0bc6 100644 --- a/OsmAnd-java/src/net/osmand/Collator.java +++ b/OsmAnd-java/src/net/osmand/Collator.java @@ -3,7 +3,7 @@ package net.osmand; /** * Wrapper of java.text. Collator */ -public interface Collator extends java.util.Comparator, Cloneable{ +public interface Collator extends java.util.Comparator, Cloneable { public boolean equals(String source, String target); diff --git a/OsmAnd-java/src/net/osmand/CollatorStringMatcher.java b/OsmAnd-java/src/net/osmand/CollatorStringMatcher.java index 0b9419ef88..1fa8ce9088 100644 --- a/OsmAnd-java/src/net/osmand/CollatorStringMatcher.java +++ b/OsmAnd-java/src/net/osmand/CollatorStringMatcher.java @@ -22,7 +22,7 @@ public class CollatorStringMatcher implements StringMatcher { } public CollatorStringMatcher(String part, StringMatcherMode mode) { - this.collator = PlatformUtil.primaryCollator(); + this.collator = OsmAndCollator.primaryCollator(); this.part = part; this.mode = mode; } diff --git a/OsmAnd-java/src/net/osmand/OsmAndCollator.java b/OsmAnd-java/src/net/osmand/OsmAndCollator.java new file mode 100644 index 0000000000..1ba11f3d60 --- /dev/null +++ b/OsmAnd-java/src/net/osmand/OsmAndCollator.java @@ -0,0 +1,40 @@ +package net.osmand; + +import java.util.Locale; + +public class OsmAndCollator { + + public static net.osmand.Collator primaryCollator() { + // romanian locale encounters diacritics as differnet symbols + final java.text.Collator instance = Locale.getDefault().getLanguage().equals("ro") || + Locale.getDefault().getLanguage().equals("sk")? java.text.Collator.getInstance(Locale.US) + : java.text.Collator.getInstance(); + instance.setStrength(java.text.Collator.PRIMARY); + return wrapCollator(instance); + } + + public static net.osmand.Collator wrapCollator(final java.text.Collator instance) { + return new net.osmand.Collator() { + + @Override + public int compare(Object o1, Object o2) { + return instance.compare(o1, o2); + } + + @Override + public boolean equals(Object obj) { + return instance.equals(obj); + } + + @Override + public boolean equals(String source, String target) { + return instance.equals(source, target); + } + + @Override + public int compare(String source, String target) { + return instance.compare(source, target); + } + }; + } +} diff --git a/OsmAnd-java/src/net/osmand/PlatformUtil.java b/OsmAnd-java/src/net/osmand/PlatformUtil.java index a3517ff0ba..97149ef97f 100644 --- a/OsmAnd-java/src/net/osmand/PlatformUtil.java +++ b/OsmAnd-java/src/net/osmand/PlatformUtil.java @@ -27,38 +27,4 @@ public class PlatformUtil { return new org.kxml2.io.KXmlParser(); } - - public static net.osmand.Collator primaryCollator() { - // romanian locale encounters diacritics as differnet symbols - final java.text.Collator instance = Locale.getDefault().getLanguage().equals("ro") || - Locale.getDefault().getLanguage().equals("sk")? java.text.Collator.getInstance(Locale.US) - : java.text.Collator.getInstance(); - instance.setStrength(java.text.Collator.PRIMARY); - return wrapCollator(instance); - } - - public static net.osmand.Collator wrapCollator(final java.text.Collator instance) { - return new net.osmand.Collator() { - - @Override - public int compare(Object o1, Object o2) { - return instance.compare(o1, o2); - } - - @Override - public boolean equals(Object obj) { - return instance.equals(obj); - } - - @Override - public boolean equals(String source, String target) { - return instance.equals(source, target); - } - - @Override - public int compare(String source, String target) { - return instance.compare(source, target); - } - }; - } } diff --git a/OsmAnd-java/src/net/osmand/binary/BinaryMapIndexReader.java b/OsmAnd-java/src/net/osmand/binary/BinaryMapIndexReader.java index b48ee00f61..8f898b60de 100644 --- a/OsmAnd-java/src/net/osmand/binary/BinaryMapIndexReader.java +++ b/OsmAnd-java/src/net/osmand/binary/BinaryMapIndexReader.java @@ -20,6 +20,7 @@ import java.util.Map.Entry; import net.osmand.Collator; import net.osmand.CollatorStringMatcher; import net.osmand.CollatorStringMatcher.StringMatcherMode; +import net.osmand.OsmAndCollator; import net.osmand.PlatformUtil; import net.osmand.ResultMatcher; import net.osmand.StringMatcher; @@ -1223,7 +1224,7 @@ public class BinaryMapIndexReader { if (query == null || query.length() == 0) { throw new IllegalArgumentException(); } - Collator collator = PlatformUtil.primaryCollator(); + Collator collator = OsmAndCollator.primaryCollator(); for (PoiRegion poiIndex : poiIndexes) { poiAdapter.initCategories(poiIndex); for (int i = 0; i < poiIndex.categories.size(); i++) { diff --git a/OsmAnd-java/src/net/osmand/data/City.java b/OsmAnd-java/src/net/osmand/data/City.java index cbadc9c975..1ed62b8ecd 100644 --- a/OsmAnd-java/src/net/osmand/data/City.java +++ b/OsmAnd-java/src/net/osmand/data/City.java @@ -4,7 +4,7 @@ import java.util.Collection; import java.util.Map; import java.util.TreeMap; -import net.osmand.PlatformUtil; +import net.osmand.OsmAndCollator; import net.osmand.util.Algorithms; public class City extends MapObject { @@ -42,7 +42,7 @@ public class City extends MapObject { private CityType type = null; // Be attentive ! Working with street names ignoring case - private Map streets = new TreeMap(PlatformUtil.primaryCollator()); + private Map streets = new TreeMap(OsmAndCollator.primaryCollator()); private String isin = null; private String postcode = null; diff --git a/OsmAnd-java/src/net/osmand/data/MapObject.java b/OsmAnd-java/src/net/osmand/data/MapObject.java index 291929eb66..f35b695a1f 100644 --- a/OsmAnd-java/src/net/osmand/data/MapObject.java +++ b/OsmAnd-java/src/net/osmand/data/MapObject.java @@ -5,7 +5,7 @@ import java.io.Serializable; import java.util.Comparator; import net.osmand.Collator; -import net.osmand.PlatformUtil; +import net.osmand.OsmAndCollator; public abstract class MapObject implements Comparable, Serializable { @@ -66,7 +66,7 @@ public abstract class MapObject implements Comparable, Serializable { @Override public int compareTo(MapObject o) { - return PlatformUtil.primaryCollator().compare(getName(), o.getName()); + return OsmAndCollator.primaryCollator().compare(getName(), o.getName()); } public int getFileOffset() { @@ -109,7 +109,7 @@ public abstract class MapObject implements Comparable, Serializable { public static class MapObjectComparator implements Comparator{ private final boolean en; - Collator collator = PlatformUtil.primaryCollator(); + Collator collator = OsmAndCollator.primaryCollator(); public MapObjectComparator(boolean en){ this.en = en; } diff --git a/OsmAnd-java/src/net/osmand/router/RoutePlannerFrontEnd.java b/OsmAnd-java/src/net/osmand/router/RoutePlannerFrontEnd.java index 82fc93bbb2..8191ff5fe0 100644 --- a/OsmAnd-java/src/net/osmand/router/RoutePlannerFrontEnd.java +++ b/OsmAnd-java/src/net/osmand/router/RoutePlannerFrontEnd.java @@ -199,8 +199,10 @@ public class RoutePlannerFrontEnd { RouteRegion[] regions = ctx.reverseMap.keySet().toArray(new BinaryMapRouteReaderAdapter.RouteRegion[ctx.reverseMap.size()]); ctx.checkOldRoutingFiles(ctx.startX, ctx.startY); ctx.checkOldRoutingFiles(ctx.targetX, ctx.targetY); + long time = System.currentTimeMillis(); RouteSegmentResult[] res = ctx.nativeLib.runNativeRouting(ctx.startX, ctx.startY, ctx.targetX, ctx.targetY, ctx.config, regions, ctx.calculationProgress, ctx.precalculatedRouteDirection, ctx.calculationMode == RouteCalculationMode.BASE); + System.out.println("Native routing took " + (System.currentTimeMillis() - time) / 1000f + " seconds"); ArrayList result = new ArrayList(Arrays.asList(res)); ctx.routingTime = ctx.calculationProgress.routingCalculatedTime; ctx.visitedSegments = ctx.calculationProgress.visitedSegments; diff --git a/OsmAnd/src/net/osmand/PlatformUtil.java b/OsmAnd/src/net/osmand/PlatformUtil.java index 76afb9fe30..68cecdec45 100644 --- a/OsmAnd/src/net/osmand/PlatformUtil.java +++ b/OsmAnd/src/net/osmand/PlatformUtil.java @@ -1,11 +1,8 @@ package net.osmand; -import java.text.Collator; - import org.apache.commons.logging.Log; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlPullParserFactory; import org.xmlpull.v1.XmlSerializer; import android.util.Xml; @@ -169,30 +166,5 @@ public class PlatformUtil { return Xml.newSerializer(); } - public static net.osmand.Collator primaryCollator(){ - final Collator instance = Collator.getInstance(); - instance.setStrength(Collator.PRIMARY); - return new net.osmand.Collator() { - - @Override - public int compare(Object o1, Object o2) { - return instance.compare(o1, o2); - } - - @Override - public boolean equals(Object obj) { - return instance.equals(obj); - } - @Override - public boolean equals(String source, String target) { - return instance.equals(source, target); - } - - @Override - public int compare(String source, String target) { - return instance.compare(source, target); - } - }; - } } diff --git a/OsmAnd/src/net/osmand/plus/activities/search/SearchByNameAbstractActivity.java b/OsmAnd/src/net/osmand/plus/activities/search/SearchByNameAbstractActivity.java index deb0b00201..d92b062186 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/SearchByNameAbstractActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/SearchByNameAbstractActivity.java @@ -12,6 +12,7 @@ import java.util.Map; import net.osmand.Collator; import net.osmand.CollatorStringMatcher; import net.osmand.CollatorStringMatcher.StringMatcherMode; +import net.osmand.OsmAndCollator; import net.osmand.PlatformUtil; import net.osmand.data.LatLon; import net.osmand.data.MapObject; @@ -113,7 +114,7 @@ public abstract class SearchByNameAbstractActivity extends OsmandListActivity final NamesAdapter namesAdapter = new NamesAdapter(new ArrayList(), createComparator()); //$NON-NLS-1$ setListAdapter(namesAdapter); - collator = PlatformUtil.primaryCollator(); + collator = OsmAndCollator.primaryCollator(); progress = (ProgressBar) findViewById(R.id.ProgressBar); diff --git a/OsmAnd/src/net/osmand/plus/activities/search/SearchCityByNameActivity.java b/OsmAnd/src/net/osmand/plus/activities/search/SearchCityByNameActivity.java index 73606fe1ac..f041a952ce 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/SearchCityByNameActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/SearchCityByNameActivity.java @@ -6,7 +6,7 @@ import java.util.List; import net.osmand.CollatorStringMatcher; import net.osmand.CollatorStringMatcher.StringMatcherMode; -import net.osmand.PlatformUtil; +import net.osmand.OsmAndCollator; import net.osmand.ResultMatcher; import net.osmand.data.City; import net.osmand.data.City.CityType; @@ -180,7 +180,7 @@ public class SearchCityByNameActivity extends SearchByNameAbstractActivity private CityComparator(StringMatcherMode startsWith, boolean en) { this.startsWith = startsWith; - this.cs = PlatformUtil.primaryCollator(); + this.cs = OsmAndCollator.primaryCollator(); this.en = en; } diff --git a/OsmAnd/src/net/osmand/plus/resources/RegionAddressRepositoryBinary.java b/OsmAnd/src/net/osmand/plus/resources/RegionAddressRepositoryBinary.java index 021af0c502..23d75f0077 100644 --- a/OsmAnd/src/net/osmand/plus/resources/RegionAddressRepositoryBinary.java +++ b/OsmAnd/src/net/osmand/plus/resources/RegionAddressRepositoryBinary.java @@ -12,6 +12,7 @@ import java.util.TreeMap; import net.osmand.Collator; import net.osmand.CollatorStringMatcher; import net.osmand.CollatorStringMatcher.StringMatcherMode; +import net.osmand.OsmAndCollator; import net.osmand.PlatformUtil; import net.osmand.ResultMatcher; import net.osmand.binary.BinaryMapAddressReaderAdapter; @@ -40,8 +41,8 @@ public class RegionAddressRepositoryBinary implements RegionAddressRepository { public RegionAddressRepositoryBinary(BinaryMapIndexReader file, String name) { this.file = file; this.region = name; - this.collator = PlatformUtil.primaryCollator(); - this.postCodes = new TreeMap(PlatformUtil.primaryCollator()); + this.collator = OsmAndCollator.primaryCollator(); + this.postCodes = new TreeMap(OsmAndCollator.primaryCollator()); } @Override From bce2a537d70bf82254a6af1c46b98a8bdf54c089 Mon Sep 17 00:00:00 2001 From: vshcherb Date: Mon, 14 Apr 2014 02:08:48 +0200 Subject: [PATCH 12/29] Show locale names instead of download names (but search both) --- .../src/net/osmand/map/OsmandRegions.java | 225 +++++++++++++----- OsmAnd/res/values/strings.xml | 3 +- .../net/osmand/plus/OsmandApplication.java | 15 +- .../plus/download/DownloadIndexAdapter.java | 13 +- .../net/osmand/plus/download/IndexItem.java | 9 +- .../plus/download/IndexItemCategory.java | 18 +- .../plus/resources/ResourceManager.java | 1 + .../plus/views/DownloadedRegionsLayer.java | 4 +- 8 files changed, 205 insertions(+), 83 deletions(-) diff --git a/OsmAnd-java/src/net/osmand/map/OsmandRegions.java b/OsmAnd-java/src/net/osmand/map/OsmandRegions.java index 2100d4c9f2..5a28644611 100644 --- a/OsmAnd-java/src/net/osmand/map/OsmandRegions.java +++ b/OsmAnd-java/src/net/osmand/map/OsmandRegions.java @@ -1,36 +1,60 @@ package net.osmand.map; +import gnu.trove.iterator.TIntObjectIterator; import gnu.trove.list.array.TIntArrayList; + +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +import net.osmand.Collator; +import net.osmand.CollatorStringMatcher; +import net.osmand.OsmAndCollator; import net.osmand.ResultMatcher; import net.osmand.binary.BinaryMapDataObject; import net.osmand.binary.BinaryMapIndexReader; +import net.osmand.binary.BinaryMapIndexReader.MapIndex; +import net.osmand.binary.BinaryMapIndexReader.TagValuePair; import net.osmand.data.QuadRect; import net.osmand.data.QuadTree; import net.osmand.util.MapAlgorithms; import net.osmand.util.MapUtils; -import java.io.*; -import java.util.*; - public class OsmandRegions { private BinaryMapIndexReader reader; - Map> countries = new HashMap>(); + Map> countriesByDownloadName = new HashMap>(); + Map downloadNamesToLocaleNames = new HashMap(); + Map downloadNamesToLowercaseIndex = new HashMap(); QuadTree quadTree = null ; - Integer downloadNameType = null; Integer prefixType = null; - private Integer suffixType; + Integer downloadNameType = null; + Integer nameEnType = null; + Integer nameType = null; + Integer nameLocaleType = null; + String locale = "en"; + Integer suffixType; public void prepareFile(String fileName) throws IOException { reader = new BinaryMapIndexReader(new RandomAccessFile(fileName, "r")); + initLocaleNames(); } public boolean containsCountry(String name){ - return countries.containsKey(name); + return countriesByDownloadName.containsKey(name); } public String getDownloadName(BinaryMapDataObject o) { @@ -39,6 +63,42 @@ public class OsmandRegions { } return o.getNameByType(downloadNameType); } + + public String getLocaleName(String downloadName) { + final String lc = downloadName.toLowerCase(); + if(downloadNamesToLocaleNames.containsKey(lc)) { + return downloadNamesToLocaleNames.get(lc); + } + return downloadName.replace('_', ' '); + } + + public String getDownloadNameIndexLowercase(String downloadName) { + final String lc = downloadName.toLowerCase(); + if(downloadNamesToLowercaseIndex.containsKey(lc)) { + return downloadNamesToLowercaseIndex.get(lc); + } + return null; + } + + public String getLocaleName(BinaryMapDataObject object) { + String locName = ""; + if(locName == null || locName.length() == 0){ + if(nameLocaleType != null) { + locName = object.getNameByType(nameLocaleType); + } + } + if(locName == null || locName.length() == 0){ + if(nameEnType != null) { + locName = object.getNameByType(nameEnType); + } + } + if(locName == null || locName.length() == 0){ + if(nameType != null) { + locName = object.getNameByType(nameType); + } + } + return locName; + } public String getPrefix(BinaryMapDataObject o) { if(prefixType == null) { @@ -84,7 +144,7 @@ public class OsmandRegions { String cname = it.next(); BinaryMapDataObject container = null; int count = 0; - for (BinaryMapDataObject bo : countries.get(cname)) { + for (BinaryMapDataObject bo : countriesByDownloadName.get(cname)) { if (contain(bo, tile31x, tile31y)) { count++; container = bo; @@ -173,74 +233,125 @@ public class OsmandRegions { } return result; } + + public void setLocale(String locale) { + this.locale = locale; + } + + public void initLocaleNames() throws IOException { +// final Collator clt = OsmAndCollator.primaryCollator(); + final ResultMatcher resultMatcher = new ResultMatcher() { + + @Override + public boolean publish(BinaryMapDataObject object) { + if (object.getPointsLength() < 1) { + return false; + } + initTypes(object); + String downloadName = object.getNameByType(downloadNameType).toLowerCase(); + String locName = getLocaleName(object); + if(locName != null && locName.length() > 0){ + downloadNamesToLocaleNames.put(downloadName, locName); + } + MapIndex mi = object.getMapIndex(); + TIntObjectIterator it = object.getObjectNames().iterator(); + + StringBuilder ind = new StringBuilder(); + while(it.hasNext()) { + it.advance(); + TagValuePair tp = mi.decodeType(it.key()); + if(tp.tag.startsWith("name")) { + final String vl = it.value().toLowerCase(); +// if (!CollatorStringMatcher.ccontains(clt, ind.toString(), vl)) { + if(ind.indexOf(vl) == -1) { + ind.append(" ").append(vl); + } + } + } + downloadNamesToLowercaseIndex.put(downloadName, ind.toString()); + return false; + } + + @Override + public boolean isCancelled() { + return false; + } + }; + iterateOverAllObjects(resultMatcher); + } public void cacheAllCountries() throws IOException { quadTree = new QuadTree(new QuadRect(0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE), 8, 0.55f); + final ResultMatcher resultMatcher = new ResultMatcher() { + @Override + public boolean publish(BinaryMapDataObject object) { + if (object.getPointsLength() < 1) { + return false; + } + initTypes(object); + String nm = object.getNameByType(downloadNameType); + if (!countriesByDownloadName.containsKey(nm)) { + LinkedList ls = new LinkedList(); + countriesByDownloadName.put(nm, ls); + ls.add(object); + } else { + countriesByDownloadName.get(nm).add(object); + } + int maxx = object.getPoint31XTile(0); + int maxy = object.getPoint31YTile(0); + int minx = maxx; + int miny = maxy; + for (int i = 1; i < object.getPointsLength(); i++) { + int x = object.getPoint31XTile(i); + int y = object.getPoint31YTile(i); + if (y < miny) { + miny = y; + } else if (y > maxy) { + maxy = y; + } + if (x < minx) { + minx = x; + } else if (x > maxx) { + maxx = x; + } + } + quadTree.insert(nm, new QuadRect(minx, miny, maxx, maxy)); + return false; + } + + @Override + public boolean isCancelled() { + return false; + } + }; + iterateOverAllObjects(resultMatcher); + } + + private void iterateOverAllObjects(final ResultMatcher resultMatcher) throws IOException { BinaryMapIndexReader.SearchRequest sr = BinaryMapIndexReader.buildSearchRequest(0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, 5, new BinaryMapIndexReader.SearchFilter() { @Override public boolean accept(TIntArrayList types, BinaryMapIndexReader.MapIndex index) { return true; } - }, new ResultMatcher() { - - - @Override - public boolean publish(BinaryMapDataObject object) { - if (object.getPointsLength() < 1) { - return false; - } - initTypes(object); - String nm = object.getNameByType(downloadNameType); - if (!countries.containsKey(nm)) { - LinkedList ls = new LinkedList(); - countries.put(nm, ls); - ls.add(object); - } else { - countries.get(nm).add(object); - } - - int maxx = object.getPoint31XTile(0); - int maxy = object.getPoint31YTile(0); - int minx = maxx; - int miny = maxy; - for (int i = 1; i < object.getPointsLength(); i++) { - int x = object.getPoint31XTile(i); - int y = object.getPoint31YTile(i); - if (y < miny) { - miny = y; - } else if (y > maxy) { - maxy = y; - } - if (x < minx) { - minx = x; - } else if (x > maxx) { - maxx = x; - } - } - quadTree.insert(nm, new QuadRect(minx, miny, maxx, maxy)); - return false; - } - - @Override - public boolean isCancelled() { - return false; - } - } - ); + }, resultMatcher); if(reader != null) { reader.searchMapIndex(sr); } } + private void initTypes(BinaryMapDataObject object) { if (downloadNameType == null) { downloadNameType = object.getMapIndex().getRule("download_name", null); + nameType = object.getMapIndex().getRule("name", null); + nameEnType = object.getMapIndex().getRule("name:en", null); + nameLocaleType = object.getMapIndex().getRule("name:" + locale, null); prefixType = object.getMapIndex().getRule("region_prefix", null); suffixType = object.getMapIndex().getRule("region_suffix", null); - if (downloadNameType == null) { + if (downloadNameType == null || nameType == null) { throw new IllegalStateException(); } } @@ -266,7 +377,7 @@ public class OsmandRegions { public static void main(String[] args) throws IOException { OsmandRegions or = new OsmandRegions(); or.prepareFile("/home/victor/projects/osmand/osm-gen/Osmand_regions.obf"); - +// or.cacheAllCountries(); // long t = System.currentTimeMillis(); // or.cacheAllCountries(); // System.out.println("Init " + (System.currentTimeMillis() - t)); @@ -274,7 +385,7 @@ public class OsmandRegions { //testCountry(or, 15.8, 23.09, "chad"); testCountry(or, 52.10, 4.92, "netherlands"); testCountry(or, 52.15, 7.50, "nordrhein-westfalen"); - testCountry(or, 40.0760, 9.2807, "italy"); + testCountry(or, 40.0760, 9.2807, "italy", "sardegna"); testCountry(or, 28.8056, 29.9858, "africa", "egypt" ); testCountry(or, 35.7521, 139.7887, "japan"); testCountry(or, 46.5145, 102.2580, "mongolia"); diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 3795c6f956..64ae57f9a7 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -9,7 +9,8 @@ 3. All your modified/created strings are in the top of the file (to make easier find what\'s translated). PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy --> - + Europe - Italy + Europe - Great Britain Calculate OsmAnd route segment without internet Calculate OsmAnd route for first and last route segment Do you want to use displayed track for navigation? diff --git a/OsmAnd/src/net/osmand/plus/OsmandApplication.java b/OsmAnd/src/net/osmand/plus/OsmandApplication.java index e26bf35032..01a34f8d87 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandApplication.java +++ b/OsmAnd/src/net/osmand/plus/OsmandApplication.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.Locale; import net.osmand.IndexConstants; -import net.osmand.Location; import net.osmand.PlatformUtil; import net.osmand.access.AccessibilityPlugin; import net.osmand.access.AccessibleAlertBuilder; @@ -82,7 +81,7 @@ public class OsmandApplication extends Application { public static final String EXCEPTION_PATH = "exception.log"; //$NON-NLS-1$ private static final org.apache.commons.logging.Log LOG = PlatformUtil.getLog(OsmandApplication.class); - ResourceManager manager = null; + ResourceManager resourceManager = null; PoiFiltersHelper poiFilters = null; RoutingHelper routingHelper = null; FavouritesDbHelper favorites = null; @@ -147,7 +146,7 @@ public class OsmandApplication extends Application { routingHelper = new RoutingHelper(this, player); taskManager = new OsmAndTaskManager(this); - manager = new ResourceManager(this); + resourceManager = new ResourceManager(this); daynightHelper = new DayNightHelper(this); locationProvider = new OsmAndLocationProvider(this); savingTrackHelper = new SavingTrackHelper(this); @@ -264,7 +263,7 @@ public class OsmandApplication extends Application { } public ResourceManager getResourceManager() { - return manager; + return resourceManager; } public DayNightHelper getDaynightHelper() { @@ -274,7 +273,7 @@ public class OsmandApplication extends Application { @Override public void onLowMemory() { super.onLowMemory(); - manager.onLowMemory(); + resourceManager.onLowMemory(); } @Override @@ -301,6 +300,8 @@ public class OsmandApplication extends Application { config.locale = prefferedLocale; getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); } + String clang = "".equals(lang) ? config.locale.getLanguage() : lang; + resourceManager.getOsmandRegions().setLocale(clang); } @@ -477,7 +478,7 @@ public class OsmandApplication extends Application { private void closeApplicationAnyway(final Activity activity, boolean disableService) { if (applicationInitializing) { - manager.close(); + resourceManager.close(); } applicationInitializing = false; @@ -546,7 +547,7 @@ public class OsmandApplication extends Application { } } } - warnings.addAll(manager.reloadIndexes(startDialog)); + warnings.addAll(resourceManager.reloadIndexes(startDialog)); player = null; if (savingTrackHelper.hasDataToSave()) { startDialog.startTask(getString(R.string.saving_gpx_tracks), -1); diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java index 391c10fd44..68978c06e0 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java @@ -5,6 +5,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import net.osmand.map.OsmandRegions; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.DownloadIndexActivity; @@ -34,6 +35,7 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem private int okColor; private int defaultColor; private int updateColor; + private OsmandRegions osmandRegions; public DownloadIndexAdapter(DownloadIndexActivity downloadActivity, List indexFiles) { this.downloadActivity = downloadActivity; @@ -48,6 +50,7 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem defaultColor = ta.getColor(0, downloadActivity.getResources().getColor(R.color.color_unknown)); ta.recycle(); updateColor = downloadActivity.getResources().getColor(R.color.color_update); + osmandRegions = downloadActivity.getMyApplication().getResourceManager().getOsmandRegions(); } public void setLoadedFiles(Map indexActivatedFileNames, Map indexFileNames) { @@ -123,12 +126,14 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem Context c = downloadActivity; for (IndexItem item : indexFiles) { boolean add = true; - final String visibleName = item.getVisibleName(c).toLowerCase(); + String indexLC = osmandRegions.getDownloadNameIndexLowercase(item.getBasename()); + if(indexLC == null) { + item.getVisibleName(c, osmandRegions).toLowerCase(); + } for(List or : conds) { boolean tadd = true; for (String var : or) { - if (!visibleName.contains(var) - /*&& !item.getDescription().toLowerCase().contains(var)*/) { + if (!indexLC.contains(var)) { tadd = false; break; } @@ -232,7 +237,7 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem TextView description = (TextView) row.findViewById(R.id.download_descr); IndexItem e = (IndexItem) getChild(groupPosition, childPosition); OsmandApplication clctx = downloadActivity.getMyApplication(); - String eName = e.getVisibleDescription(clctx) + "\n" + e.getVisibleName(clctx); + String eName = e.getVisibleDescription(clctx) + "\n" + e.getVisibleName(clctx, osmandRegions); item.setText(eName.trim()); //$NON-NLS-1$ String d = e.getDate() + "\n" + e.getSizeDescription(clctx); description.setText(d.trim()); diff --git a/OsmAnd/src/net/osmand/plus/download/IndexItem.java b/OsmAnd/src/net/osmand/plus/download/IndexItem.java index b0c0e7c7ae..172bc85ad5 100644 --- a/OsmAnd/src/net/osmand/plus/download/IndexItem.java +++ b/OsmAnd/src/net/osmand/plus/download/IndexItem.java @@ -14,6 +14,7 @@ import java.util.TimeZone; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; +import net.osmand.map.OsmandRegions; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; @@ -58,21 +59,17 @@ public class IndexItem implements Comparable { } else if (type == DownloadActivityType.ROADS_FILE) { return ctx.getString(R.string.download_roads_only_item); } -// fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT) -// fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP) -// fileName.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP) -// fileName.endsWith(IndexConstants.TTSVOICE_INDEX_EXT_ZIP) return s; } - public String getVisibleName(Context ctx) { + public String getVisibleName(Context ctx, OsmandRegions osmandRegions) { String s = ""; if (fileName.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP)) { s = ctx.getString(R.string.voice) + "\n"; } else if (fileName.endsWith(IndexConstants.TTSVOICE_INDEX_EXT_ZIP)) { s = ctx.getString(R.string.ttsvoice) + "\n"; } - return s + getBasename().replace('_', ' '); + return s + osmandRegions.getLocaleName(getBasename()); } public boolean isVoiceItem() { diff --git a/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java b/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java index 840f7ad511..91d86a64ec 100644 --- a/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java +++ b/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java @@ -62,18 +62,24 @@ public class IndexItemCategory implements Comparable { } else if (lc.contains("southamerica") || lc.contains("south-america")) { nameId = R.string.index_name_south_america; order = 45; - } else if (lc.startsWith("france_")) { - nameId = R.string.index_name_france; - order = 17; } else if ( lc.contains("germany")) { nameId = R.string.index_name_germany; order = 16; + } else if (lc.startsWith("france_")) { + nameId = R.string.index_name_france; + order = 17; + } else if (lc.startsWith("italy_")) { + nameId = R.string.index_name_italy; + order = 18; + } else if (lc.startsWith("gb_") || lc.startsWith("british")) { + nameId = R.string.index_name_gb; + order = 19; + } else if (lc.contains("russia")) { + nameId = R.string.index_name_russia; + order = 25; } else if (lc.contains("europe")) { nameId = R.string.index_name_europe; order = 15; - } else if (lc.contains("russia")) { - nameId = R.string.index_name_russia; - order = 18; } else if (lc.contains("africa") && !lc.contains("_wiki_")) { nameId = R.string.index_name_africa; order = 80; diff --git a/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java b/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java index 0d740adaee..3732fcba2c 100644 --- a/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java +++ b/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java @@ -176,6 +176,7 @@ public class ResourceManager { } } + public OsmandApplication getContext() { return context; } diff --git a/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java b/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java index 99bc961d9a..3a7cdc6fd0 100644 --- a/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java @@ -119,7 +119,7 @@ public class DownloadedRegionsLayer extends OsmandMapLayer { private static int ZOOM_TO_SHOW_BORDERS_ST = 5; private static int ZOOM_TO_SHOW_BORDERS = 7; - private static int ZOOM_TO_SHOW_MAP_NAMES = 12; + private static int ZOOM_TO_SHOW_MAP_NAMES = 8; @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { @@ -217,7 +217,7 @@ public class DownloadedRegionsLayer extends OsmandMapLayer { if ((currentObjects != null && currentObjects.size() > 0)) { for (int i = 0; i < currentObjects.size(); i++) { final BinaryMapDataObject o = currentObjects.get(i); - String name = Algorithms.capitalizeFirstLetterAndLowercase(o.getName()); + String name = osmandRegions.getLocaleName(o); //Algorithms.capitalizeFirstLetterAndLowercase(o.getName()); if (!set.add(name)) { continue; } From c543590194267d061b3ea051fc32383aa55f4a5d Mon Sep 17 00:00:00 2001 From: vshcherb Date: Mon, 14 Apr 2014 02:31:17 +0200 Subject: [PATCH 13/29] update languages --- OsmAnd/res/values/strings.xml | 39 ++++++++++++++++ .../activities/SettingsGeneralActivity.java | 46 ++++++++++++++++--- .../plus/download/DownloadIndexAdapter.java | 2 +- 3 files changed, 79 insertions(+), 8 deletions(-) diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 64ae57f9a7..65ca57705e 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -9,6 +9,45 @@ 3. All your modified/created strings are in the top of the file (to make easier find what\'s translated). PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy --> + English + Afrikaans + Armenian + Basque + Belarusian + Bosnian + Bulgarian + Catalan + Czech + Danish + Dutch + Finnish + French + Georgian + German + Greek + Hebrew + Hindi + Hungarian + Indonesian + Italian + Japanese + Korean + Latvian + Lithuanian + Marathi + Norwegian + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Spanish + Swedish + Turkish + Ukrainian + Vietnamese + Welsh Europe - Italy Europe - Great Britain Calculate OsmAnd route segment without internet diff --git a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java index 657ebb850c..356b2785c4 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java @@ -167,13 +167,45 @@ public class SettingsGeneralActivity extends SettingsBaseActivity { "sl", "es", "sv", "tr", "uk", "vi", "cy" }; entries = new String[] { getString(R.string.system_locale), - "English", "Afrikaans", "Armenian" + incompleteSuffix, "Basque" + incompleteSuffix, "Belarusian" + incompleteSuffix, "Bosnian" + incompleteSuffix, "Bulgarian" + incompleteSuffix, - "Catalan", "Czech", "Danish", "Dutch", "Finnish" + incompleteSuffix, "French", "Georgian", - "German", "Greek", "Hebrew", "Hindi" + incompleteSuffix, "Hungarian", "Indonesian" + incompleteSuffix, - "Italian", "Japanese" + incompleteSuffix, "Korean" + incompleteSuffix, "Latvian", "Lithuanian", "Marathi" +incompleteSuffix, - "Norwegian" + incompleteSuffix, "Polish", "Portuguese", "Romanian", "Russian", "Slovak", - "Slovenian", "Spanish", "Swedish", "Turkish" , "Ukrainian" , "Vietnamese", - "Welsh" + incompleteSuffix }; + getString(R.string.lang_en), + getString(R.string.lang_af), + getString(R.string.lang_hy) + incompleteSuffix, + getString(R.string.lang_eu) + incompleteSuffix, + getString(R.string.lang_be) + incompleteSuffix, + getString(R.string.lang_bs) + incompleteSuffix, + getString(R.string.lang_bg) + incompleteSuffix, + getString(R.string.lang_ca), + getString(R.string.lang_cs), + getString(R.string.lang_da), + getString(R.string.lang_nl), + getString(R.string.lang_fi) + incompleteSuffix, + getString(R.string.lang_fr), + getString(R.string.lang_ka), + getString(R.string.lang_de), + getString(R.string.lang_el), + getString(R.string.lang_iw), + getString(R.string.lang_hi) + incompleteSuffix, + getString(R.string.lang_hu), + getString(R.string.lang_id) + incompleteSuffix, + getString(R.string.lang_it), + getString(R.string.lang_ja) + incompleteSuffix, + getString(R.string.lang_ko) + incompleteSuffix, + getString(R.string.lang_lv), + getString(R.string.lang_lt), + getString(R.string.lang_mr), + getString(R.string.lang_no) + incompleteSuffix, + getString(R.string.lang_pl), + getString(R.string.lang_pt), + getString(R.string.lang_ro), + getString(R.string.lang_ru), + getString(R.string.lang_sk), + getString(R.string.lang_sl), + getString(R.string.lang_es), + getString(R.string.lang_sv), + getString(R.string.lang_tr), + getString(R.string.lang_uk), + getString(R.string.lang_vi), + getString(R.string.lang_cy) + incompleteSuffix,}; registerListPreference(settings.PREFERRED_LOCALE, screen, entries, entrieValues); diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java index 68978c06e0..d95388aff5 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java @@ -128,7 +128,7 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem boolean add = true; String indexLC = osmandRegions.getDownloadNameIndexLowercase(item.getBasename()); if(indexLC == null) { - item.getVisibleName(c, osmandRegions).toLowerCase(); + indexLC = item.getVisibleName(c, osmandRegions).toLowerCase(); } for(List or : conds) { boolean tadd = true; From 9ffb4490d7874e459f67118f1ea23d720dfa7572 Mon Sep 17 00:00:00 2001 From: vshcherb Date: Mon, 14 Apr 2014 23:59:34 +0200 Subject: [PATCH 14/29] Update download screen --- OsmAnd/res/values/strings.xml | 3 +++ .../net/osmand/plus/download/IndexItem.java | 25 ++++++++++++++++--- .../plus/download/IndexItemCategory.java | 21 +++++++++++++++- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 65ca57705e..b48553697b 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -9,6 +9,8 @@ 3. All your modified/created strings are in the top of the file (to make easier find what\'s translated). PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy --> + Chinese + Portuguese (Brazil) English Afrikaans Armenian @@ -48,6 +50,7 @@ Ukrainian Vietnamese Welsh + North America - Canada Europe - Italy Europe - Great Britain Calculate OsmAnd route segment without internet diff --git a/OsmAnd/src/net/osmand/plus/download/IndexItem.java b/OsmAnd/src/net/osmand/plus/download/IndexItem.java index 172bc85ad5..66df8696c9 100644 --- a/OsmAnd/src/net/osmand/plus/download/IndexItem.java +++ b/OsmAnd/src/net/osmand/plus/download/IndexItem.java @@ -5,6 +5,7 @@ import static net.osmand.IndexConstants.BINARY_SRTM_MAP_INDEX_EXT; import java.io.File; import java.io.IOException; +import java.lang.reflect.Field; import java.text.ParseException; import java.util.ArrayList; import java.util.Date; @@ -61,15 +62,31 @@ public class IndexItem implements Comparable { } return s; } + + public String getVoiceName(Context ctx) { + try { + String nm = getBasename().replace('-', '_').replace(' ', '_'); + if (nm.endsWith("-tts")) { + nm = nm.substring(0, nm.length() - 4); + } + Field f = R.string.class.getField("lang_"+nm); + if (f != null) { + Integer in = (Integer) f.get(null); + return ctx.getString(in); + } + } catch (Exception e) { + System.err.println(e.getMessage()); + } + return getBasename(); + } public String getVisibleName(Context ctx, OsmandRegions osmandRegions) { - String s = ""; if (fileName.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP)) { - s = ctx.getString(R.string.voice) + "\n"; + return ctx.getString(R.string.voice) + "\n" + getVoiceName(ctx); } else if (fileName.endsWith(IndexConstants.TTSVOICE_INDEX_EXT_ZIP)) { - s = ctx.getString(R.string.ttsvoice) + "\n"; + return ctx.getString(R.string.ttsvoice) + "\n" + getVoiceName(ctx); } - return s + osmandRegions.getLocaleName(getBasename()); + return osmandRegions.getLocaleName(getBasename()); } public boolean isVoiceItem() { diff --git a/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java b/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java index 91d86a64ec..e7b7f5f165 100644 --- a/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java +++ b/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java @@ -3,10 +3,14 @@ package net.osmand.plus.download; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.TreeMap; +import net.osmand.Collator; +import net.osmand.OsmAndCollator; +import net.osmand.map.OsmandRegions; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; @@ -26,7 +30,8 @@ public class IndexItemCategory implements Comparable { return order < another.order ? -1 : 1; } - public static List categorizeIndexItems(OsmandApplication ctx, Collection indexItems) { + public static List categorizeIndexItems(final OsmandApplication ctx, + Collection indexItems) { boolean skipWiki = Version.isFreeVersion(ctx); final Map cats = new TreeMap(); for (IndexItem i : indexItems) { @@ -49,6 +54,9 @@ public class IndexItemCategory implements Comparable { (lc.contains("united states") && lc.startsWith("north-america")) ) { nameId = R.string.index_name_us; order = 31; + } else if (lc.startsWith("canada")) { + nameId = R.string.index_name_canada; + order = 32; } else if (lc.contains("openmaps")) { nameId = R.string.index_name_openmaps; order = 90; @@ -98,6 +106,17 @@ public class IndexItemCategory implements Comparable { cats.get(name).items.add(i); } ArrayList r = new ArrayList(cats.values()); + final Collator collator = OsmAndCollator.primaryCollator(); + for(IndexItemCategory ct : r) { + final OsmandRegions osmandRegions = ctx.getResourceManager().getOsmandRegions(); + Collections.sort(ct.items, new Comparator() { + @Override + public int compare(IndexItem lhs, IndexItem rhs) { + return collator.compare(lhs.getVisibleName(ctx, osmandRegions), + rhs.getVisibleName(ctx, osmandRegions)); + } + }); + } Collections.sort(r); return r; } From a7a5639969749a645434ad5b4252675710750330 Mon Sep 17 00:00:00 2001 From: vshcherb Date: Tue, 15 Apr 2014 01:26:40 +0200 Subject: [PATCH 15/29] Update download items --- .../src/net/osmand/map/OsmandRegions.java | 9 ++---- OsmAnd/res/values/strings.xml | 7 ++++ .../net/osmand/plus/download/IndexItem.java | 32 +++++++++++++++++-- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/OsmAnd-java/src/net/osmand/map/OsmandRegions.java b/OsmAnd-java/src/net/osmand/map/OsmandRegions.java index 5a28644611..81db96e7ae 100644 --- a/OsmAnd-java/src/net/osmand/map/OsmandRegions.java +++ b/OsmAnd-java/src/net/osmand/map/OsmandRegions.java @@ -17,9 +17,6 @@ import java.util.Map; import java.util.Set; import java.util.TreeSet; -import net.osmand.Collator; -import net.osmand.CollatorStringMatcher; -import net.osmand.OsmAndCollator; import net.osmand.ResultMatcher; import net.osmand.binary.BinaryMapDataObject; import net.osmand.binary.BinaryMapIndexReader; @@ -244,11 +241,9 @@ public class OsmandRegions { @Override public boolean publish(BinaryMapDataObject object) { - if (object.getPointsLength() < 1) { - return false; - } initTypes(object); String downloadName = object.getNameByType(downloadNameType).toLowerCase(); + String prefix = object.getNameByType(prefixType); String locName = getLocaleName(object); if(locName != null && locName.length() > 0){ downloadNamesToLocaleNames.put(downloadName, locName); @@ -257,6 +252,8 @@ public class OsmandRegions { TIntObjectIterator it = object.getObjectNames().iterator(); StringBuilder ind = new StringBuilder(); + String pr = getDownloadNameIndexLowercase(prefix); + ind.append(pr == null ? prefix.toLowerCase() : pr.toLowerCase()).append(" "); while(it.hasNext()) { it.advance(); TagValuePair tp = mi.decodeType(it.key()); diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index b48553697b..97fc59b013 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -9,6 +9,13 @@ 3. All your modified/created strings are in the top of the file (to make easier find what\'s translated). PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy --> + addresses nationwide + World altitude correcion + World seamarks + World bitcoin payments + World overview map + World ski map + Croatian Chinese Portuguese (Brazil) English diff --git a/OsmAnd/src/net/osmand/plus/download/IndexItem.java b/OsmAnd/src/net/osmand/plus/download/IndexItem.java index 66df8696c9..4f195905d7 100644 --- a/OsmAnd/src/net/osmand/plus/download/IndexItem.java +++ b/OsmAnd/src/net/osmand/plus/download/IndexItem.java @@ -66,7 +66,7 @@ public class IndexItem implements Comparable { public String getVoiceName(Context ctx) { try { String nm = getBasename().replace('-', '_').replace(' ', '_'); - if (nm.endsWith("-tts")) { + if (nm.endsWith("_tts")) { nm = nm.substring(0, nm.length() - 4); } Field f = R.string.class.getField("lang_"+nm); @@ -86,7 +86,35 @@ public class IndexItem implements Comparable { } else if (fileName.endsWith(IndexConstants.TTSVOICE_INDEX_EXT_ZIP)) { return ctx.getString(R.string.ttsvoice) + "\n" + getVoiceName(ctx); } - return osmandRegions.getLocaleName(getBasename()); + final String bn = getBasename(); + final String lc = bn.toLowerCase(); + String std = getStandardMapName(ctx, lc); + if (std != null) { + return std; + } + if (bn.contains("addresses-nationwide")) { + final int ind = bn.indexOf("addresses-nationwide"); + String downloadName = bn.substring(0, ind - 1) + bn.substring(ind + "addresses-nationwide".length()); + return osmandRegions.getLocaleName(downloadName) + + " "+ ctx.getString(R.string.index_item_nation_addresses); + } + + return osmandRegions.getLocaleName(lc); + } + + private String getStandardMapName(Context ctx, String basename) { + if(basename.equals("world-ski")) { + return ctx.getString(R.string.index_item_world_ski); + } else if(basename.equals("world_altitude_correction_ww15mgh")) { + return ctx.getString(R.string.index_item_world_altitude_correction); + } else if(basename.equals("world_basemap")) { + return ctx.getString(R.string.index_item_world_basemap); + } else if(basename.equals("world_bitcoin_payments")) { + return ctx.getString(R.string.index_item_world_bitcoin_payments); + } else if(basename.equals("world_seamarks")) { + return ctx.getString(R.string.index_item_world_seamarks); + } + return null; } public boolean isVoiceItem() { From a1660b1df778bf28131bea82d47bd21551664faf Mon Sep 17 00:00:00 2001 From: vshcherb Date: Wed, 16 Apr 2014 17:19:48 +0200 Subject: [PATCH 16/29] Add future plugin / delete dropbox api --- OsmAnd/libs/dropbox-android-sdk-1.5.3.jar | Bin 90591 -> 0 bytes OsmAnd/src/net/osmand/plus/OsmandPlugin.java | 5 +- .../src/net/osmand/plus/OsmandSettings.java | 3 - .../osmand/plus/api/FileSettingsAPIImpl.java | 188 ++++++++++++++++++ .../osmand/plus/dropbox/DropboxPlugin.java | 146 -------------- .../osmand/plus/sherpafy/SherpafyPlugin.java | 44 ++++ plugins/Osmand-Sherpafy/.classpath | 9 + plugins/Osmand-Sherpafy/.gitignore | 4 + plugins/Osmand-Sherpafy/.project | 33 +++ plugins/Osmand-Sherpafy/AndroidManifest.xml | 26 +++ plugins/Osmand-Sherpafy/Osmand-Sherpafy.iml | 28 +++ plugins/Osmand-Sherpafy/proguard-project.txt | 20 ++ plugins/Osmand-Sherpafy/project.properties | 14 ++ .../res/drawable-hdpi/ic_launcher.png | Bin 0 -> 9397 bytes .../res/drawable-hdpi/icon.png | Bin 0 -> 7287 bytes .../res/drawable-ldpi/ic_launcher.png | Bin 0 -> 2729 bytes .../res/drawable-ldpi/icon.png | Bin 0 -> 2683 bytes .../res/drawable-mdpi/ic_launcher.png | Bin 0 -> 5237 bytes .../res/drawable-mdpi/icon.png | Bin 0 -> 4055 bytes .../res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 14383 bytes .../res/drawable-xhdpi/icon.png | Bin 0 -> 10436 bytes plugins/Osmand-Sherpafy/res/layout/main.xml | 13 ++ .../Osmand-Sherpafy/res/values/strings.xml | 8 + .../sherpafy/SherpafyPluginActivity.java | 60 ++++++ 24 files changed, 451 insertions(+), 150 deletions(-) delete mode 100644 OsmAnd/libs/dropbox-android-sdk-1.5.3.jar create mode 100644 OsmAnd/src/net/osmand/plus/api/FileSettingsAPIImpl.java delete mode 100644 OsmAnd/src/net/osmand/plus/dropbox/DropboxPlugin.java create mode 100644 OsmAnd/src/net/osmand/plus/sherpafy/SherpafyPlugin.java create mode 100644 plugins/Osmand-Sherpafy/.classpath create mode 100644 plugins/Osmand-Sherpafy/.gitignore create mode 100644 plugins/Osmand-Sherpafy/.project create mode 100644 plugins/Osmand-Sherpafy/AndroidManifest.xml create mode 100644 plugins/Osmand-Sherpafy/Osmand-Sherpafy.iml create mode 100644 plugins/Osmand-Sherpafy/proguard-project.txt create mode 100644 plugins/Osmand-Sherpafy/project.properties create mode 100644 plugins/Osmand-Sherpafy/res/drawable-hdpi/ic_launcher.png create mode 100644 plugins/Osmand-Sherpafy/res/drawable-hdpi/icon.png create mode 100644 plugins/Osmand-Sherpafy/res/drawable-ldpi/ic_launcher.png create mode 100644 plugins/Osmand-Sherpafy/res/drawable-ldpi/icon.png create mode 100644 plugins/Osmand-Sherpafy/res/drawable-mdpi/ic_launcher.png create mode 100644 plugins/Osmand-Sherpafy/res/drawable-mdpi/icon.png create mode 100644 plugins/Osmand-Sherpafy/res/drawable-xhdpi/ic_launcher.png create mode 100644 plugins/Osmand-Sherpafy/res/drawable-xhdpi/icon.png create mode 100644 plugins/Osmand-Sherpafy/res/layout/main.xml create mode 100644 plugins/Osmand-Sherpafy/res/values/strings.xml create mode 100644 plugins/Osmand-Sherpafy/src/net/osmand/sherpafy/SherpafyPluginActivity.java diff --git a/OsmAnd/libs/dropbox-android-sdk-1.5.3.jar b/OsmAnd/libs/dropbox-android-sdk-1.5.3.jar deleted file mode 100644 index c5bc5301544e889a26160bb29487fd066266a701..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90591 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

q6wDcnsv+@+yydt zMv?WaW@4FWtG}(rnqj9VEh`oZ`tS~1Yr6S8S+77s`}FUkLGar7xysx(7w|T zSVdHx{vYwU?YWVr8|R!&V$+g~O|6=>PSg8|P4bo;kmq(%Xw4FizPWHla5#wpj@ z)eKYFC#(2-*@Yg#syRTkhdTnO9Z*=YmZltH{7q&jay@W7y!14KTn3E5o!uk`^+O@* z#SMg-LCzSSe9a#sLixZ#iReg4=;(&N<3dslwBCTT7qE*q$-Tm;Xp9Ya5fSvu5=X}s z*i~Rk>c(=4zACEmVb_rWxdefEMoBzEL|o7mLH!C_p^t*)KbhS7?%W~VCCDmBo8U^K z#3r_-td(Cammi1DF*;{T%ohxux0(vH+Fm0d9Dl*0*Ao5WV_%`0`Ds`7{1Li`WfQaw zo=HYEpAl)CuJ?%e*M@|n9v#U4r^(UuPb1;KPP#Mwf8f-?Sl`LmNXXXCUBTGoZ-6E# zdCH;+AbnYDdTidCnODZV@}o7_%G~%P<}sk7NDCN3Lx+X6>ZCXTJeRc)$-`o*3w-5J z0PjFPsV&&sRWGG*t zU|^1vITz43Oy#7Dy`Ob1=!wVR4Yy}9g0+{avMpDCAH$WMG|?>IP!F3x(P=gvcIt_n zPQ7I}8#QAIk`$9-85oaa;Cfb;*|9}gD2g)=GpB0?TS|EA!MV4qgb-;s{M-%GI3;GW zo^1N5X@Qd!o#WVP#Yxk7#CcgZzc^V$Vr47uySc2}shRQi#G8bSsy)pjZM*2KVar*U zjF^@yfaAn|vsk!)RHZw*;#bidO9<+3(|{GcpV?V!(=f`naoaA9R_O$oO@?#+qn32+ zAGH)KH0tte=ZTL=1aJ)07IO3zgwPUT2+Z6<#o&-RAPKc=^LJ{4Nw{Zk(5B6J-+__P z(&-}%8wCsi4ANN$L+chosRaFV!-Jkn=-p ziHyktvFDJZLDsht2p)PF5YX)k_~fNEcX`X znvG7pPZ;2ys@3!(=9Na}*!@iiSc%5{GZlmJ8l`4NmV7^Z=@(;_*0SiVs6%25e@>6h zd#3jbvG$W+3Jme2%Ms#h8W$jcvTt8epO1pvuP`LP=fG^)c(Jd-M} zN}4>@y3^>59rY>4(>LxeEIi&@*=?Ni79?(A`RVtnu<&&VN+H+?v?Hsg1YM{*6eAf& zT}jKyPCj2;F`Xgo_~6SmB{}%`Ft4}5!Wse)Qr~qb+@g%Zsoe6vMJOX%!p#=lx^FlW z-0}7gko>|67SO%Z@^kXS*%O!2c>2BsQogJ76rjua1SC__kzCA0hIYGSf)}) z!VM525BtwI4pxMxP#^BbVFImGY9|Js7Fi?9TwXk`pqg|jg1ked+{PgOz-OWX^Ic4h zZTLrMvDoM|r+Hd&iUx7Vlh~tKG8*;@(M>f3O!gnDK^T(P6cA9IfodX1h3wu=NDKoM zbG5?yvRKQ>-`3S11GQlXd`7qmD#%pGMYRs=C8ILsD3w$xgAT9@1&b2Xf zw8_ybmk@=?bw$)~28A<7gAD>GBo+GJoVX~2n(B>QEOty^_@%vWAfNL?U7J|IB*h6$ zuF|-kvK_CCK6So6LG>^#!KHVT5HTZMJTG^nLX3k26$gT^sq*Qt13(Ldwj$iq!x#Et z`X`o|<=-$x??;H!i3r8SHZmC#HB8?j5e=(6^w-TwJ$_*oz4hJDvb{fkJWZvA!fn1; zuPSc9HR##JAZ8?vEf>ZY_11JTOtDYZx(jA`N~A!A)07T03v~Z@V7MOWvmix|k!?wS z7@k3zF$Znn1e<4^)cyCLWI!$vF@=B-r?Zfy^M zBP6w{-g+Tvh38t|>;HJ5(0)zu3v@rvnCWOl2wtVuBo-bbKhF_P10KX1G`Pf6vp$EB zxx7So;G;DQK_8Xi*I^S4n%`axa+Tn@+lr0!v zR%Aw9Xj^uQj>6ucbpUcXKgr4Fv?rW4qRlK!QUbw^B>0#mDZPaecoU4K)-Q zY9|kCp;J5nMJ|U!*0eoG04=8%w#09@UWKzT7kd*NXJ)R?R(G`OuQ0_H-XvDGWy-vr zz#ldZRsIl zRMLb;robt7Z=0()duo@nI>~I5nMc7-vOcf;Ld&!cv>VpKE7!;>Qt+pD)D7TtVLa72 zSKnLhQTN(|OH#!98o&Fkp4`%PzM?UyURQY}xz32)CH*+jB_z7d){np3>>kZuB_i8= zaq;lYa>ND81fr*peq!DEx&%+igx^c4VRQ!9*i}j0GVW`#mlDsqOlza^lxDbQqABzV zyK5>5_I~*BM8H|Bnq&3-s~MX&aYxf3$h!@3XbU2LbCTj@%740pkXO7Y3=! zjVTrB8jFJ!TlC#I3drg*Y}pXW$v#!~a_6T<@z)m(M?8b|l(*)b;? zEU|;^=ZD~PCWf_VI{nA#SD&5#13c}*ON1rd95xHvn5y{$${6_A?IMBNSwF8p*#mEX zndLjYLP0+-;Z6ce6vR~^IsPX&zehmo!_ObcvQvFV1wBBKj`<8s1XYLuRu3aEs2->Z zR1ePuYeyd-&`ZCi+IB=F;icgZ65zc<8;BiX3fm9z!9&I$N}T9oQe!L6F`r~-oIeehV~T}dV{e)b&Znr z)l+ywQa`0j+2g5UtR_0x*XpCb{N?SN7sk;kqjoUbUOA9tx%`(>?yzuzMWDI0198r< z(me(%X`n%ybVJ&e55wm5!&Z@1))UCK-2pd6t5Lr*h>=zyQ^Fy_DAOc4{^g&9LNcSV zTb zB21xKLxa2##JmbWV7oZwX!($Id($BDJpijh!x$8M7zC&9R4NTXVhA85EkEW9>MU^j z<)lD%-&Mv&F&$K6ggf(b!)M3E#^>XB;{2D2!D#f5+ae6z)6x7{U8d%8?Df;FJ|7dq765Qpn!rv50)|eXn4-_ zz%NiobI-6ycai=E#B4*mp~lp8j#N1e?kewbeiCHmhi$n~b2ATHo-MrDe2Y+*u&Xsz zPzr4Ms6q<|ktHP$WJUc^^Lc5*IDVTs=Owc!%CW+9BeiABm=OUU5$-u0Jn-Ox^zsbn zys0wpf$3zDfM_T774voz8@5>~!=tOIkZGKlbJDb>A|dg5jJdG- z+4|Zvzm^lQeP}8Zz=XcOEfY0XCZ$arB*AQBAxg;mlEey$SPMJL4A6dy{>3oa{(EQ= z2;9i6O;Xg#x!99~Tdi+R@C05~d)auXB$UpTiuMAU?A>NZa56MGXk zM7^PC#!C4T!#rw)h7`Iqf=y8#m4<46q$4@yagg3z9Po-PL-chL^#@_-WU(OAT=V^x z9IWZaR-;Hmf+^B*mz1K>n@I8xaAq@zS5_1v8wjxv%kcM%F=}>|AwrEiL#h@D$LeY( z+<XR&k7^?r*KH9;cB# zpVZSoL(*9wiqUd)v-U%ietT>UBK6mDXEayVL@m{(vB!`{)y_#A)j7icJ(K!19RUXO(qJ);H_05>&e;hNh@5-OG04$Q@_G>St$6p~ zeel>9=niZ4$aP5M`egFc+kz;bcuN<^Ds>C1qtkMi-hMJq1W$FbxwWwf`Z@UH(|txc z`|$73p=-zN);eAja^3 zb%`%4X>#DVJ!4&jONW_A{P{nf4zjboR>2>H&IRT_$>0A1qx*M}61TB)c2acuG4QPa z?c1rIJ0h*1d~aEfQB|S#^!5|(rtc0nTMGq^YcA97USI!FyZjVWp^Z4V+0wBG zPFPP42?XvKz+MD*X|XZmDSPoVxl{!+5Gp%iC9=54wKz4%B4YHQ?1(KLS&Xv@>G$lA z5o!#o$_Qcq<*7#YP3iD5AVO&Typ~)%jKNAXcgjsLe^TclhEb0895fxqeD(xBa2CMT zflYgvc#Myv;!11+c`5w3Pwpi@l?}Hs{1)OFt0X)q6=igL&GuYubr+)V`MDWxEY1N2 zRes$xN#2%qv7Fc};(h>JHcB76uy<{u##B;nI~aDMH1?q910MmVASjqV)C+f=8yAzeu2QMUMJA*M>IgHD1)SpK+hh{T+#tsc8ajwx*KC#C#A{Vh3UX(ZD*7^7 zK*?10tkuI&Oq9NM39s4W8VmAAx)tmaw7N+rDPK=ev?@tw@vf_zb|02oqQ1L7W$u|y z!YemI-Wv@_v{{1P5$(-&wu8W%HptW}{@yd>biQ_9!TuvylspBs%ag!EX28fT?!bVg zz*dDubMJ0#I(v2txp1xH7&p@93)PUIA@Brp@k|-vnDFcLkDEki#-}oC< z5VYB8yB)&Us$D`_dDf>?7V&ah>HZQ(+5^aeW)hBFr$*k5#!^_9VuLymow&nMj@?u2@3 zzy{q|OV0;2DXsV>N%Ooyns}mM3aMoV77=--=rwP^=_~4(JT*#jYX@P1-9c0x7X{8k z5Oue$G7_TX>|BRjxi=`s(G}t)eOB$K$!&Zp6Be3I!Eu|Cc(wWB;&?9sH0w^iY+QrV z*KT}68t*oc(}RSC7HnsUbmg#Y(Spc?QV^{0hHw?#K50HZ(>Un>7HNN`2j*|6iDLOh z-M#c6PtsNHV1p0{G4rJ6w&J}@IC#Nq2v(V1w9JtC9ijdSQaOiUry2noZ+s82@4!M= z9xvd0P#YgUOgfVWhFid!LW!RNUV>lkJS$osjYkxOM!!{^mw*aQd*kS$j5R!mzbg>zJ|rAuPNvTjef_Gxk8tGVxK3`ai2RrvYC!&8KTF1_=3mz7O>+YDZMc&A37+#OO{kr7ap&> z-@wW>P~+h-pJ(n zm}2Xyh;1KNv#2fZqTmRD|cLvy01lp!%+@Yz?$^+R{}chBmKzBg>i*ooS z^u^CN=>CIy_;sYUccFE1grSelAVRla`HQ0ZcIB4D7l`d8wE8d&obdX8KLW zdsPkC2ibz8*;_1ayltPQ=dVw{<@0=dNCeugwo#Aa0TpA3hSibL++t#_ zVjW+p(p(-(J%cbaM+n!9GrrhxxOA4$#MAx|M9_B8-rSi`INjAxo!)ipa(hbB?f0!NMickEQTz7oX&*$VSsT=upv?v)&@GuTsichC9)* z_fNd#Goc9eMto%u7>#} zJ}4onSlw1;kc!j~(Z4v@j7m8Z3 z9YZahbq$$IJXBC$P^iOG)7h=z>SG=F9hzd3kj{0w_E=8hb^EbfI-sNQ9vGRW^QB0m zOn``z@r$l#L({b0JA6-oOueE-(h?404kCL#L#~B;2UQm-BwWT}y@!LS<_Qw*RI_9O zj8TMXDL$W9ULw82?2>vre;YTy#58OHE|u{K0q+Zg2qUZK_lhif?r&9{-!w)}($}c| z@$NA}ec1)as^MNS!w99nb^woA-(F1FN2t(`VduTT)W3jj7t-eFfkNy7;^xR13>e$P z7z7ZbhRuL%`bvtCGlMB%Nw)Qt}$} zSxM$m%#XT@Y!>TJqJqAzI#p#1<$yHj$UEk(K?1<-yz6jUm)p8bYA1QFGJKCeA5@vgx`t7{ffQdfCa$Y1zOl+*K+CVO3YxTs zE~VB)^Q8H+^~hHeSO@H}+>FS#q<^t!#%l_Hk582zQaOc&g2IV{hBhe;Du0y`>jjCX zPj+D<$eqf%QrG){HiSvuXaRQ%apkW^#IJ#!N8vmLI)qhW8&C!DP`&S^cfQg-qLs!9 zqxlL6bi@~7P+b1A&60a7-`M}-bbbFvK;^$k+x@Fk`hSP>Dw*3Z{D$|=7?6pQl<;#% zp=#tX+e(roRF+>VR*;7jD+_ozVc#$!a>ZGLh5Uvj79xp*&v}&(Qzrw&6dtWJnz^{h zXlZyi`Mh6Qx&Bq|W`Q5s!Fh#6zRQnFrM4u`9QS+dH>fcV3Jx4bBMpIY>r@P&`X1^Xe zEB5u^*~@nBWi<5&idIO*^0r&&{ZTHwF={yrXjZJij*CFZ(M6@t?ij?dhxnJg?5Ir@ zvL(pA>_d1vBN$VlJRXM^Jftir=Q6s^q^jDEkF91kO~>-NOAc2ar9op~oOMKX<3OG) z*$XSGq4$O7mrCcBO~ro3_N?nmx17M=FM(xcb>uS1kw?JthqzFl8pHlx4xDr7V0Ouq zS}CjCa>Io|B5o74ux2jkU`w2JAmQi1K@u$!weS@nXiLW|kbwq{8v%DD7L4R?T|_~O z=Gj6rJQy*Zbru#idlx~O62w$yjc5qtQE&_g-Sz7Ba3)MDU8_uvZ;dkHJEIf4+-%}5 zVmfWHMD9rHEt$fJ61|*JaXtU;bjW(cOtKwpptu3yQco#PLB=rERFD%4sO5M1R zs71I!**xz|gEL_%NyCRAad*j9fqT_4+4!#JR>6xEvWuB9%1#wh3-9#X7d(+mxPlNY zQ;btjrt!|;zoXm3S!ObSwZkmrDmDiQab!vNM?XOSQLx;!N|)Gv`uFVrv42nbzZa~3 zF35kEDiw7lBvte;T42T?d8^;l%9hHF5cvq3a{2X^aYK;7~rArG1beA074@)E2-4ED1Z(8r)i4+9Ar+r6zKF>YRJ1K3im)AKypmM=@ z+^a!Eh|M1GqWQmkP7p1i_5$}r5>5*co0-xP6()@s7>M&?Zc~H6FhWU~>0`vqjJRp@ z!fy#6;Fx#`^MY^XAz~SLY4?B+kProIxKD=_aVvWfcsO< zMx`{NB5GN|0f@P72sI6^8IjCgVXkE4X#|T=LUFqJN?&tWJh+fF5e91rkaBMZU}F9?;pURL8O zn3-$2Oo4`Nm^5t_4XMY8ZE!3T>(KPsw&QPUMU1V6STU~mye&RXn~fF;$ql&z7V$L7>B`d> zd3!?{UGz$#IC)bR{+>$SV2_uY`h)6Vx|Dh%83QZP-XZteIdC5sI&{kBv!740&oT+|s#6WSo-j%E}v`*VvR({@`IC3{mA zHS+_?4lb61C(RTMu`55f-Udg}F_0cmWhURUbjRP)bQeGZ8+pYtoUOE-P}U^O#l%!H zmrT&v9s5$@r=?mnrHTY-)yOtsctioF@|G}Z4$0!JY9$cEc{629^KCex%Cao#q1!9Z z9h*e(YCIip5K|gkOB+JlOj@fu#l|k;4r3uNe>< z2R}Th5%845x;`aZ=#I)lOvP4sM3samvorz_GHoOCjpn;6Jm_c%J12vnD@~NiXDz z7xg?-TE8Yb+S$uT3JXR#CZJq)bEL(0#im{Vt1aXMTiwe88$KEUeM(S&19)gZS+Mmn zDU1*g#dv5frM()C*hJtonV)hNs5DOmLyR>Mr{Ahryc z2o0d5HqI!fP<4(`DguZPh zgs|GjmPIH>VW?9{yAoTT?}LQ-=zN#DkG6RN3dVWv4hdF+MylQ2m;L`qYN4D48C5Uf*Q>x2Bd zUCy)y>NsYQOi_dLPB5AeCoI691}>XUUEnt#B35On)!%ERqOuO^-!EBO%(`v|i#4-u z->~n6iu5^{zcvh7H^iDE$b>s$f;^j}@g@E*P5_(JUitl}oHYN;xBQ&dE+@bv6t4 z`4YBgagf7Vkj8cn{UO9w7OFJ_w zz7qP}U4@+AvUr41avootsxyoN+2@}a2wKX-w#N?!QvIVE{^!U0Uwq;!nK@e;K;zx#G3$yc{x*Ee)~+o6i)7olHq-FY8&cR{(tS7&O$HSSoR3j)bau%6z&4>NoXB z!ju{F`vsnHXAOLCEA>3-_0!X~<5k=B*7J{y#rxGP2Q4`0h(Qvvm8-}5qv7J1v1uhay~biJ)uBYjI*Guv`~OTng@GCZWfQbp5IT86h8e_dl{ zx6XI9tf1aJLnm1OGXw zFqz5D*>L92qrevlDpQp|08UyVPkcT3CW7Gm`vEffR-;d_GA6}+5P1;6P%Ra83VxPm zgcKlhZBs}vG>b{_IHSYERXJq;5cf?`qy18-WFom-llcyE3n?#s|Lj-2y^W#yHixiK zP+gd3t|8$yg!;w=i z;M#;2T=geh@x88hK?GA9b?icg&JZrQC0uFf{Nd*1w_n5>XykzYZ&5GOVO)vQ z`wCDjRF~VH)03Z>T<|<| z?D^OrdE19!_Q=6+v?IhLo&q%XQudpOXVx+7BkuyAeun7>f_XOf#O%C?4jlyHvvDSDExtuY}1LjZEQyNXC~iMdOl% zWZNoDYRp-!_cxvAaF}ET(OGi2c#88I{Z88S>lJ3SzFt=<->I#LS-WB$n>yv^m{;-b z;9t9towg(9Ed9$Zd3t@k8xEdfwNuSfqBz6rStV&O8YNPqUbp-+Df+~0qw%I(Uq!2` z5fqAxvRvu8fpewSPaCGDZ~3HtzUrp=%%qAml>{aQKF?&i%DO{w1s-KolPN=)F%lxT zJ+Vq(p*N0eS<|>;X}fL%vzYjD`UwFirIBk_^r5kEi-Ip7DF7BP>J1?W`C~TGx(Jx6 zDdc{!&no%3QX&JB!L_iR!#GRhHMwMJ4m6|h>R2*`AS6xo- z7h4nFyTX0@6??UT^^V%!V8rqDPM-wl^U0SeIJc0TK=kR1I6JZaXhkRqH$~pnf~+_@ z^`5yhUi?i|(2S$EQa=NPF8KRH17c318+YXyorIUpeoDVq5B}{??KhkOHxF<$;<^4P zxw|L3d6E|oG!{uyD3eI|GrdVtzfcwt|E4>lkPb7hfV-VrHUn@eSPsD;?+E)lp#2j` z{RNelsqO)4M<~w|%vHVZEdJ_$HhORzdK@7lah5NeQqcD3FhIXZf*u%Fx__cI$H(YzaS&(vyzvAb5^C`fK42{p*;? z^5csCj5qju&kPJi5NP=V_=_vTuPEt8HQNSEdYifeMUL4a(t|i#0uT76ictPlkAK2l z51GUtPe1pp?ng8H&w7FQf4!^!@)oAFAiS`KmV9lUFD#lIqOiFT4($YBM?{6#0}%mb z_K9I#u&Iyj*rTk*ngggY#Hab8m}v@=GFX#Bk_w8L%@=^kn}EzYJnYcSI5gHDa>0s< zo`qv;{(9QFG--@kQkOLDJiqU4t);D{J%3$iwm`~$p7(|R(u-%#?dR=O3Xa`3X4I+P z^;ELkrG<0uRvmsW!#_arYEu~Ag6!7yUoq~K0KwBK?!EN-{-s-eG{K_NiCUw04R9aSM)sL_Ip^iOfEL(=oCyDe9!ddP921=Bp@P3^#<4HScmkS7vziL z08NP<#`X66dE!Mln|ty)#%&Lmd$0=ZS!H6ow^g*!V#SNX=0(MLO&^`kK$mg1!~N_O<65E92N4N~80JW}?6$?G))EobN$ z*-NKy0p+9kXIRmmSN2bQp*wd!(k(iGj^c&!;KmxHr(l-~@*_52NBPDR5?B7_o$>2; zFz}aLA0EYxB;Dd(1!T1;r7!h?Eb>PgB!)ps@rTs#iqdKfpDCrT>J1v?mqOnZWH-S< zjZ!PLt?JDR>UV^tREFVJg%oMh*GVKWeMH$SqHhNEhk`dQ z4{$I}H4;T&gzD;)1@?0YF}jEaeSc0D^;|7PCAr<>sig&OT1IGbBaG{#$ILvbnNlT8 z%#wZGiIJ|?=u^dn^M~2{4^ch^$07~p@~^}}w(1(G{}8=IkiJG+XCwv+uGuBKVa631 zo){PSDsv-P$~+Ytjm65TH_FFQrs!et+gzNA!;qM(yBjKcwzgU00J1I=Q<>?oCQRBy z5r-JSGMW&F3{cHnF_ye)Hj6Y12ZW2&(}@`kCVESTg)I+HX=5$7G_q7*K(g7I=Pxa{ zpIF~y4+)f6Sf80`t*y?jHr1OeAA}^wR3{%TAHizyIrxceWU#W{?-z*R)F7Gc6%Rk5 zSc*hXkwuXnH(Q;bnb}xdY|PFrVY>J|*s(B(+|3LsiU+mP@Ra%MDTPw3CWeh9tRV#s z+tF9K~Vh0X&f%_G=AhIVk4ZgeqcN13J&EG{NB&IUw-PotEPS22b=5jV#$ zlO}SY4PncI&_K2rT?W`cr71QdUXn7{{%M{-Xbo4Zr`w2~^-01y z!q8;*I6q=QwdRFn<>uKe>hQantA1}@l)0*VgzXqvoph;qJXO+7N3J8u9vdD-m~WIn z`hk&QIMq}FM53H@ro8HVkF_5xXKJ4E>5C=52_SZl(I zAUw4~BKOhb&#|LwE%B9CMQn)w=zp6^0!)S1r*M=F@<4jW&HU!S{(V9X5vlM>u{nVu z{)~`!MZKkdEvay`#GnF1VjXge(fpPUbW0l)c=%wI03_ap-isa@K4 z+e9VkL=jee#&aWL8Q$-|Ed{1tDTZsKQY(@fWu|Z6{G!PS<^yix>A_YG2wef>L2u!; zzbSl@@g5te2U(BTZ5jk$_yYdUwTV(>(e_2g^4ivU631eMi_{|oL0Pw2;chkkCC_X> zo$wHEr@8fKhZtSM8{Aq57>y z=prVH`t5Ds$Rr3is+=p9C=1&Dh=R4&TH;Bv11SsgEhMH76o1|%{1P41aFMme$tkZl z=6m&}8T&U&6fH*?Q>@VXPc5~R@RPl~kS*D^B{NNhvF>?lmrE}5!p2n0(^G=T^oEll zBzW4E8dD9(m~ZpIIG4=c6k#upcsjD%zebG9MGwh3&emGxD{=yP3FEXA7mTDV)Pu!2 zVPt>U8(s zgbAyskbK5m#;;K-&L1*|#%$rn&y(j$){2g|P>570T5yihQah%_*%R6&jvPnnfE-P6U4EPb3&CS;(X|JRy;|b%s86C3Q+2B#gux%OD<& znY>3VtwCG0yG#o6sg}2A&mMi(qQ~mmZPc$KF=C;R*cf5gd(WICPcUFu-ht?aKUcUk zkJ-(v=t}RZ29IS1&^0LShmRc|sxZLv%$twEJVBT19KNLjUT z!(1kvylgqop}^&yo$E87>r94`=A+7-a;Ca^c$fLpWK~y(yf2H>^19khkq%ELbryqC zcSny{)FUl5-FP+S!KfbRi(Fk?vMd}*ob=aa&5bbQm75 z-ypZ1FPu_1Mn^@O;ON;5I43%ln%qY;trmkJ$?r#ly_0KFYvWX{Ga4b6k8zXQcEkv; zAkC5_jGHz*sX(tja}#-)KT~SwWTj8tYKt49N$QDYPDEFJWHd-Ag^Vp(a?#Z<0e<|b zsTidqoTMAVDpvEKPNBsIgJ-_01t}ty!}&Zc#|Wd9ZkLNNQ)pRa3OT1Dcos;VOOinn zi(;eEs#;K}Dxpo2Ya$h1GoQ-NnXx)LN1zfEmu&X%%~LOorr z%pY<*czr}Tnw~M`yRRrHQzPZrv2o6+jo5@tU!eoCf>MXhMc9Lbmf$Ubf}YV|jQLZPVy+d^Gl*HCw-kz!KQYonE9BNNg!QF*zj@9zb^;8QX) zP*(b7I;fWxIE=)yVk22fN<9UpBRE2{oOBxQIaYCsX*q=Si!p|7;uN*NxtH8R0<=R} zug#Ws7t$o&!i~tN5??rxRRs-V?8lHAL%fG)k=ZyE8Jw+G40*;;aDqm39K!dr1uuUk zC-VnA6v#YM4zb&c;PzxZ9kD%k5-6)!AvG{FUBDE5?O}eClY~lWOL8f^nbHL@-D`L; z~%EqWDwo=^Ua zpX9vN9+e*$*Fjg1?x3amKo@KvnlpBW{d8PRNeZHS3Mkv@VDL0$C zm&n5vZ+|fq1EG0gE}8S!ZwRp&PQ@^DG$>z+5wx|tLuK*UbptEqGJF;{t?oHP&O67q zZCOHtCK@RO!p(U3UxLL=P9gK#gCDmZHDQJ+Zw)`{qtvWBktd z*4ya<-gPh?ds|L4KtAqIbnFE1_>sJRYhZVSMpfKl1AI@kRq^a_aO+?5`-c?^x=Lt8ynzZBCh59xyZ=&P9W|7V6t- z^zK#5u19W=+UJj2GnSv_zx^pwOlPWcIl7@O#Ma>W(=fAOd)PKlp-1;*QgoqQ+u;Ih z9D&C_5<~Jj$6269pac1^6)dj7o`K}}VVC(haxzi0PF&lLuO-SHcTX&jP3$2cMii zKn!5C@WC+x>pFG=Oy#Yg9lC`c#GdKTJ>Xcqa>J!{_Cj*u(DB=fLE96IN!e2w zaRp9Jf#>AaI4`+jnkNzH6?*gwKLbEo0=mKc(8~4wrBlM2V)hwODI8K1N3UWYDDy({ z=&lD<8OXM)n%j?09ils6D+c1y=k-GK5%V-PapXsU6|^&e2OVryNQUdkFe4nX>m>$X z({sTn=F^r-Mt8=iu#>YpGhE*S?>{-7)-+)E;Y}}^vaSWWcArVBy?!sg?%@j4Pfrbg zKR{6G4Sc2nE9h;y1zVzcfX{xS{S}e}bLiP1WQS4ZNGY8WYG!g8D7R!&P6jQu;_)VONhN{}d4`NCm`+|nZ|H?(P0sxtnM3GHOd9+u%?5l2*&yZbZZ{pr z8V{4{j)!I$l%0{IoVAc8;OoWvO3-2Gj7zx+B(aXv?$}f|iqtZ}j7*z5&bOL=Cb#o1 z0_;i&veq!J$sKDDDH8x_+9)EWn~LD^X&_ZU=X9)LY5~^fx$aU+yb#Z&({$3e#EftV zEM39#u7hNV!9$m3%wN8;s}j?)1xDPHb5kYXc!dH~{o`#@=g*F1Y2*#WX8O%*7I5MA z2~8A{W!UGYgs+(rSmRAyMdLSfYDGWygYlo|rm)5RNeH)D6zn4n>ayc*VI>Mm^3x1W zoh41e^OJ#Kz4Sf*(dAP zO`0mj+3feL4cej(^*l%ij~T>a7I~Dv5)DvYh=Ww{Di?m80^e02Ve{v-5n_KUvgSay zfV>sX7ciKc$2wu=WH8-ACpSWfJ!0-P`2Loti%)PUeNHHSpVxZqZq4D|73Jy^15UOS zt2pV_5-9hvuX{)-|0P{og>S&y*1Pqo)8W^~dk|v4S9$R3;9|c?fqP(XYN|hQ00Js7 zn+EE06ua`J8&CiQ3^lY25+5isA01*AGa%HVHOBPeg-=`w>v&=ozQkppAefuJ!9njd zt2B~!ffs(7Mr50`9lLQCA)-bg*?)L$>MQ%H9Ma+rQG!+)kgH_+6vtAq12Eh$#}=Vn zk;JGKQEWmwKl6L0)Z8!|X)v;OfdN%EYDe;3dgAGw`kC;`XxAc98GZ1$IOx9=#F||@1;>FI? zv$%+6pXmKsu6RQCBYvqvi)R8d1W2a-1$PaS@o0XE)q%=)geS?eO@k*v;VOVwFpY?< zTDeV-M;Ohs(lN#$95^K)!9o53|6DIw)8pTe&s`)AzOeRqq*q+w?@(V*n{0cOf$zsr z<3cIB+dQn#Kc|j}4m~deCckGrx+kwNjKHu$+Y*Ji_9DJ2tdd{XClRzug>*n4r~x_x zXCPVu$LcNU>o-j3DdKr14p&-L53_(~Ji}*LDdAirXV@oBNk60BHmA64h<0uP=)W2! zm&=5XY5rWjyEHi=POF6kQ^oaP7@LGcIC{LpJUeOn_UAzZ1~{QZtoDdnx=D#+aEO7r z0q%#fsuQ|_xUUeB$$WZ@9C{ut00&}ha4J}s9hgTL9O`hV$5M#p6NHNZK!DyC(wGea zb*M9}z3c+n(N%>T=`A|U!}_b^=7JDS5Y5ZL>gUYZ{{9A!MFXWDn3M6o{Acf)kzFns zo31~XA=ImV_@Z0d?i&Aixje7BSlZ5nPsGroBz$U1sBP+tRqBHw1T$ zr-K-J52FE(QLp*mricd30Fh7R``>*CE0A=(~lJ-k{YZ zj*t(3MS!@xee#fIYjFlbx-Sa3u=XF;Is4QsKMi+le36^4L2N&XYQ522yoPVn1mvmi zf6E^U1}gxKP&A=hX48rR&7HvqQ8}IL{N`V?m|6hg7rBIHo7cs#nIGF@Vobq8IKu_1 ziaF2Wdd74(13bC*E(Nsha?39mu$$iq;6RpZ6WM&(RpR#{*zXOluR0 zJSVnc7!S3?;MDJtlL2``2ho7LV1sO=+%!ct>$(A^9+r85G4G=i@n23^f#es@i%oe+ zxef{E6Zgi9?tHsG8}b~MTvo>^)@mnlgA3h69kR0*u1!#U(9WXXc|KEq z_e-F|pwwb~s0Hkb^`D$JABHCQ1~2|ITOsXGs$ijnp> zHEUqB47Te;AcfKWoA(%oJ67nESZe5Aos&A`en1obS+iX_#;82v;H{oGXFmT_yRBeh`+iFh z@P!o|wrUX@+3^LpX$`&4;tpbC45~H&ckTb<^f1oP9vkbJO|$!u3C26~DtFKZkI5td ze<*v$=t$IU3pAaM&5mt59ox2(j&0kvZQHhO+a25JBrkg(+<_vaz(Jnf~Up^P@R?Pguu&imoGn%_)#n+1S3Y;G?ZN`J{qqwVmnf>-nH@&;T z(|OG*4##rhXHfn&Td^DJyeqqm6@KK&ZT5ji52=DE77gP9T@udNJ8Z07F(P)3@FUpi zuMR{h0zr$>x~S;3i0HPA=vP$pdra^ALtKsX=XN5_Wxd^cP#Ss(S6E_yQL6$5zf37& zvW$6gJY|dp5;NE8A)YhSycc~*l8j$b;^BAMaTmFyRdqLb{_4+u=h(jI2SK-@oy9Az zLOcXT%qzFqKj&00*1DJPKj&nl@~x+rujK8G3|PpLqMQ@uh3KQ`V_`1?=to7kIG~y+ zw_xK+gbUz!I89xi@t%fnRI{ignmFQ9T(ChGZh_)mGX2G-C!Kc2nFN8Y?~7*5GUX3*2ima&@?v zl<3SvJ~>f!RX1-{6C9Xi^+w`tuHe3YJkvuyQ>y?C91kO5i-&B}H2 zy~rX)nTB zZ-csIA|Ae8Vjc7T=zXx=UVM1g79Mx2DD}b_XY`4BpQX_eIT#KASmc6MBNhE|ACr>O z)`P05(l(s;w+_%NycDsGcNVpfxglpre1q|J)+*kaKwVVEu$fz7v5sbV^TVN zdMfw_gD=Oz{<}V*@vMaVrfXDu?;=iwI;AD}&t+R?V^4hb{F4f4Y})18ESGiqn;ND5 z)k{$JQ z79mi0k|z#1YHh62_kRig+_wuGQ`uVmf@RaoVcBvjf~-^XVCZtJ@wms6Nv_Q89;>OY zB!q@+W>}$GZ5UGh+R2VL&J}ePKY$MLtM!+hN??%917bS{Ke&t5dJ;oi`txMwGRn!< zX&jOiU3Fbp^J;sl_jjbe5Ipc%&C3tW|P8G zDn`TCfbFh&M&9eRGLJ`S0g)bbtn-~OY-&)w~nQ;EG zl4mef%T@Y0dm#27v{k?R0>}TSAN?%7!oxXwTg8{OK)iB7*8EDM^2;7%Ql+c_O?%I2PmB}wMILo}S zs}OTxM|%QWFeFoF&Po4TiT!vtUynr=|AS$msd^>7gK`nStbeNFj`wLjyKkY}{IycS zZ(6gI#+^DteaFQeE>%rTk9O5{cXd|{1O{@fq3jC@_}5q7Vfys9B~Jc(>3Cp1o0`1I z>4m8tocu!TU?z0(ZW%r(n^nY~=4z?1)EsOS>WHT zDDZc!C}E|iV=n(m`uWKXC*)vm{+mq;qPwK}XyFFC%x;DK;}ZcP5urr7r@@qD0_Nqw zk!p}?*-L)AO@^TT_z`} z#tP(LN~kdtS)0qc1g5xxW36Mpxn_=sYwf$HAjw%9NF#PqKJ~WZ#a^Ej;7L?4pJhsu zlhJfR8~GcTQpjJ06xV=uF+pLkAcoZh2Gjo9+Vbzo0^o*T79OL*#69cvyS&KOBH~Mu z<%|nEl@d)wzl!?7GZjJPNN3#7X|EBk3}T+W2H+N9cKfH?PskB;I_#$b*8b};`YUF8 zgMZy?H2(~4GCH<)|0l93sDAQYe^Rd|rO->Pkcnto)0|K12xsG`5hwc!A@%J|Z|)}3 z&y7n!|H9Y0FF+M_-|z9-!;zWl$jb-k=R3=HVn6(RZfSb{dU?R=CS+DXMMoW!|D1Z8 zpN;^hOP!zgBZHnxmZdAxmGTR;q02(aBgsussL9ri$r(D#v{-OzIb5r}wY2l|>ChLc zYKz2Ck*YRZNaF~(8bXbaJzwsj=Vw-aH}hBaJBBKoj|9@&FWb<$d8ui-0!r)k}LuAU?isZNH@3paB@jx&`425u%IADL2KPX@VW7%35fe^RWBOG!6$5-Nyo zj4&>uhZbsVeNFlU6H%m&GeEeRVba>?2!Wkj|9vl*>x{4m_k=DgPx>Gllq|ah1v_Ju zY}Q1U&v^#^B8nBB>{BSA0~KkJOqa+uv?`ipc{~((CEl6d^j!E_MAaQ;T5OWC)9TnOjtjS1NtO8C_dw#KsUL|HP!N{e=&5p#_p{*kEOCaiWiX@ zVS&L8m7rog!Y_TKQhM}IJJbyVHBcF<+eff>ZB0zC(uuV5MnbR~b0F(ZQvXda@GK=f zpVg=u-LFu%vTV>dha*0wIaSg1r`>mD?$3aR^&hv&@5rC$ z@7hYx|HGc=b-@>7;0q zGi52c2Boe{W7}rT%`FR#SMACzN+z^W^_*#mr3McPt=1H!ikda4#74=N4F{El=d7`|h=u8M*@!U4U+oKrB)M909G>m3MmYqss=qMH#27>Gg5{m8YVuvBQ z_xLABy4J;Xf!4|anqg_72FbYr5KTx4_?n9`VmupI`!|)9b_`Wy5g;TEmR08S^vH9? zN#S!6s`4$C6Z%gkDN9rf(+p`A;xTC?0-FJBh9r69lc{n=amGb_lCPn6zE3J$0JTV6 z@M*quUNgq22Avh59DPfVjAXh7>pi96>R@9keQf+!w$Nz2Q1o~A_4s>a%!C|qF++v^ zRA_6?)Ow(83hLz(>~1ys{#5wWP@kjazeBrY7D34#3%dymtGj012% zyCKx3w}FK*Uy%v3t{hxJs#aH!QkA8xmp}q4P0{iR3S_s7&J(w0ryX8D$1~S<)+LR5 z`Cr6gr%`&qi30@@5c}7@OD0aP5wgSKh0JsZiA2WQBwE6%a*=fT5Xm1}=krZ|(||dX z{^k1$^)?ccWu4V`3+ys0Vl*7XN1m^KMPI+2*VCF?`Rx~!5h}8rx57p78cb50tP{!m zR+fTDqddxNBUQA-T486EDjaWBx{ts68?O6S5_1nY=aS6?HFiqd3nir@}K8_C`QU|SC6pFfna)dVIn{ezoU-qa9 z_SqMg{BR+jR-%o^#CSp~B5*=Uag@~PZ);yxDK(8-3)Yez?)cL(-~Fj^T&1M5*a^k~ zV0OG=A3LW!E z=QRlSJ|J528jqTJy{k&+r3p3Vat*z+^j+N=ed}g>4clFqPj8)3ybws0 z4r(I&+k%*2naI`tcPFRAxks^RByh-FqCDM_K&ISpWon#x9-6%t>$ObWNF)34BKSCx zMYh)pQb(K7+hbP8o9Q?butmBWF|CA@yJFH@36nqLj+5z&`z-{U`~#k`)zE|cZ&IE- z`mW2fqa#DVa&DyE^py--TPm~Vo!P)}kmn?XQteMdk=Cei5Gh5mmce|aFANb<{xr4X zLL(6zR}w-9xhv+sZ}uNhuyR<;n|YF_<@gsg;20v4u9_zv@1oNIg17Db(pykO}ze(kz$=^U@OE->erg?ZlL_kyn zW|tcwQQixs!Y~LFG@+Pp)SWqLQowN)<6V3=)bPaAMu36Bbp%yOxBQVa!unkl0ew(x z4_5R@8c9rk$EHpJn*s|QCA8I0C9Q8Y##gD)nHtlMQFVeNKjnIC?DTALbrO3n9ovka zsX>mO@Cgxgp5L^&7#(q^+~8yo$cahuY!9J*K#ms~sN7VQiDK1Rs4RZPC)J<%P=8@I zY$spspyr^QOQ%?AA;0m_)Z*jbP=n&Q=BrxIYA1j4#S-+!DxQu7t}H!C@8?35gz1jx z76H_)tc6U|RkE!IA%c7$IYL=;r z73DP*ZNpp(i9@#np0?Oq|t;zC22NlUS^?t-nX(MG*Uj!Y@~ zx+>1mdLKY}Y@A!8bGBV)FU=x_yYk(&>_)1DV%Wf!w!_Uvr2R^xqUjo6&FBO0iPeIV zz1#rZ?>IUW5iXo&wDV;2-?0&91_iPFzpbpxug^9FDU`g8fTjaLT{* zP)Rpo+ChFu19W+;9T4*IbRbvviXIu}K%$|0m%5|0$S%(CxVri2%t!J22~T3=x$94* z8^^e#z$V85b+Zlg$x{KZ=eCW(h48ln7|GPq>JwOvTklmJO?8FMRlbpGg$?acWe|-o zLL`a|Wt=Jt;l6gjY4f(K41+}GQ0wCbr43;s(mX9Ot9clEt1)+;;Nk}ahSn1aCn^O8 z7qQR7!?V~j2g>y-1p>#k+|Fm^_4Lwyt*R+*+;AYRPDEm<- zw(k}KD1`nYC)1McBLUwLt!#F%cePM9#oUu1wt;1O^dj0y@HJwpvc6%S;woZG&ck>~Og6F6?1l+SAjj91v_YbaUiMWJ!?F2Z2 zAI1--GanZZJQ`A}aE3t7?8s9|Z)5gZCKL3EgPvHrQqws7jd{_z}u|4)?>{h=oh~0;L+t$cDs=ukr~l`4&&+mRAHstP$3LL*-Uy zc(5Cbajsc}%@v}I?3pGZNiq^mau!>D?;Ycz&a*Q0>|au2X_ht|(2y<_l>f_iQy_1I9Q zcu}Hjgptu&$9U&QfS>9ROP{N0W91U~!P(ic#tXoHJgnsJOSSRZXK*Ivgcyg^R54yx7q)!>=PLOHiYuK5&Qed|qUwrfU)Mt1G(UGX4)VrE19m7bda|3*1?S;-N=nmX zk}|+hajHljLV(3rb`VGK0iGAJ=C8+~qjPVk)IOGA&yhubGDp_9>nY>7Xad7pq!qo) zc#7=kaI;uegy6vHCNAu0Pz7Ejfz--kjfd6c+BTb?l+agN!2Wh?*Tjp%kA?hJmaLVr zY#cTF>oIfDk}4bdb4!)8QMUHaE5`7nOs~8g;A6pq?d89xMm;cMfNy(4*QE5z_7*7dX@m*34!ae~`twimuZ2KY0=ZAyDg4uR|L=`0+`mX~O+Uqv4E`aG^j}(Af3@lUzd!wl z%o3l@zh&(dG^1u^;5bnr0xX@xZBU%v`lrsn>E+P~5pfvb^<;DLETU#nZ(uY6so9bl zzA2|RgTCB8!(e)>#*clyUvNEjS+%7fY0AOe9@C-qJC0eIMY%LhKz;c2@ zvQ{4IgbB()@~?@;!=YDL`}!W^#*h8b(bVB{wO0i7Q)(L4g(JZiZ|hu60OR(_xuz9y z4EIdFavAD#qK)p1WlSG5$o|>IUO+;L9c&=&xR^vg=`oORMvw~!+ZL_(mZNxJsK>v@ z;&o=2J$9xUCBylh_EYnI8bcyiCcQuQwdOJOih&EBFsD)E&ct2lpkiV+pY>B$EXZ4~ zqf0mS=e6R`%GO#oML0R3*qw$t{I0}C6fzj3n*o(CawSpy`n|7=Idf-Rs^3=C?(5Jq zjLAK&>1EPZI52*7mNM$-NT+;7G(aV0t{J#G;sz$iPs*=oa|;~ZvOV5mHT8*7ro70C zIomLCaD5?qA+@bukkDQhks{78;plYAIP*=*m5ch7A9IT>w-Q8e84D3$YOq7fkE7*;OGh|K4R zpPi{S2Bc#51)^lc_Ap;11<8ze^s}gJ6Hp#|6Zwv<(C~&8@OYtY3{C%x7MjICH;~`+ z&;q@j0)U}hV$u4Ap``B6!tT~_$(r-}e(R6&nXPTqJ^H7=mi`C7!te3suVlV{_qu5uJOhaQt|Ql1~TD>ML7 zd+NY(U%=e6b;Tx?72Qb>&AtfGVs&FA%UWv+;s+a!gT(Y}z~SuZv98O|R_WpeE4d?d z<6D+C7wC!(SOAal+V9CDQ`o*s3>?~a=J6@V#JYs+?jS5;vGQbRP{6iKur%d5{Ws@?ZT2&m80oEI`AalU)eSsm^?|P^t=vSv%T-iP&aD*{W8Q3(dSl%7chVWnq(PYh=Ne z^<6AZb)y#QqHL^zY|W6Fs|@88iz?M++|y^0v)5#e^w=>+AmzIv@wXk1nacQyv(g>o z{kz<9>kO-rCa4<^)wx>W)rVljeVI+osBWd2z+RO+#-Sge*Wj(3>Q-;7j#wX~*6uR4 zUvC3!$t*OO40Jm{ySebGfL&pVV*(L}!Fc-6C6wG4b9JzOn4iLy07sI~6%v>rj%T$->K-%ELwV>{>(9`op!8%u;I2G?;gGCs* z2=;lnOJ*2A!(Ks$Ab)Wn)>V}ocOuG!Xb|WVh z*(<;;r4|}=6(t%og)vjR3p+rm2gxxmPJ%@kASV@vOG^otJpSK1emOgT&+1OYd~I=KD&tL|l2jhu zE7nvay&M4kEhv{beqVbmM z1J_yaf!`GGXb#g`?zYhahIb$Odd2z4B)R=DY|BM}N_6_wb{p-*o8=zJ_O7+7o?6_kdcJFL>p)W+MEQV(JlCnAK$V`d^FL}E+DS_;c?;G7UU_1PWx zY+)ww0n5T6f2_CrgeXOXgusQT`Z?0?2fNLWRs;-N4B94Y z)cNLkn|7?v&9$}pC4DE`8>*Dq(c+A5KUGe2PIq|zL=)sx=@E#3BteWrLbx-S<05EZ zK?CcmdW-<=5~a`p#I|?4*$11oLnO+B)6Q20!eBCEM}UHk0UkEoPP&zIiOrN&A<1NF z&uUkYO=0d9ooaU_Og`{*wF_*Mr_?j=0_GXfiLdfyGLIX{2Tv)76S99Eg%)DVRM4%KcbadiPXNWtbkb2pyjP*@!G~3<(Ua zY(Su#zkK>MWC=oL9cBRY+>(@GbR|!@8U+Du8ObgrrH6cA_ZQ#|sf?DoZK(G^btH6e z;&9zje)vSbL_lZDYOiCgQ|F&xSV%2kR`wH6jsI6L{8x-rzgtYg#Lk}ZpTw#W;k*#N zv~YqS#tmu|4`9?9!I1o)OU0z2kkZkGIgR}Ssid4~kg(f1{lU#nT({gfhMTtzUH~HS zL16p>{zt}@4bi7^qP^B;5t|8%6BM3%{xf2b2IeJU9rh$~L8x$sz3Hl2Y2t?H#0q2$ z>eZv%qk{_?EDwGXa)4mhLT0Ko$W2OWd^fxd0}eefszd<<5+6jwdQ)aQ>=ran-?H}@ zc$VC@toE&r=3+PhWiG@-Md zqO|P_)vD9N`POasYT;C@-kAS0bn{+QI6VB$DPNjd0j<`pb}zZ78xcx<#BoWj!ZbsJ zl<9alds2psupi|SjUM{ZdpRu7zWgIil3>IVn%3k&-sjG=RD-eo z#8e>{Sbjwio-9-eH7gm(RZlikP~s8jtb;qU8C2B=iN6h%Rz_cl1sm2Ie;Y+PY1|G- zUy<7Bz{-GYFWU#hAg!3i6qa-1a)Qq3;ZTMq>;x;zA}ck18QCcEenG08& z&Rq^<`}5i5b0`qCn~@wt@`dt{4x))O^fK>&Q%&L|V&=uTyTyK9ig*;rqKDmS;es

hzCDqR{q+1x&Hrnud=O+1YqECS(Y(ue9#gPlCNBmg-9l zrA%bIy|{LM%X!E3dSemuMgt?v{6TxScD5WEMHLlo>Xy@N_Bl1fQGw1l3cp!T;Y~0J zuqm+gH!g3@jpam7wyxoNp8y`<<6NE&$68C-f)_}~R-{Ii0|^Eh+k(0}ygj2$A@!3@ z{w=evt6iRt3*fP1rRb~ss2UVOdM+M>>ZF9&Yq>RXgb~oDRL|zU#$DP~u(rxAn0zs# z^>adn+O)yUtX64fOAt{uPpDA4aIA`7^7b-sj$U@imBLe|mM$X@7;v0e8fb86c#8eD&DaIcL%mjjg&wGqa-kU*qmqvKw+ON+g1t=Tinm9Q5~)H5>xMtsE5 zR6Ex0^m;sW!Bp^@QJwX7x}zFTN?{@WlKZ;W>_4_TZyvs#9wD3FL>CCjT)7A76XNyi zQW-0S6ktQHUKV3X2)5u?Nkia~z3nb7nXhaI!nBKc(s{{cF+W3lJuif~b$W)3Wdn5Z zUS$bfI^;C+F+E}c!SW_gXx+*4J@rwo3pc;-)+2>*PhLKLRN%{|ZO0LV!~Rcr8_aWH z`CsTtWY=}HGPC73uWY#?6C5o+H-tHotl_`bD*&7ih3DUaycO3)#p<2)SQ9_WIHJ21 zx9hEUlho@KPq&ihecqbv6IG9_AiV)hV~W^Efi3EsVvKYjIM8H}C@ybh*LWdFWf?@OxqNKefX7 zl%C?X@1_&IoKC(_hbR49S|93lQ#o~!?o*hg9!>HJ=!lZHg6*lGG>Po~UI(bhDpKV= z5kt~KE!$BWjEt@n+trlkGpdjop?64ceb0mmU8> zruBQq_;>3Rf80d>>@X^;E6*z-y~9Ao=|K5<%XFKT7WVr9u5CR} zZWkzX=!@7Zxqh5V~-|Txm?qSvdQ~c(ZXn-$D&=!H9|}Zl)Yhy-vZ1 zaJ>wpb%Umwfte#uOAe7$U795DzIfVWds*q{WM1Cq)o*G-1n;)K=+7v{8P~3qzzClWgC_|P=p~FP=BavZkVNT0F0!i_u zGji||$PB}LJ&znZx$Osyh$>Uv|$IoOggJQ=? z{5Zb>SD;lOGleEGaqJCE1pKP<15TJ!A-RU2@c6_ZjrVTorjWDQd`?vT(LB%bhLC3= zGox~MI9ZN(xx%-iRC=d{yzqC_1M!Jda4k9$$-2k<{=$TPCYK!?i_HB+O2H+8Drr_l z;x$6uem;mDr?^8!gf4x6L%KvM-w?8gEx zkH)I{*`A|A6B8#2OlZ=UvKKqJhBvQmg!2z@n+rz5I`)D9b*(Z?TaA5UsaZ>>DZ?Dl zz`?d=b!Tr2?WQ2bxDwq_0!lvRrB=+%l$BAU&XAkc5cc7j%I*_mLn&t0Se;uX7BMPj z=opNM8uZw<_!Y&M*0DhnXQKM(*{-p!eOst!aqfe!Y$JgmYZV>!^^TY%qYLz zibzQpF^1`IAs<=aCJZ7cNDI_R8mM*Tla=N;)0GuB?rI=~{y`$mT?x+UKpMxIT8%s> zG8H4KWD}>Mqx)l+CFmB=f(R0K53Do(8utOxTsI&!PN8RipTc!jx0@ukICua(e3y8B^ zs~ggWjAcK1!lQGJ(PP-?-E%BR(l*HrTYJ{A(IeFeTGL@nnRSEZpw}-&OA(-8p>Fp4 zGoRw#NgXkknE9J{CrLR&Hp{219D-B?L3`(rq%;r8K@juo@967_z+O62TeV475HueC zJonz4E866 z!$(&gYz18A^d&MU=i2bZ(T)Q>3LK%0h|rFI80ZcI(%?Ps#!n^Ly){Hy5k zaH>({wr!9%Lhb(2zLa7mQ;)H?fOdZIwE5uWpi6YNa~mO-Yb9Z z{i!;v0l*Qn{bgXTPg(R#O8r@Sn4nXyJ&mhb((t16Xwt`I&IqG)B|(ga3C7MeYQpF& zmWK0uA%X@h<9C!lpdM%2v=dmQJ{w!z3ZO}L>GZ0A?2Sx z^X&8W*BJV*rhI-+hX42@{sE!&|5M;Weoh9Jvq^mw0k~|tlc1gqJ+zII8Y~n)n+M(l zVn@xFXe7Tx-pj{J*hoRcaNfu(e$OdRh76jaCusBa=UwJ)Mbq&m_m(FBX->Kzicl?! z_YBNFE%A#}H|L%1`4{Ml_aTOluKhcFDR^|26>>ls zbAcm9Cm0m#s?$oP8bId9Y7OPAfzB}9{%wZQpe`db=4n+R?^S{jKb|%w^CS>HdyjPa zR71t6g-QlTFwpTiMNFwp4@v?#DG_H%0I(^Vs)w!Y9744zE_u49mK%5lEx`t1q|~8l zrPhx%NAEfAc;z1^FP&#m-GXd2Nq8blsq=@=oV1SzM0K6_-P1`{(sk1?bp7al6}Owe z3LBulQ0gRpfeMoyV!o+QXeaJRC#r!G>@eht+fj5YmL0-#4Hm~NO$3io5_mkB7l_3jFhJaFjKfGzm-&I!b#qaBhh7gvRI>mTfKM^U zNv*t9`=p;2k$2NuLR*jY-~9O=eG1Q4u>8=lAI$6e12g-13Qq{fl%yljHkYKn2s{ry z`<{ifBdb-jjQ|ltD|mt|nObgQh;OlwODR+cbXB>@KeB8vxI=sGGf<<)x8;goM+<;T zjV=4)l88>OMnyK@BUufbV?V$>E5VzK^s7?5`M^O_Wy!{`f0wt*YB#Y7c8~OY2yAKx zJTkxkBikmOc%T0KNbKX!iP$hZ83c<@Ff9T8-wyTPZNL1_q5dr|E>JR&p4W!+-0WzL z->n>rK*5J-!-WjS4+66t!RphwQdcEMN@_fI1SfnaoWAfI<^ck`PL7B~kq0mHSN#o>WC*8jJ zX+PJ)suGoWoiqVB)VR_3#$BO>8peSqTigOu-?8N7z6Af8lR48~zLDr*d8kH+(}rOF z*Hff(3m2DPKQ@}dW*bx033CB^9`-TB=B%ww*5V5I5PvqzN{jg<$|ogQY@R$!FFHCi9iQ_oF>;1%Dyz6YjbfehO|On7Z&R+=Wz%*Lv@w< zB$paeBuHwaoO7(7APPIpO&i?z6sl9nSw>qhwoC1B(Y|y6amJngh$4~1)mq13`ix2zyYjZM#Sk2 z@1eVVh2`Axzjb|@Xh-=w;fftKNNFwV)2ADiZRm0Tp|tT!Kg+qz zFRg>A^QgK9j(>_obR-xH6%Rvy@Z%BB-4o^ zsMah&#Wg709~J!&2U*0GSDHL%>|?j=WXK2WaY*EQxGG)}IjI-i7kfcwHKvL|X#Z>x z4VJOit@izm0qFRq_H2N_>71Xlf(i*Q6nlMxM=UF7l4{z65*X%44{r#sy#_j1_9xqyq zybhfvIS<$0_AY;T0#65B`Wg?7@t*ZV!J_yz`zt#;Cw$l1+o6Z8dd&fX@1}$m#g^kJ z=4I5T=7BKbJ}`s#Rq_i!*Vu8g=l-Uuf7LmX%HXN5aw9}Vxy)PNty7kte7{$UWA#!) z_yu8Kwoj%)N3+Ia;b9M5lv+iMIImC$YAAQ;Wj&ASq&RUmIT2{f+t7G2+uzvSowucw zur{)ggg9Qp>q1sJ++KIIhLK=n%SFrAX<4EKh_MpwMBmXysi81IHG^=+hN0x>5LtZB zNcqU&fJvS2(0NuvBA=3h!Hk+HwzUv_a8Y9a%!L89mHHkdko!bYOZb&a8yVFuW#2KVOKPL#7sh0;+z z$#cys7+~A7SDJpGEz)edP@BBkU#LeLt8UhA>&MfqDBgkejVMLIf_-&qZ7h}x+)D|_ zMWbfHN3y_B_9bjvmi67L2U03Um7*kbzIorEDeI25GJFp;u?EBH_9_zRa3P%)m#ITRtDM4k*KLmZq zOzPkjJi4DH z@?tedxZbnHS$4_^o{_ByF)voxj4NWV=^4B_R$GH3{phV!wnrwC?2~2e$Ypv zbWDg#@+*^NU6yyJGp9NkAUvTVXUk#e*hx@W-=}!P40)L0ojKHE_pp#(k06m5N-`myN-n6lCk zCp}K)O^lvKhEBB{pmbA;_SJYy*cioQ51W^}V}XfI*b17=sk(s4{!RF)!)fOp3H8a}Q9xz%d5fBo?nDOLp<58TDbN*ob|)e_ z*DSi%g|O97gK#WDyWA}I6wlN$@0<>hfdVX$Em3x@0ZNrJvBm&@^9|17@%Bl_`I*yZ z^GmG#G}oC6Q`Q!k~YZH z+)S_wK2U4M1P?>UsAYRA)mlFYkzf!4`0;-MLxgYy_>1%ILQX)Bk{JXHJRnSlJp*RuwD`g7nC!yTA{IQWl6QVfZ2==84UOyU?)u|mIYU?6 zdH-DBScCcBIPmus4&J|cu_zduSQ-&Z|4Eae^SNwmZ>yvC?;c5k!k>LU&eLR6j5!QA z(noQ~7BDDe1O#wid~yUu0c_KIkMqje2u$``ETne`LTUt9cK}%L{tw*2B(;begt?&m z@r%h!JI6tG?sv~um~C)1kjd>v7-T1?^#M+3b@WEGMSqgP-Y6#{o8b)>FtqYcjPQy+ z+GLiVaa&H&HTFeP2=^FZRkwW<&{e3HPRtjM%s}5Ala@KGHA^S(+|`)Q@HQy+``EjP zuOJO5m!Pa$(td?E(M5 zfi39Er$t#Xz!m#$ZT2O?QZcQ_i<>p^>V&a-h}BJrUU8*`@P}IG)Rir3xPoZg49>OF z`b{%;J;SJ!D`<C;_saXjhDZkk$JAFwtn_+VOhy&$n!&8R%D8{mF4iDvFKyL73 zl#EwNyX-_kJ!A}?6N4j^g9qwwZmvD_yd}Hkx%_*zu@u31p4Fo4cX3M|+6mcMMQ4)vv?97$@ z*WIDNTVDCo@&18n3Y0;ek(S`!mCqlPC^GC3CTf4y;cqMO+!3Q;0HMO;A;^%1X6QSp z_3zGI{Dgq7(JNXG!HPTS2S+85Vxa5cjTh;+g_5cc$=E!<+jOJZN}^$CyL?b8LdKjd zl5V@*?0lT!zBN3U;Jn=u#sRH{`;e_h$BDh(!ByHNfLOhj0T6b+ngPI8g6p0E;3D2j z4i^Ue)I8Yx5+Z1*xXIQU6u_meLK$Z#a)UQDN7lyA4T6ihNKIrJIUo2GPZj{ zLDk3;8*FC|&%k#Bck#hG4o|6`rfV$bD|dh`gSRcn?N{?XS z4NosS_Htnb75P97V~qFuMjGM;ck%w(m+$_YdC)Z)a~;ZSMGXeCLhTlLiK}(0;`MW( z7K7O(1q`B^y`du%Z0RMxZ`E4$7G>6WX2tH*`z&gjbJC6lE!^Z2OV}?=)&y)Xv6b+7naArh3AgBu2-Sd6 zr)S-WJrRM3ByQ>aO_U1)>b|Q?f{P?$W$bqmbBmA(4Y8V#&Cr5N_1=Xz#-Z!DS-fXP z8gfM(5jJpKmbI+%uht0mVsd}=Fi}ScU4Cxha(uX+fot|hd$(s{x!dutxIu`tohqO# z8LCIJAiX%ZFdEwbI>+e7qsomrcYcTK2+8iMED55{nUc`aG9sjeX~>zv5+Gs|Kh-oY z(!#%sZLjqIQ1*`Dm2KPFXjLksBEzHoDE2vdw zwM934GkH0x#Y8D~K>c*yyMPS?w!Yx(yijIVri-(Xre$Lizt{!!dW9@=kuBp>OsUi5 zk z15sxi06jy4q_28anj-6SCRXi0v^rOzH)cPB z(kHeHrE44?s{vaztKLY}H~4N>84jvky-qhMChO?)Cg!6r(Y6C})bRUX>nNHhxI!^0 z-H*}Tz)Ibin(BTDl(=!}3%v{HVSw7c6hsK@vO{ScamKN<{=i;H#T?~*C>iiX+G98mlP7_)f?xx^I76LPQ--t9gXF|%fc zkx46C%0!FVjV0NZ^*TCBO52Dkg|#`O$6ANAu`Rp#w-Uv~pI3UB(v~K&Kl0~`mdcqj zmRX*SCS#6V8UCCF*pK6GR1LDU-S!KH9ez^}X|rNd7Ry8GcTaVOi9@+NPj=G-aD?5; z3_kJ}Bb-o?lp?g;JLzQj^u`xQqNKm&7~UXMmXZYfXjB&(WD6oy?To=got@9Vl%?xV zNL3Ycm3`c8h!)VJ&J!S-*_h)6I`!$l342iAfmhC5si*%-0qz z$8yQ^>x@yy;HpVLIF}8`2KLLlrpN`TwK&ajfa4T#RAAvP~ zgAdwv+HK}0U|{?4DgCeFJ>nkcN&_Cm9O6?fwnC^tL~k5ABTwJ8eqB=da0*7kF6Srd zD>JoNgvhIDXmu{+I*TeF0i!cjRH(jMJjZo-w4f?H0_IH5a(4LZG^(J&X{cMFAh zuwC$@dt)0rrHBQAc4SA(CRjJsnxmMF)@DGHCEFKfzI?Bvb-N!1#G=CZ8P| zh1o7?jgP!&m%! zf|TM(LU`T##90*o9C%X4Dlc zJtBJa>Yc9f%((28-i_T1c_cIV$6<}2Ass^EhR_K?v{eChW0+Krt!IdK(u$ku;wURllAamls5%nOQ!yk{M%)FQ0)Q)hVgm8epM|D4C8~3vVGbC z#K;N+4Eux4cA}osY@&A^E%AKh# zOIi0qe@&wJt$C({-(C|4OVh^{T(GY}f`g37=ONzL&{K;tlS3B@OdZCi8o3 z9gR!e?>bI}#zr;o<9+{dv9GvaSWRk*3JbG1`V@g}PssBgzMk{u37k?5-lOj7eAQ`N zo`Qk8%r|p&vMS_EvBF#R)BA-|^IZJi5bEA}Hu`#nKWlT2JRu_LvMR*CkDicnyp26Q zcg=sChwZ=`;@bn`s17vR10}rwTZv> z`9*`9_047d%Xvlbm{J8dDYl;qC5{A7Yw12}MCtFJoG_`eduw=2xUe);6(Kabt<1O% zhh=tb;}lk*O!eS%;}d12zU2j5=JZ@nOjSkr)WX}{87^*g3IB;1iIM+YB4zl5ihuTyRbl0li$>4p{5P_inHc2z@2uyg4J4jSz<{QU z@fMo-uuJzjwooN{Q4IKOzryx8?l)BY90xu13<%JElt0gMAH+vzZ$fT7Y*9-M%o{2u-7#e|Lyr zJ9;FbGbQCqc1*j|G{|#+3}MR`p3hS-6*6t=&b@7va0RZ zIp_*pK2lviDQ%s7BB7KR6}^+oTzFtT%eX9q074IpqV6p;sv41^{?ix!q{HQX8|v>B z(qgt#r~I3r=1W}OZLg04KJRcnv|Ttu>m^#4y%qR+GkYp@^xA0yrs({`Svfv{U1WNl zGzmQhuTqREv*v19FYCQBKRl083$W6J_zhG<84z_us`QP=zC+cWH0ch?%>=3Z)X;@# zA?>PkO+?K0^nvwo*?AmkXPkKG1(H6t0!i{nP&u+rhQ_xRl}*__8y+9c`+h<3U&78i zD+rlMAK|Rin)igz3uyj2Q}IgLuAQ&?Y+>c)e2c$J*^(uzSqxSY8PWIUs2Jy`}qC^zu)aZXe16b_#tCUkN0zsDe))tbFT=Y zP_@#hvV%=jOi9*2T6tjB94#Z~$tCilC<~sxDl}Zrr0Ss!C|P`uKjlnMZA5=WHqb|K zib%A*;j1oKPwQ!Cm*30ySh z$nkwfCn!5m)77v1eA(*W{9tLXAUty@|a`V@g=86H}0N(Iy*f$;VxmnQ+VN#+a7RJGja> zb-O^&%ECajQC}VB7-~RV9h@iDo9!N*rJQQt8mt4`DgNXP^5Ms9 zW0X-Yc0tDYnBr$O;8QGj;#0h|`vV0K*0y`GQ<*+L-;U{Gdzs7lzG8H;Tyqqa-`m(x z$e6?5kJW5u=D~wlD5myg>1KuTka_1r+W6zi&vT+F8rn;>Hr#S$>_pGl41B9#nXorj zN^wmPv>M1J46BK_!rX>!*qL~oF1!3bCGMuJB8 z!#U9np;h4Pzq)9eHG0f?p9`D#AE}A|X`1@)wfujMiGRQNzZds^wKmkO6;Ol_eIB%1 zl&b>hRE6T2p??x;T!A5>)_(mAl@Bs}a!Zo)Jo3<}_KXl16Ged%LVh>f`&3loTN6R9 zEU>0;W@o$Sd`3~8Rc~*1eM=KBg2N^+OoJr}Xs0d`p6Q1q-jrWvxjD*-cm*`<`Y-UR zUP}(*irgiiq3Y_FRzNH1Hw9DiGn;9xAK45sQ={nvPR2O#H&=q;6q5LAsdR0UFojdJ zkg{O0#2wv>3ol#c-IrIFZ&OCCnF^M39o5?1L)0VJ!IX>*EuAzOtyOq|n({}u&AB*0 z5`zPec;Z=w{&ZVdPp?d(H2Vim5s9gW=QfSC!;6$!%Xsn($D5Ew>y{#3jbtGuR;u>a zkSi45P_axtv z@>I631^Zx8c}Wj0Kk8o$&uHxs@2{Y?jHnHB#wAT-mc|H8UOC_D*+1KnV*3vudY=;C z$*CeH^NF;VSP^Om<~ATvxChE#BIXh>CS-7m8s1P44?|vv>cG#wkg&ObA!D-#P2T-- z9*N+ZXpBoosv+4$IHNWPWQtkz}r{L5rK*rfnegiuI zJYPv3lesIa2G*lhKbF>UlSwTx0>XP7XG*#F7f&|^=bN&q`e3(1a?@fn>_m?trQE)P zyi(+;RvmC_#rlFWq|=;RMxfe*Rqg#FbcsC=&``^%$;vjU#f^u|EbRRVcAlPqc|>Uf z=}%{YO(>JjL@f+|>nDEJBi!JLs)!4tRzgxX3mwMieMTCxam@f{T`2Sz+20a`3dpGg z-JIR*M7GSJ=`=;$N|bTYI3 zcd4ubu$}wlk?3nvCe<;eIZm8r<@X((gxo;Y)gZF6P@3S8M*fg4)k&SRpo;uMGmLD? zn&JH*fptkYAgIgQA$Q@>>3QK^)%kc_T`lnCJQp=EER-3ah=Pa?AQBQFXM-;hA4kOpts1;D<`nN2Ugnmh(E5>1h<25I*^kq*N}l1eBhM5^-KlBWB#V|1n`YoYzRdqcY8y!%Jq`Pm6>fwkT@?wPqJ-CU`t;0#_x8ar@zB!Kl$ao+vAAEGKFv zs9iGB#*=t%AN*tfQhv zmLRxwXUT!@^a4y8^^O+U{7`zY2uvd8H#*>vI$amX^0z7FJWfccZG6IP{fA!RS2Z3$Cr`c8VUn5!gXl>hfHGvz>({Y~9x;V6Z|71luCU zDks>5pMZTAB8(J5MDQ(^#GKp03l|w^gsHg|m>*q0GDFdcJcz=)Ai;TpNJF4DbBrI> zWxM@L#%9fl1I71=%%p#mo0I*Az2(25^Y3kCQrp~3WjWnPKx;1f5T^G#+KQ+j)KKP1 z;)r11caQ~k_#wqa*614gCc%^}no)mNPpP(_=JO45P-Jne(V2L4h9#Mtr^0i_MKWtx zZIe#v=~E5a^z+`_T1R}3V+mH{hCUOwQSM%st;b%+>&=c6mbSjvVqYQ;of&L~Y&%<^ zx@p9*{>Vi87)0q@L9o3Pgb29j?M`F=*%Pbv_*e}5c*qxp`#2gDeN*rMaASh9P1&LA zsNBVi?TH*E4#Eii4DI3UOe3m7wvQAq+?yRZ6H8A@3ZqA1P1hvG7$Ie#Pg0ii(w|5k z{lz4fSgJpvF)^8HZeh|!&cb@_sYJ%YmVPLfon)?DwN=m7Iuj{|JYyUq%+oA-Bo$14 z+o@T_xG*Y)uO$e1Lzk={RJcF_v)C@3Xu+UPlN+~CB2g*vs{=Xd^9Q=bGRCFfJ<>gB zHJB?X<0B7|t97Y~*fb1?X@JS(<%`2W{MM{4kt+PROt>V!aWUE9d=`rwFE5(xP z8RG(s-w|f*R?4xHzpm-4S)~&tGSDW_V;d;5G(3#UCA9hKCP}RES1;o62D5ycHP(Q| zS zy9ZcLmq@Fmgc$+l_IhiQMHx}58pOmi9E1BIt@P;fiW z5Gq4ms&?KkUHUuvSkV$H%#^I6unK7}9T^2H%>Bj83v(1JLyF8CZ5(Up zV$^pI8{*lArzc)Rll%+H=D>(%8Tqz(JD4jXl?s18T=b5>H?RsPe zy?6XGoKFMNqVv782&gh>hD6yY`YfYGUso!Q(%a<5yg8r9s3KlSv=tu~=U-ux#J%6i zr#eH5!!O4b7(Ht|R#yW29bABFeT&@iPHBGHNd~Z{`c6nWj6EE~&XR#7_-ssV<$|qF zi4ZyP&L=Y4;s)wVBQa|R?~1eDU)wN?9FuWh9^M#KmCCwA%F%3Nj!s+3+dhm6i!PCr z!$ng*E_a>dRK~V1y&DEtT8GbJmF?w)`N$!)PK$DR9Ei&8L{`1ismN1CLL;K28Icj; z1yUrHaz*IeL^m4JBBQ@}jnsLW&y~`(XGUEFwRZQiqC~*Nrr&#Tgr2U1)l5<6nx)S5 zM9~UZ&bPbb6d{d9T*?*ol{(GIS9V1WRm*;|{?=Dd;rCTKfNMo|2=?g1p;lCONWcjA zU+lDpB~i0T>WzL_WVS}-d|K6WuaZvVq0<$(3M}yjBVfOPgQQqPb z++xtBeXFL%+MLrX*m#{JbH*bRB*|d82*VNOK{58 zJ)#w$(FcF2a$-d{Utgm%tDsfP7FR$k(SU(byU2Hf0HbLl)_2wmhyVe-*%ubF-=FAk zu~yx35T{lBd5X^#cHl&}!ppCKSFaCOuM^_;zWJT}fvLX3vLRmF7LNd7U2U(fc8b<4 zFWRM-w#kou(3OG}prW$De8;8k$sV9A<`O8J^4a&GzE<4{7`tApb#q;i)s7dm)so_N z89%p{E1ZNk5>aivEbPE9k>8!M|KfV`$v)!F85Y8e-L==N>fhw<3caj<$CPMm>61i? zW{hXRGz}$6%S16$p*3*|F|wSPa^mo>mmff^QxVVQ$(99c>+2LJ#6`gD6z4^3{?yui zckKzove2lDLCU)7S_#%GsW{G_O|xx-jsS%g2P0m+|9p~0C1Pe6 zOlG*z6;#WnGZYJWz9gTjFw&XfrJSlTS`0=rBvwc_mAfr-IacgQa9RN;0U{Fp-LN_R z1m4(%(L!3{UcbT@XBdaZ-C(tEUN;u~u}GIHCF{{!%&P zQ=2L%+voMEY(nE{blaE^nT}Z?QuXInhzn|_@*4FtFa(Kpk6&1Z^?{+{vS-K>>SbIx z`mHrHbYkA}n9=p>XE_Z#Ru_lm4vCw?Wnoj!k6b$e9OU%Lc~QH@w-=14 z;`s3^JYpm~`K9#9KbFafQB9{>yLmw zw>z$!zsBZ|1v{1fJl?4jtchpgn{-SX9Nkt6(&NPgdC|j@HeR2e1N!fSRucO+}R?0W+pMVEZ{in2tD}H43A@lD%IQ zs9nKVP3OW1uO~9WumclJPh2()GT;}bLfZC%sGgnQNM5H*he@|+hONFc$#o1+tvT#) zcB=ABhoPBvas19z*0wvMXI%m#$datu%PSt9uh7=d$0x3<)>XUd;k2HA!Jr&Y#6f4o z&ka-P4X>!%Y;E13pjqT>ZAK8rfMpO*`@{h~e-a+NXg&PmMS9lOXHu?g* zW+$E3t+BdFy4@1|Ry(5?Qsu?DOiNou`&JxSuZPz%YRj3@K>sf1j9_q5Rg$X`MQ@|(n0bQ;g2>rKZMD+Pm4m4qrq{Zh4A5vX|+(qF4XyeU-J)*p^{Ve5d3C`|*tj z-VM+D(rf$@tLMPQx7Jo#peU!Ofj|ES-cY=KdmZ5;_lMQ9p3fuIgp(kg{CD**ow2od zo9<$Q!(qy+;%i9!K__ZSsweCiKaw|Y>7TqoP*1p~_(NX8i+KpC$W32k^PpmlAaVv8 z-LO6FVa;)i+kTKYp#<@YmG}r}4ctBxTFe*)Gy6?5B;Rbb>DTZV!egeYeRk35uBviczQo zJ+FeJMAlRZ$QHdY+@id+=yzKD93x_d?g_q@$pe~lTOU}}VR!l-)>I%N$+A%#;0@{N z)I7MlkJuKkyg|^ur74{0qdGk6u~F3I)*i8DaFv|*qfL5iF7x`8J*@etBCu;@i~bfm z`Bq|S`UHB45xHjhQtMWurB$zv#d2`uvbl8uZSM0(n65>=aKYUB>qfc50~C1p(_vaE z3D%Gcsv5K5O6_rfulJV`s?Rs}c{>=Y8Ex^x_bzC*C7x)qrC0O_4+xSw`YMC)^$J^_ zhYMrqFFqsHzQhNySQrAmU{6#g``b#-eQhE_`W}(l>Pzhe4;6Ri&otx-E5Y6ro(=--XMX;O(Eu`mFK0W=cU2ck3$|0 zw#hv;DF9KJ0n08d+oj_E5y`73YsxD>&!J=U1}mXsF7N5Y_J+$hu2ju73~SVyqOIm` ztf;r4ebXg)%M^|D_$B)Z)fC={zRRptyDJlRrZciawl>Pqrs}+2udwz74edB`%{%pO zUm2TtK|k9*#bbL6MRRc>6p9N1v&RDaocRzhm0-Z3Ybhwpr`Yy4RE5gLZT^`g_@+m2 z)zT%k_MR(OYL>7FlFMD^r;rNzu(YI*4BbT7ovt3o7@jpf6uGoVRVz%oRH#ukPrR&F z_g9THI-rww$V4kZT`M9xiG-LYE-7-BCe_5zN=`jAGyDTABmt!oaz`vAOGYYtHY?<; zWN`oBCo&!Eb82a;TEjF{h>sHc!FhT$?EIkyU8irfll*?NtXc_05VS*O*_u5vjsviV zn)*9NvN?Mg+HH+E^${>FU4DO2R``QSsm#nL2gy~;5zV@8*1t}K@-XZe_2*q(;)<>} z@}>4}Qe3$i7|RI_q`b2yeqW!qFdH|b!z$4Tm;xOVn}YKe0=nPcH=9$>V>mVeq4cHZ zp9FM)J{t6&kvqk0m6CL7m$tYco?XRibK3Sv`x_p~a5UJ8(Q|m@pS|Y%QR`$sk|)n8yjt;! zn)HOLtV6A7Q@B^Jp&E-jxC=+Scg(JE+u1_2g~8@)@YAD-3pI}1^rOO5TQySZGX0^Z zz%;#kk%E}6YA z_P?BZe0v0tKa5R84qwOcXhzPk%7>rvyKHX>4};W^@yf1$bNah($DV#OGhMh;{h`5h zP|fXMo_TX@lHKFUeA`7uVK1i=ec5TTyGD+l>)yz~@3)F&2X+W^tK^B?&YWi9h1Uh? z?;T>>yfzO(caUTx0?G}g{c2uM13=aO?gqfLdl>gfS~S|3zFKs z$Qz|m6`ihT_GS|6042TDh+3r_vTBM91Lu;!>|S8*m+zPiGYU&r$@PyLp8IWT--sW;tDL+V zY284dMeA2J$4SSqA46!r4rQ_gr{7DCpW3GTI6h;eu=Eqx+TF+X7%wu__l(-5<`EQshxKXUim=Wj-E1yemldHorT9};@Jq}bvp<9hz4#75&8Dc+3?tFiI4DZ)AW?MEF(m35RIv>ImBJxGh89)<aqJbCVpvRa?CA$>jBb^UH zP1^&69L~_U{W8S#s>^5Ni8g<@l125xY(ZMLyQ$(CXDly49%(%<)9&ohCrOHle_Zw1 z(Y}84=Hst6G}q%bQVPnKFC?`8ow4yh3GJl+q0y&eY^e@(aQyU<{JYQR{a+M~bx!*| zY~{J4U~<&k-%0G`Vp)Q?xqFJlg3J-B_YJigfXLs`xDdVFAn;Tm;RHRg!V}ynAgq0% z?mPyzTTyR+8JK!-))*G(4K8B4*i8l*_0Ifpj^?1P*emkctov-i%5JdjGOOZ`i<&54 zO52$B81ky*8J0W(iS_08^CY*g0HX2Y24K9{SE?4>kl3p_TmZWl|A-vreSrpH{pKovldFb`bKbYqJr)kH(zZClJ_?JXNI zociBwjh2=7K9)43bljDY{HmZ(=rE-b$sN=3A;x1Se<=Anbuo#gvjC=`so54KfPA;M1`SzpuY6+js8<6`J&&gMFQJL*F);a%6n`7rY z?SbNT-lGwHCDTT{PUcr%sT9n%ZGL0UAPJ0uq zFTFt4|3n4HG9B?|%SC+cA}MBxbqE2XLasX?mDj^6oWNrx5Wm`izmNzo7hhnpN~YF` z{{c-kdgHE|+3Zo%?U$xS_PT!kOI%%GsKeOt39Em(75!(&g#Rr#nE&3A8k7EQmp9iU zrH9S-Q&IYqDi}8-4fG;Hkc=)rj##uzTGu9vjLE@jd`tB(fg=D$6^az!FI0G9EgsrD z;0i2d@7`)#vT)1y2y~9+uV0gej5^Ze5GCwqVx=oyCIIf|98axD5^ch*d^6 zkB6zZeb0T-3Rp|AGwz2JMbxY^I(G#*byR60@r*?#(25}=VDX|I8nbHkncl(Ycq` z+0~q8rN!klR`ENRlk7SiZLuq@@%C>E%Cizf4GC~9JjW7d-tc-b2nC8H5`o_G9q@ht z@6*Cu#oJ-GMForK^*&n@cn+U5EBpWtf5T61+s&sB&BeHI#=@SzvevCFs)Y6U$=CKlpF@F5qGt5mX-$6JsbY`y~ryam}0iErUXo6kW?6^v#M z5z8cmNX(#{Ydp{x3%;D%_xu7CL~iacVcUSR|BO}^Q`RYD6IDp)04rJQj`3t&B7Xeq ztlSMgla%-ziqZVz!2N%VQeZbuZ1%GLLH!6Oi0b_-IrDl7br6z>J##a=)pIJ{b9(c2|G4?`i~6+} zB0fG^oCH%|m8rHLE4JvN_fT zrfrKNa-=!jhlfm2FQlP7_t6^V(?~78?<3Y{f=p5DeVU!zeCA~b(PrYPSe9l~`6Tf{ zF248^tEgB#JIni;Wb5&gQrZ5Gj&|nR2@l-iDGjD8m8?#4d-){BI@e81cwG{)%fH@B zr6-Sm#)`6P{~F0_a<)=kZqe>2lmMi)s>jFGNf>E93Al&!$!nCw1Vn9y0}JOFZGO|tFZn}U7=e}ZLu20T8bvee%t4eXq>mLHq_H9zCLNRb5<76$}`7&Ffs0^0|&T-=TA5LkjbFBeS0Ar7v-ATV9j<#XA4y@C9T zZm=RY@u2gG-O+y>=>Bi9%lco~Rnv1sQTuca&oI8NP4+=Ft7!m(Ip}wh(Sc_7`wmHl zshy{JIKOHYGs?Wa+0yP@w)_Xmw(~jz2AI#H>#+NjxnRn1ifW}TYr=k;^Vo6enDcm+ zCGhd*9nCNDi5m)SoC@~y4o}mPHH7AsG(;_Jt~=NWT2*|-#IIyW5==VgKPd->2G)#P z0X6WRaym&5Ik5<9s$F^oPJ z&f)5uS&GJbnW+U`b9@oEx%AX}(@d)J@YVV^`^SY$_3xD&TD+B?#g~{dXc@_P>#6NN zn6eXwj3GUDLV~3ng*vqd?BUmUB^Pb=AS|)l*5*=~Df!fhOjHB?ERsBc5p^>fMtex; zO%xjjSpU+3eq-q<8(NU#4}%F~k%Xd;&K_ffE9n-Qc2(eVob`{e`Cx zmEa)8it^RZi0Z32D62n)O=!Hz*O&^RV}Yz=*m}0o9u1pJSXnZ5(%#UH?>ab3mG!sb-7iK|Y`Bj5}Ez=$NHvX?mVn>dsB zZ_b~F!&{i9Ij2_ttr_=6wK#Xy-NDDVAfT^LDg z_#d$qj=001E5z$(msdu_dBW_`#)s7RSD(t!fM#UzQpQO?YLlW(kt54Tt?B|fVane^ z1{658-oA~7>b0awI>*KA48}rTj|=$zPRx|Z2(?rk0GZn(9vUPjA3&Z8111fSZ6MKP z&C<9HIg9AR1U`j`$~=8ZBbIEciq$ z{3UVDk%Fcg{j9`J{*jz1_Wx1j|IbogR9M8y9BAY8nH6Fq2eA3f7k2o2@A&zD>a+Ql zAXdI$6|ROE5WaA<4QzjDMX^G`^1@&5Lt4lZ58UTfNF8Xp{w+IS-H==SIRv9Pki?{d zuoqK0>d(?Ix6`#=*DpT{c;10`ViWt$uumDSRx@vfXUn9b8*bSQKfugt5oL2XpCO>? zK+p2EgP|b|&R6Imp5>h>l~5@HCu1mqV{;}hdq(qpYnvZ1qLJ8StXUE&-6g%BvM`*F zHaq6P2PNu6?36Yc8tJ|c2iHG#Yr068G^P&qN11XqJ|j<6Mf#ToX;l0{g8@Q9TC?+< zE!m~p&KrTf2e41{`W@X`2(*bS%~qc9CFzw=C?uMtQ2rvRI0f&MbT-ygQ+SxEicLZP zP39GF60Nb$9IZs* zD72+}bJ?7{6wHT0WvC{F!qBh-Y zhD&jeA)fooR6PwuN@HM-BWpPz#HMF`b@LVUVU|lb*EC+d=9038z&P;B6dZ<<3nl`L zCaI(e9bgquS}Srsi>R}uRWac$J~eB~A2s9KXVm>CFZE+?{L@)BMt=xRm+TU^s`W%| zVm|Hkur>s_&UXcyUGeQNL4a+xpA6~e0k-jv2bj$N9+sbg1R6PgUQCsN&W^xO9RR=y zXzKnqI4jkEt0bwReq?*^YNdeLqd9sDd5xkYY0R<;(TE}jjQEYDDifrPUySwNR!s9p zYMQ8PTL8O~N%qZDCQncaXiZry>TFfjg}`(-|xas$zi!BP|GEJOaGT-3+m|ByU($ zYs_YWm6pWJ42q4vA6ZXbYZp9#hZ3Vrjlv0J5z#6?lCj>Ve619mRSf|wp+ptSB-BF9 z1x!p8eE6C(KwI;BEfX7RUK4bp+IfX=8gE^|JoDON?-tSVbux)Z7>Bib5F^Q8i&Vyf zW`IA_#8=$~Qu+aoI8iCJ43s|;HnRkFbPE=$8d5q4 zN~k$)9K*5DR}*9txUTQfMd5K}$(ea>5CnD@Zs6^0rRLVXU!K75e#L-n)<7S_P(#@2;Rk!=VHR?b-JVjav+-m8xqwBzmk0rVKP;dCAGg09dW%H$ z55r(^joZ^|d`t0`IlVcTb;CJ{acIz@S*bcNc_iz%Lk8K= zgkJBXv!r;})`gm80GDK1_7Kn_|ER`XZ6Hc(G>ddX!8I?we6#S5M>k@{zP@Y_=wVN4 zZUMNk!-^beYAGAE5N-oRK&ufaqZ?`+toq*2PF3tVNf)4AUyCGU+>#|ha#FXBjw4MS z@F$>j726@DM18FwI^-jxD+_&A>$9lfSITTHxCK&x%JqVF7Rw=y%{xta#!5#6-HOxs z%RpR-v-{1YT^dSHIlWVD>9sc58P+Ba-8|N|SR~u99(T#QtA?o5(+R%;HF3{NrtEIGk3_Jw-&sNN^eGMFaN1dgaFF`x=F=mxzI+nO+JuqSbQ#qi7CnLOim zULn#Gw&T$J<`dh>(vRBrE}mY6Xr6W-wa1qCjGZ=Tpqjh_k|qgATqu(%a8Yqg2~w#Q zW;bJ?B)D{@NuG$i#B*HguR<+M-EuJ)Dw~IRml9|55eEBkWy(@IyL{Kggf{ zFy&17wA^paDXv+G=Va*LQhCEF((Adip^Ra%Tk*sUWxoLMFyWipqct<3Eni9OWe(Ki zIARs^+0E!5%<#LJ3lz-~J)JU2pFpO}Dyhygsm|N8&Olk^+gRl#niZ(LneMVS&A)CC z3G~Uo_+?IquE-JWfAJ15S_o8G2(7=P`?QngR7kx>^N!_z`6@6Q+aj)EmsqvO@q*QS z!tGORa7FPRvF`NE^@RLSzD_s?e;96>qGHf9@5Nq8WUZem94~lHoIy97%2T&56iWdD zKkX25iyi#BY}f5n?qc)_0_|o_hXnYc|r3q1(Jl7%l2~&~?niuPH#Qa#=P7Ki4ER#%A7_XK>M+ z*6f?qoxH^**sCB*T+pRsM|&QIETB5DJkT0iSNL=q|PG%g~VCYy{-F?Kst{O`!E! zlO4B}>{F*ER5AQ?@N`q#SCpwvz3=D9Yjmg1E5WJ>?7MHf01e^M0}mgiVLcGYR0oN+ zE-xiC6)V#mL;TtJINf{hF0xc>weRWPVUZDH-!Av~;4OUN>4w5WSY?Q7D*d6ZFUtIm z@}cLhfBIM3DOfj`?RWWC*P85n?V7!w>EXu5TInIdi-q%wq~PviAyixjV6A{ca6A(v z=kI&=MSo~L2G#yyay`?T+w;uY{=tnAY&!+ zQ(4!MlSGi*Q6BIXrSz~&4Vc3xjAR(m&9}ethVpCQKh1($ALtIenYaXLfSE>m4GzZK zI=0uOlG^!}5>5Ywf)VOIKo-z;CQCI$rbWSwN&OE0d)Lat4Z{O=I-b%@%Nm0usF;$5 zN{SNJbT#X{kVZhSFmdJ+ii#HB`&2cicSQK9)gD+3kkO=DuyKu0 z?2LN}=7vNCFGws87nK+-wI&?nBbbAWS`rNH?j~q$6&Fi^DjsfS81&H-$~mbFpK1?o z$`#COVh?|uSJ2ahD+86R$^amn+z}QHFg%dJ6~c{W8fJoJDrY;g!(YQpTa5Lr&_Co_ zGD-%o=bi;S$IG|p{2^-dL;PvlF5;L~25VzT>WFLm{poMvH0CiZVB_=BrTmYEg;M{^ z>Q=(T+)fl|WNU5rFIn}c*7a}c>wnd@iI%qWjHn?7rg|dvG0~0fjO^@&f((o>UGQ?) zz^J-Uq=xKdW@=R`9f^j+1bzg8A|wA_om~Y~l}pz~M7ldAr9nCbk(TZTB@fcwAtK$~ zozjgUAq|R@q_lKMOPBx4_4)~1?p6QSb(Y7qJkK+G&+I*W=AGFaoa{N+BUlcpmK<_# zPft=#&W>Wjle*vr*Kem7jR+P<_X?sdV6n(8P+~L+94SBV9EQ}rsa{QQm#NFDU`l|e zVSOa#q|r*UEI!3fzIc!`J}ewJg17h3o1bPZ244Pc|4!5ARGJ8ibUZoz_7HHC4L`wA z4rxpY%`Et@T;>Wck0C$uCB9=(tYIf(iX2z_kcr{X5=Az#FWPbtLAfF9!wnrZxJWL& zo+$FQ(98%GCANp*DVKW<-<|h~4ZBrN*mcP)g(7(21N6qW-@F{Cs{I|*J8lm!`k_OS z(bS6x;(u_>!qJ!Ra~St=4@6j}v6Z#|s1N|%Vn|e_ z*%8PgmNLUHFTfbor4y{psqUbq@GjTl?bo_913fsqc3Z43@P*$#6AP?YTMCFjK6Q?d z3ujOW#&>kk13wd2Wkav&7}utBCRxMQp7+&Zs@fX~51>fFXyIQEX&-khJ3_jn8&xC# z^E${~H757Id2Q{A06>_IJxf|26#Mc^~PMdRj>%jtc zJ)9!?^j+Biwk7T!--Q_mDH{u(FUl6=bIeS$u-P+b5Er|MPa8B;7=T3>!+$QqB>r%i zit3qwF7^e!FT(^(%&kFI3I@P^?7wd_UEIeWS3o}R*$&akVDVdT?>3i*{`^i-5|8qc zq`DkeS|NGDqRX*gMDgK*FtJp-%BuA~C(*8ape@p4^sz6;Zg$4e zXge`+ZJZUjO^8!XuC>PDUYV#;UrGNYGQ&ENjO>v8nCTFvN>1&J zR2Gg`p>Vaj<=znu#+Z?_wv4Jl#oRl~xu6ZFV?q*CqaNeq)uO75X2c|$mQ+!9FFJpLt|Sk6s#?D-ip zA~97F4rT{zsel4m=?JVJ_YrS%Jhs?rh3kv?yX&G7;rPO^$PFY^&jo}}gPCV>{AW3P z29k$@_*5Cd)e}AXFrN`u+PW7&=x-e}Iz{M^i-c^D?%noo5ITO#%61OXt}GJv1=*G2 zkh48hG!q2tXs9Kq&$6$;&L6_69!ObX%cm>v$~Y--8kcTSbWm`zw@LTKn2eBsM4rbf z@NLx2$F^7VVLtE5(kZqL2#X1tyX19jG&c9#{0dS}J0CkAj~N{q?61r%o!HuKG^K9c zjx?#dRj?%EC0Qd}jA)E!TgZ3Lnn?UDe)vhe@<(YFsL)7{SvkFJIfErRbH$tVMqs{4)@8w26pw`R)VXTBfT_QoS+gQ1&T0}rIg14= z(~ptD_f$S~*CQ`<@sY|M(s$>7UFTk}*|SLmCa?Yfd@siMXI|m^Bvq+usD(F#a-K}* z3<42w`Ome&5C@~ps)QGkK|mwI$eP@fB_XT?LHS^oN0022mnjt}y)h6sOp|fy3rOBg zhw|!24Q_=L=%LA+f5mXhxt-2-F_WU4j&{V zZz0^8wwV>hQkqde{c3t^+A{5K2ZYOr7bN#W^MHf5TQbI0B3zKmg0qy%v=`xLANs>> zQl2ASis!S<(%a0p9@)>haBnu>-x5DR!uWPN<~JQVQ+1dG*U&)-ar)7#@G#=VquP?7 z0Eb&{C|k-{YF$kMU$;=t7h9*34t>zRp>LJFaD#yd*M$$TzpIE^Xr(|PX<)^a+v?+C z`Q&2=gKwIH#;}@>91|7A9i`S178dLXb%prgRexM_zg$t(fIx#XmUks3w$9=bVRH{C z3?gRxOA25LV$-}anYf==QB&D}iO>Ad@)%-~;c)+*6$!FDqCO^e<7ZeK@8epJC-qJA zkoFD@HZnUMnTI7QIU?QN@C%*^gIU#6G;MNBEvM1J`ywR|!)L745zKnwqt{>{xlV4+ z$e5QjRKB7?hOw;}&=F_94Tm95smM6E*jHg&;X^|32K}|}zS!NP<0%aNI z@iA%IYpuu9nGJO4h(3o#Mg)FQ>9S>@c@ch06_{yJ{jL&viP!r`Mn*ck57$C)$;UrS zTaD*ix>b!9^;nrKI{3BTJra49X#j8hY5_@)(yzF=U*I88hvZ`WN*qN58h@^6a|v~U zQOk2GVxh-+-+YTGX!XC*uO>WSn#ZED6q@d|SShGX%xA@Q!ojCoB~mRTDQI2TA6y2z zlg5G^;TV}COEpYm2ur9Qf#@nI+EcyfPS*BRp^D6G5x84c^sQlCPpatixE%%PVd&;Z zTju3w9`ZaA9GoZ%s^bhNu~taqlrt$XX+$NR|HOkoasBETemoFDWJRvBay2? z{hClNII9qjeh*4dOs35kZ(r6odzLYt!J9iWywf7F=WOid;iCKGJOQY77@<>V+XHSkLn89&eRbJF~0IfI_e;86i1$1i$Rr!)-n4Fd5b-cj2wH zPn$XMqtI#`SFw{6!Y0OYbA3WQX9e;a#om96BW^iX6&CYu^M7rUuEXKOpdZnzAzM@Z z;GQI|4D@rE3Q?Y0&>*Z(qre~VjM~;k0WJOC09;Ur9f|FRS9LGB&~N1 z#5P8$&>ucTa!iy`S983JqyT60VT|v2G!uoZ6`2w$hAJ<`CzgB9CTNf{eTvLjvxF81 z{KM|=6nttW7HYK&bt^(CC4>@e<(iyG;tAqKlQDqi!}jwNc) z7;1j38rMAVl@4RGo`NM^(Nc{6fZ zYl4MGxp5XNJG6eR<=$bvrFROxVDT)jQ`>Fxl0U}Of5hs$$ zrnz6>p&W#4L^FdsQ(17lY{F^N_XtBnOmfjwvfg2)O1B0%aNQx4Rm!BYeM=`bi#f`_ z`*9UFOmW7J8UjwwjJQ2K`CV|kB)GbuRzW;Vf+R_rj(J{SYsov_0>$ucr~2reNbF*? zY9Gu16PWxo6V^7qY5IFn%SDO0LmV->HOT=g)FmJit^hi$(NU8-llA4&i0HV?Xahm* z$`DF4Wl;se0UGzphSu=Q$TU;=pCf4IKC3=#=wifoE^NdVT-2r!TwEX|oF14BP9wgT zCsL|}=E9Eirq(t@Q!9wXm_McQltjH_xcB38yy`{-YrO}`T1);Wq+I5~E_gzAJhi-9 z34(US#*0}t{Dx(*3DCZFqRbG6WQp%-FnkaR;<@LNJPbPZMnA1%f0EuLuW{D5oMWu$ z0{O_lJ+bS$1FFH&wg|qZ|4k&(I(4j$JYi8utp}Or4hG}`daY9~`+8?$c;xCktrICH z>W$7iLkg^d581hND{7IDPy?)>`XC8sIezYguPiv^RC7o}n0~W?)D;@I zuuu1p8<5FoK+m2%w_K&re-t{P^jHHTk*BctWLbc_Msq!=P}z>bmm4L zPZW9R;2lY|u?^u4+GU{)RMl9|O(RzQq7*ELo?>e6 zS>WVuo>Mtg}UTP3C8>8Yu*UlHtfoe2UTxrbhDztVm>q;r-@gToD%L`gqDkZ z6MCOi*kQKwL0rRf=9$5P$o+~i-FtSrNZ8F5+Eny>gnI|KD4V5lHRGA5gyxhN0|i)~ zW6*yHJTY`}>`_VI=I!BtWp_)Lo$j7CZpW`j4T`?&-_D)Uks&q>5oFhL>)g3?U~aFJ zv7{EhlVYSFGD$H1T8EXn*)YwUEEzKC)%}v0Z;`u_A~iF=m+Ram0}~LQ(p@t%`3x zg5MCirm#+wyOgf}om~ueMSr-hyIpk2^=Iq|4-c!kg&}2!2-)2AW?m_~U z$$fhVQbX6>geBcSCkVPTqlbum8D(zKoN8;=4yDd8r> zk&O#%%2S^&M-9%0Az0*0)@TSJl?fCwqwL;yOnIsjkoS)#6!pt}aZ!~Y2Dc4b-=8U; z8u+wmJt8yWd_Q`zNQJVsq$?h%gQ#YPDE)bDU%hl9Iq?4R1WnFJ?5*98dc%fy`w1Lg z^sIX1G>VSRP#tbD49}pfHR?v<+ zt+m@qbwOLjEhGUwZEg~!v?-~KOB$<|Bf+{0rCSh6dvBCOW)j&_4j_it_L9o#$Wwdz z%i=S^r9XBJcz%Ol$a_`_(F@uMNzk8mw@0mvINl^d;Aobc5bSr4azL6g7d=p&QEuJ2 zeQ=cMOI5~Qhf3H8Mc06c_JpcCi5QQo=kq+o>ib#amMIvPU0JrTfh}JO3vhkR!GkLL z2ZagTQk*9_hL!DtwOe2kYey2tID)@omcSUBfiE36y6RS^PQEm;8|1*u^fiwddMaW{ z=cQ#G)Us3V%=~7@OhfP30biZGq_THFWe&Tgt@|G9J+x2lwy=qfc02|%9>ZwRPDWys z<2wX;RSgLekafK6u3`M2@6on2l!RlXxns**>Fl(8AsY_Ds18@0C4Y@v zRf16+;kX4h?(L%zpxs=kmkm21aBG_wNc$9b-V%x7zf6ML^mv=mN;$G9U)^AcZ(7YI zF__DKGp>vAjEo2L=8M(rT$9{-JrWo8m`nDp zMkRTfDX~xBhKGjzFJ6U>Q>w=H;}(9VwA<_oK*W6S7d#u7o>Hnk8Pz-X?1PgJf-z;v z9uwX$iOcZeb3}r{jTY{TFu3uRKwG&J*sX7GHifY&CkKUd*3({NoocQwPP64t8dV}F z(a0;|k0}W}dl-0-wm5yU6OtZB2#Nys{Tth8-pafS`Ir!k!DF((?@)XP#DYnLt{_$n8|e6n3-x(_KI6QQkS6)q0V0t67Lt? zZGG`syT;gmbz?PdB%}iiY&_?ah|X|xqL(8a9K07V_WQHf4DN%gb(W2d!8lg7g)c+% zOS;d(M5a^f9@P_UKlAP?Qec|URZ+FQe~4l4QsgAX%p$jEG}on;K&&|Oq$$)s3-wio z_TyO0&BNA6jrETPQjp8%z%~81@Yrlmq>++}KE@EZt~b?3%pPBYs)_EFD$5f_W z{C32LaRY5yVm?iN=Yd?JAb3!~Ikh_sKP{6Wqqu~JjcDhvlkMECHG0ei%CSgy@F+}1 zA%kskZ*EIpS(JN5sA-1$FwG0qPK#(4{k3ke;C@k}90%CF`gz9q`aK8QU#(FsEW|;M zKf5YOMpFDXBeHAxliHfXqTxrMg$fC=chyh?kz0j4qo>NpWpt}V-OURso<`S=yLX(B>%AT@-Ci$y1q_@ zXXy%{+(ML?^3g)I3GsC&&vrq&Q(f`J({Z^4DMim}^Cf!akui0$hB=DoIYG!Yp7q~2 zQSH8=BCZMI6weLaspE9>y{~RzVrAP>u$0k~F{j)I*8+yp5zE}CBa4?GX!jPRGKXk1 zIEy%BkR;pakdZ9)y%0Rgm^&OipyeXq^Y2<_`h}MNPH6O>W+AAHINSZ0AG2NQPI?=O(1BjMk|k4@&5}*|pg@8%1%?o!uPolmvMPu|(6- zs^_SyXj6KTgia9p6Gf^e?IB`+LJ>&IS2U<*64-c5lE0d-`}NSGH*`EoEdHVQ9>T#( zP3w*&quE_aqM^*M38VN-dNoe8*#1QdvmEh3f()NYQ)2z|AL4eu2b*ko7sweyEHJ*e z+l2#lY?Wz_-y6dpM?itDZ8E@#p&SO?%`5HoV1{X#A@kKNo7vF^a7RQhEa(=k16y>5 zS($bZqelr9bN$>VUCb5d%t>iSF)q_zpYJ~Tp!PKP3*ntbkSIAma6YAc>nLVO2eJoGcJ*6Q2)_5!dohCSPX{Q%c z96k=KP}zUYKq;s^Q7rqM^ohf)iA)E9;{cnI(UAX4ks(F^t9C_F%msdrM zWZ}8`_C%mup9fwt;jg+<{M9OqhfMMjdUup%tc;4xXyfV>vrt%i+%Ys}H!GE!;LAwv zG6q(87i%Gx!xqhzzBJqIb7i%9V=BT&QS)xma9>zU+=A8a^*!$rGtSqR&ndk+qti|V z-3|#U86{HgI&D4EkFSp@uY{?8HLCck^9}r2590A8e^H42txyRIKaNfG<+Y_2(uaYR z$9+iNA2Jcb=EZryP6A)+dh&#}Gw?c-ZLQ0l5*4w`zWRu%GG0rR*+Aq1?@m#XBw8(2 zD~Hs=`ZV#BMRSa^Ro>H=Rw(l^R4}q=i0jL0x0fiS_qV)DrsVc(!Sa1v@GUtEd{Z36 zi31^2*>n0OCybC4M0Yx8b|3pL<<>tEqMLXT5h|D$R>!aOmb`&aB}6>UVHbLbc7UpD2yU?a7LL^n{`| zak$6L62@W}su1rmVfL7-J3ef(a7)~Udk2o&x7CC2^J71*abZG-&kIv;4w8Wr{&69_ zRrX-xlw;WKCb$Bz1H|U?u~jl9CGWIeE21+?C~-|iEkP!mys6|sFRK(U7su!iRK)f^ z@I>F{5inb)C@XtPVWG;(DUeM~_GtAfi-W@|D|k_E)aD)A`{*?r?A_ILB;LECIYs8w zI~t4}7*vibh;@{+ELQn%Yb+AdYD{vBN01<5wu8kpL?~B=ogDX^Q`UM;btJjUjq~u1 zPh||WUp2hRN<$Pboo{UR^YfA?&-=EdvOwh&cA14C_^x!yyrPu>s6^i7Lh z)ABrXas-8-MC!6~MeDQdN|FrEjJUUM9m@FPQDlHn$D*OW>3m7FE-pU(auAXNw!h8P z7yzbz>oty%K!)^^>z*Vt%dr^DfH=Rg7eYyk%%*Ty$-YH0thYX`2D{{Rz!5{FH&ANS z9(e^P1v@Etk17O}Dw6B7-fKCUw|#clYH!{^4|MQjz?`Ogx*;T$`D7&{(u-hYOgwd< z%oHZRP2dG{r$D|@)&X^=>%Aw|E3!Al>%4iojM^%Oo6kWx`qXK+8_v39N|}`46V~0? z7?B1T;$eAg=@&K)jws(gYp#(hGLb3G!r9a;n`wyN>31~gHO8@{oO2l^@wu-zuU_69 zRfyji*BAEzYX8v}iR#>B6~gWJ@4nhEBc70IOL?lstD@$`h9rhjXIlZMeGL~V*CgWb z8hp1$U-R_G`L(LYNxzkSYI{FK=Tl9qLQZ@7hR=4G@3L@lF^iOUeSUom_3akcdChWu zq}!}7R5~PkA>)&)EXJ)djFagmwlzAQ^g35>9)aN{1Ic^7GA29l&>hiI42|!8vDTn? zy=?APlM`Ac20vwT`j`1X)f-f41%^h~e_lqT`Nhz<7P|z=kD3k0AU|Y>sbowug@2Mt z+wP@rIaXr60*(&rC4-zx-IOr*v=VZJKG>skzgcq^&SB;jnaDlrQf}gHS>HFWVTkGE z2)UW0J1}lNsY-Vfdb`4PYs9mRK96t6#iix< z(4|1>1&$XHNHFPHtIxf5+JS@5H8c-n-c>M(>19 z-uw2b!T$I?3oxhwY*ZcW4jieq9B0Es-lx7O@k8Qb#{ADdWnfkMK2AhEHuj$CfsxG+ zh*^)yON?$W)fD6su-070wjV#=vvV@EvplLG6Iidx&IK-N6K<$+<6FhNsp*^)^8UEq zSXDi17bD-X9EI>gJ9NrWxWezLg|LnPF8vN+vv&C7wzo&8!Gv$oUrz)A2VM(RDmscns2tU)o(8+`qq7XsCoeoo_;GM%`lFa!MDrX)h zW;dGzw|$(!RcHd0n}>gf_3jAUkyv8cRH3Dh`|3J^@6h zdyE|(CHHwZdQ0{P0@ITzjWqQRplct+Po5xVzkj_kuQo~LEt~OuTGo7ZH}?@>lh9XQ zGG1T6{c35U4ASAVwK4cHJ2QUw-9dp5VVil8y`~LVaBoA_z3__i6|Zymed(o=St7+I z{#?cWUV`tl@-48tViTdAJ&s-QNK+?MDNAs?(9>RDnn@kP%&6%Rz0f^Jg~-OUdq}k< z(uQgRHyO2Slr@axbJoaKHD1w^dt!_zM=KpiFGJ0hA?Hmo4D5ZnuaAPtyA>klXGEc^ ztLvHS#f+05m=qzm6<>0ig40D;>SK1SRMOMb_#8^Wxx?;ZLfY`1jK5|uUuez7V!#O< z0iStF;Ou4KtgUu4ieUsQ9Fky3BWIYh&_6XIRYjg1=E&caBn#1PHv zP{*aD!eIy6?AbCu;uUe(LfQ&p>N3NV6&+mtP{kY(XTF$_R6Nb&cB`*lgMhU9$zufj z_D?m&+U*^#ghRs3xOQ3hU;>XpyJUZBuzp#V}2Ia?Lhn97|H33)6^A%6 zn{(nI=x}U4KCAmcv)`%ge*eopTz#XrgN`&0PftjA&QN%q8e2RSn}$6xW=WD2-%Z>5 z)tl~9pRzT}JIpl0P-}mI7?P&nW|||*3oOQ|mDmDu^N4cT}B4r1ql)uB;H_+hT+xbXn!umLBi9Cv5Pm9C*1hJDfI4 z+YL2lu)04oU+jQP$0eq|117fHSI+KSHz0;T8ZqC^r&4)c86AZF4WX8yg(9V$}_R)4lN|8!k-zMU5|Q9#!zHG=MXW{@nPp-!m+f?oqSU9NnZ`JUcD31+ex+DzUl!!!3A73Ez401D&23j zh+TOi#vz7ko{uS;4u$b#VcIlp9AD=B*D+4IQSDJkJSzNq>lrWZJZ>peg&17Gjd>ye z4ey!t9Qj@aF=lxqXH!7r3jeM1M1~xx<2X)53IxR=&JxWySzT_l?hF)6_7yMUS*lxw ziiIAXzNo&`rRThTgF`BAb8au}X`CKKb%c|S=Ac7H$+Hv)de`hx-oFnO)%JiZTFX0* zZ`hl&ekCzY8oLO>M>Crl97Gz(#nG1Yg1}l?7*nenb-bG$F6%?cUrZ1<#! zqa~-=6qxphN4cNa8nc@ zsCQs+@Ui;bB{AMoClBeU;PcKH+a#7VCzu+-yqpOKQJp;3l{oK+XJhq3zUB8Ov~@8E zwWNrLphYl%U4dAWTV{2fXWGvYXdmDZ>ZXV}ea{i3kJG!=6!I*$Rli2m%MeEb7gZ+w zG@4pT%r5d-k zpHSK4KbJp$gKCuG%MPmZDkqtW-lp$)?+|jb%hMA8l(?jL$;8u6!9@R=#I!Q-&7+I2BUoAhLg*c^!3u7wmus)x8g$5R}B@?gYIrdflvlQ4OVm9Hn zxXvXfAIUEzK`Xq}WG6}yBug<$AhWg13dTxNCcQxk3A#$n{(x+Dp*Rb_exiZL*g_Tk zREa%{TFUHAdE`g*UT8)Y#kJ)_NBBnXF*y@yf{XC2Nl0J4PWgbNV*YWJ6~AANz4u}3 z%v%}m!jE#vCyq`dAmNHf-0w&hEBZ`Pp3pC*)%PP-2FZR{CADULTf5IfpQd%pOFaBLPxw!1?Nbjab+$gmzTCb{-w301`A<}m6KnnPwu30XOKb7!CxsDjbi z*vE2l7o?{MDt>mmvy0~=WsUn~MIBCK7s>Z+{1^$$ua?7AF0(u;Kv94H zmNzEElxzlbl{Nr9SQ^{sixqA|V|a2!$wH=gkSmt!1lg$B49h)BPm=ivNQ<#0TWO+( z4))-euSI>+#%My9QI@xKx5?WjV>Ijv>b)T}+tysZ+h1SKcE%m8jrL9s< zOg(TGz3+xAL{~kY{Xj}O`IJeso5O6^@q_QH*J|cRthBu?2b8mSYiUEoY3oyf3a8Dd ztQi)a{X9{s`){O~94Ey-ncC%rhueiq9EEjkMtU}$RZF>S9j0r}lBb&s1#vxk&&2pe zit$UWe?sx+=+|TUDx(_*og*?~kE=>h8|`pcJR^_}+5?*5?$2--v?GTZzs)Dd!Cy^iU$IOemvP*^Fd}IJF;GN@e}R7vz;JJ@&=D4OMJKHNeWG5e?epzKQ&L|f#)GcsyFmy0z;Lnda5!f8~>wy6Srpzmkq>ut1ov4)X{qxR${!}B&?YH5;z(%luJVsYI>H*f9 zyb4?;Xa5Ncd<(w!OJsg+YeQW{3lno~y}w@w-AtnQQ8%p|xHh4L zcD+NLfepN0G+)5L*31~B_nqd)mGtWhl6h^3_Yx4J4G@F#iWs55dh<^h{!8|25Qmy|$q?Y-1U9%Ywy}Rc#DH|a;sK830~PrM z%q<+{K>9cLNOuFI=S6v^YQUpixV)dw7p`9t2!c#(w1ImnR*qz1*5+o{ilSeaWe0{u zu^sRYHUQm4@#~*Y`J+Fex>=5BCXn?x0BjA&an+EA`F;;v2FP=8Gd9KQOtk=DaCQjS zM=gW!ud%<|w6LKG=;vDfx@tHc%Ud)8BUTD<{sT+J69Dx! zFcVP!Y&7sKU;X!xZ*DPG%!er_U_2H9t-h-CbM0T^{_P!rc}5QOUj{sBXTN!&mgj(@ zxT^F?-CvR@7}%QX2%B4(YX6JVp2r1kuK-oB z0xG)Ls{8p=8T}IbH|7FRbsz2`0T@`BEEpKsPjKKHg2}J&e|G4PQ0#hmboUCPkpIny zAO~HL#YH}eE8)#WU;yeUYq|BvmTBmF`uH`!Tf7C?oBfMi!4 z?fbOf<&l^8pGf~CxiF_8ZzobYfJ6ZxxoS>28NW%QXl4RTZy>!JnEuVp5MAk{yID6g z83Dl&$l0pL~vA@|kb zuK(4qTY4#^13csnO1bRKgw?$IFV5_B0is+DRO<`=i0Y=ndLc`f^f5~zpzTfIb9Ev$ zFZw-#iyEXit*b83akCTKRDh5F8m%@hrgh8_9(xPo~7`&>8M+J^UgKcH8^)_~9bD{@%Z z{T{ZYw#C17MS!&oswto(37G3%$)*1H!N2QB@2|k}W+5mmxxNVkJP!Xb4%wzZ<@rTl ztl=uooC7X>91#qR?ux#^+J2krpHf`-R#HbLaadsB<^%A2SD;lt{2sJ|0g!BfO!}`d zNE?`R|8i3|jj9W}%SGd__I!W$AJF|%mJ9Q^Tu1z>4{`W(Gx(2c!v8BTe6(d8uf_pbC2-{LO`{@Lb>L3=qB`qh;N_3_P+*K_4xH1gj< zfUDc6%BMFYTK_Mh`p>=Viy?VApY~OKhW!HRde+7pR?im%mlGjhB`7-o@1|ZSVEU(a zF94r?8?_i#N{NHR|!xd{*2)76u8$3E~hILx-#Urq5q8F zUo&T3r@Wk!O8g4t0PG)A{x2QJ4OtPd6JJhVb5&Lyls_f@m;6`PDK94?5xpX7DaM~s z{%4My>$I0M9Y|cERl)u<+F#{7xz2p~z7gXUW;6UhV!qknE?-;3;3I^FkNo_ zUsL?0dm*$}T8~Qe3;1g{ZmuJ*U%I?-bw|ko*a*34Gy8|9xcQdJW&8_Ibon&+)jbUtM3KbN>m`j}Ev4ti6C7VZfgZU@wwf09YG?{T~`gS+)QG diff --git a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java index fd9a2988d6..287da2dde1 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java +++ b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java @@ -20,6 +20,7 @@ import net.osmand.plus.osmedit.OsmEditingPlugin; import net.osmand.plus.osmodroid.OsMoDroidPlugin; import net.osmand.plus.parkingpoint.ParkingPositionPlugin; import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin; +import net.osmand.plus.sherpafy.SherpafyPlugin; import net.osmand.plus.srtmplugin.SRTMPlugin; import net.osmand.plus.views.OsmandMapTileView; import org.apache.commons.logging.Log; @@ -34,6 +35,7 @@ public abstract class OsmandPlugin { private static List activePlugins = new ArrayList(); private static final Log LOG = PlatformUtil.getLog(OsmandPlugin.class); + private static final String SHERPAFY_PLUGIN_COMPONENT = "net.osmand.sherpafy"; //$NON-NLS-1$ private static final String PARKING_PLUGIN_COMPONENT = "net.osmand.parkingPlugin"; //$NON-NLS-1$ private static final String SRTM_PLUGIN_COMPONENT_PAID = "net.osmand.srtmPlugin.paid"; //$NON-NLS-1$ private static final String SRTM_PLUGIN_COMPONENT = "net.osmand.srtmPlugin"; //$NON-NLS-1$ @@ -62,6 +64,7 @@ public abstract class OsmandPlugin { public static void initPlugins(OsmandApplication app) { OsmandSettings settings = app.getSettings(); OsmandRasterMapsPlugin rasterMapsPlugin = new OsmandRasterMapsPlugin(app); + installPlugin(SHERPAFY_PLUGIN_COMPONENT, SherpafyPlugin.ID, app, new SherpafyPlugin(app)); installedPlugins.add(rasterMapsPlugin); installedPlugins.add(new OsmandMonitoringPlugin(app)); installedPlugins.add(new AccessibilityPlugin(app)); @@ -112,7 +115,7 @@ public abstract class OsmandPlugin { * Register layers calls when activity is created and before @mapActivityCreate * @param activity */ - public abstract void registerLayers(MapActivity activity); + public void registerLayers(MapActivity activity) { } public void mapActivityCreate(MapActivity activity) { } diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index 0af25c800a..888ff2eabe 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -135,9 +135,6 @@ public class OsmandSettings { return settingsAPI.getPreferenceObject(getSharedPreferencesName(mode)); } - public Object getGlobalPreferences(){ - return settingsAPI.getPreferenceObject(getSharedPreferencesName(null)); - } // this value string is synchronized with settings_pref.xml preference name public final OsmandPreference APPLICATION_MODE = new PreferenceWithListener(){ diff --git a/OsmAnd/src/net/osmand/plus/api/FileSettingsAPIImpl.java b/OsmAnd/src/net/osmand/plus/api/FileSettingsAPIImpl.java new file mode 100644 index 0000000000..fe50903186 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/api/FileSettingsAPIImpl.java @@ -0,0 +1,188 @@ +package net.osmand.plus.api; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; + +import net.osmand.plus.OsmandApplication; + +public class FileSettingsAPIImpl implements SettingsAPI { + + protected OsmandApplication app; + protected ConcurrentHashMap map = new ConcurrentHashMap(); + protected File file; + + public FileSettingsAPIImpl(OsmandApplication app, File file) throws IOException { + this.file = file; + Properties props = new Properties(); + FileInputStream fis = new FileInputStream(file); + props.load(fis); + for (Object key : props.keySet()) { + String k = key.toString(); + map.put(k, props.get(key)); + } + } + + @Override + public Object getPreferenceObject(String key) { + return key; + } + + private String wrap(Object pref, String key) { + return pref + "."+key; + } + @Override + public SettingsEditor edit(final Object pref) { + return new SettingsEditor() { + Map modified = new LinkedHashMap(); + + @Override + public SettingsEditor remove(String key) { + modified.put(wrap(pref,key), null); + return this; + } + + @Override + public SettingsEditor putString(String key, String value) { + modified.put(wrap(pref,key), value); + return this; + } + + @Override + public SettingsEditor putLong(String key, long value) { + modified.put(key, value+""); + return this; + } + + @Override + public SettingsEditor putInt(String key, int value) { + modified.put(wrap(pref,key), value); + return this; + } + + @Override + public SettingsEditor putFloat(String key, float value) { + modified.put(wrap(pref,key), value); + return this; + } + + @Override + public SettingsEditor putBoolean(String key, boolean value) { + modified.put(wrap(pref,key), value); + return this; + } + + @Override + public boolean commit() { + return commitToFile(modified); + } + + }; + } + + + private boolean commitToFile(Map modified) { + for(Entry e : modified.entrySet()) { + if (e.getValue() == null) { + map.remove(e.getKey()); + } else { + map.put(e.getKey(), e.getValue()); + } + } + try { + Properties ps = new Properties(); + ps.putAll(map); + final FileOutputStream fout = new FileOutputStream(file); + ps.store(fout, null); + fout.close(); + return true; + } catch (IOException e1) { + e1.printStackTrace(); + return false; + } + } + + @Override + public String getString(Object pref, String key, String defValue) { + Object obj = map.get(wrap(pref,key)); + if(obj == null) { + return defValue; + } + return obj.toString(); + } + @Override + public float getFloat(Object pref, String key, float defValue) { + Object obj = map.get(wrap(pref,key)); + if(obj == null) { + return defValue; + } + if(obj instanceof Number) { + return ((Number)obj).floatValue(); + } else { + try { + float flot = Float.parseFloat(obj.toString()); + map.put(wrap(pref, key), flot); + return flot; + } catch (NumberFormatException e) { + return defValue; + } + } + } + @Override + public boolean getBoolean(Object pref, String key, boolean defValue) { + Object obj = map.get(wrap(pref,key)); + if(obj == null) { + return defValue; + } + return Boolean.parseBoolean(obj.toString()); + } + + @Override + public int getInt(Object pref, String key, int defValue) { + Object obj = map.get(wrap(pref,key)); + if(obj == null) { + return defValue; + } + if(obj instanceof Number) { + return ((Number)obj).intValue(); + } else { + try { + int num = Integer.parseInt(obj.toString()); + map.put(wrap(pref, key), num); + return num; + } catch (NumberFormatException e) { + return defValue; + } + } + } + + @Override + public long getLong(Object pref, String key, long defValue) { + Object obj = map.get(wrap(pref,key)); + if(obj == null) { + return defValue; + } + if(obj instanceof Number) { + return ((Number)obj).longValue(); + } else { + try { + long num = Long.parseLong(obj.toString()); + map.put(wrap(pref, key), num); + return num; + } catch (NumberFormatException e) { + return defValue; + } + } + + } + @Override + public boolean contains(Object pref, String key) { + return map.containsKey(wrap(pref,key)); + } +} diff --git a/OsmAnd/src/net/osmand/plus/dropbox/DropboxPlugin.java b/OsmAnd/src/net/osmand/plus/dropbox/DropboxPlugin.java deleted file mode 100644 index 23981701ae..0000000000 --- a/OsmAnd/src/net/osmand/plus/dropbox/DropboxPlugin.java +++ /dev/null @@ -1,146 +0,0 @@ -package net.osmand.plus.dropbox; - -import net.osmand.PlatformUtil; -import net.osmand.plus.OsmandApplication; -import net.osmand.plus.OsmandPlugin; -import net.osmand.plus.OsmandSettings; -import net.osmand.plus.R; -import net.osmand.plus.activities.MapActivity; - -import org.apache.commons.logging.Log; - -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageManager; -import android.net.Uri; - -import com.dropbox.client2.DropboxAPI; -import com.dropbox.client2.DropboxAPI.Entry; -import com.dropbox.client2.android.AndroidAuthSession; -import com.dropbox.client2.android.AuthActivity; -import com.dropbox.client2.exception.DropboxException; -import com.dropbox.client2.session.AccessTokenPair; -import com.dropbox.client2.session.AppKeyPair; -import com.dropbox.client2.session.Session.AccessType; - -public class DropboxPlugin extends OsmandPlugin { - - public static final String ID = "osmand.dropbox"; - private static final Log log = PlatformUtil.getLog(DropboxPlugin.class); - private OsmandApplication app; - private DropboxAPI mApi; - - final static private String APP_KEY = "CHANGE_ME"; - final static private String APP_SECRET = "CHANGE_ME_SECRET"; - final static private AccessType ACCESS_TYPE = AccessType.APP_FOLDER; - - final static private String ACCESS_KEY_NAME = "DROPBOX_ACCESS_KEY"; - final static private String ACCESS_SECRET_NAME = "DROPBOX_ACCESS_SECRET"; - - - @Override - public String getId() { - return ID; - } - - public DropboxPlugin(OsmandApplication app) { - this.app = app; - - } - - @Override - public String getDescription() { - // TODO - return app.getString(R.string.osmodroid_plugin_description); - } - - @Override - public String getName() { - // TODO - return app.getString(R.string.osmodroid_plugin_name); - } - - @Override - public boolean init(final OsmandApplication app) { - this.app = app; - AndroidAuthSession session = buildSession(); - mApi = new DropboxAPI(session); - return true; - } - - public void syncFolders(){ - try { - Entry f = mApi.createFolder("osmand"); - } catch (DropboxException e) { - } - } - - private String[] getKeys() { - OsmandSettings set = app.getSettings(); - SharedPreferences prefs = (SharedPreferences) set.getGlobalPreferences(); - String key = prefs.getString(ACCESS_KEY_NAME, null); - String secret = prefs.getString(ACCESS_SECRET_NAME, null); - if (key != null && secret != null) { - String[] ret = new String[2]; - ret[0] = key; - ret[1] = secret; - return ret; - } else { - return null; - } - } - - public void storeKeys(String key, String secret) { - // Save the access key for later - OsmandSettings set = app.getSettings(); - SharedPreferences prefs = (SharedPreferences) set.getGlobalPreferences(); - prefs.edit().putString(ACCESS_KEY_NAME, key) - .putString(ACCESS_SECRET_NAME, secret).commit(); - } - - public void clearKeys() { - SharedPreferences prefs = (SharedPreferences) app.getSettings().getGlobalPreferences(); - prefs.edit().remove(ACCESS_KEY_NAME).remove(ACCESS_SECRET_NAME).commit(); - } - - private AndroidAuthSession buildSession() { - AppKeyPair appKeyPair = new AppKeyPair(APP_KEY, APP_SECRET); - AndroidAuthSession session; - - String[] stored = getKeys(); - if (stored != null) { - AccessTokenPair accessToken = new AccessTokenPair(stored[0], stored[1]); - session = new AndroidAuthSession(appKeyPair, ACCESS_TYPE, accessToken); - } else { - session = new AndroidAuthSession(appKeyPair, ACCESS_TYPE); - } - - return session; - } - - private void checkAppKeySetup() { - // Check if the app has set up its manifest properly. - Intent testIntent = new Intent(Intent.ACTION_VIEW); - String scheme = "db-" + APP_KEY; - String uri = scheme + "://" + AuthActivity.AUTH_VERSION + "/test"; - testIntent.setData(Uri.parse(uri)); - PackageManager pm = app.getPackageManager(); - if (0 == pm.queryIntentActivities(testIntent, 0).size()) { - log.warn("URL scheme in your app's " + - "manifest is not set up correctly. You should have a " + - "com.dropbox.client2.android.AuthActivity with the " + - "scheme: " + scheme); - } - } - - @Override - public void registerLayers(MapActivity activity) { - - } - - @Override - public void disable(OsmandApplication app) { - } - - -} diff --git a/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyPlugin.java b/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyPlugin.java new file mode 100644 index 0000000000..a09161a3e8 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyPlugin.java @@ -0,0 +1,44 @@ +package net.osmand.plus.sherpafy; + +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.OsmandPlugin; +import net.osmand.plus.activities.MapActivity; + +public class SherpafyPlugin extends OsmandPlugin { + + public static final String ID = "osmand.shepafy"; + protected OsmandApplication app; + + @Override + public String getId() { + return ID ; + } + + public SherpafyPlugin(OsmandApplication app) { + this.app = app; + } + + @Override + public String getDescription() { + return "Sherpafy plugin (TODO externalize)"; + } + + @Override + public String getName() { + return "Sherpafy plugin "; + } + + @Override + public boolean init(final OsmandApplication app) { + return true; + } + + @Override + public void disable(OsmandApplication app) { + } + + @Override + public void registerLayers(MapActivity activity) { + } + +} diff --git a/plugins/Osmand-Sherpafy/.classpath b/plugins/Osmand-Sherpafy/.classpath new file mode 100644 index 0000000000..7bc01d9a9c --- /dev/null +++ b/plugins/Osmand-Sherpafy/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/plugins/Osmand-Sherpafy/.gitignore b/plugins/Osmand-Sherpafy/.gitignore new file mode 100644 index 0000000000..36986d81cf --- /dev/null +++ b/plugins/Osmand-Sherpafy/.gitignore @@ -0,0 +1,4 @@ +bin +gen +raw +obj diff --git a/plugins/Osmand-Sherpafy/.project b/plugins/Osmand-Sherpafy/.project new file mode 100644 index 0000000000..728045eb8b --- /dev/null +++ b/plugins/Osmand-Sherpafy/.project @@ -0,0 +1,33 @@ + + + Osmand-Sherpafy + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/plugins/Osmand-Sherpafy/AndroidManifest.xml b/plugins/Osmand-Sherpafy/AndroidManifest.xml new file mode 100644 index 0000000000..3a2a3ff669 --- /dev/null +++ b/plugins/Osmand-Sherpafy/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/Osmand-Sherpafy/Osmand-Sherpafy.iml b/plugins/Osmand-Sherpafy/Osmand-Sherpafy.iml new file mode 100644 index 0000000000..fcb91eb6fe --- /dev/null +++ b/plugins/Osmand-Sherpafy/Osmand-Sherpafy.iml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/Osmand-Sherpafy/proguard-project.txt b/plugins/Osmand-Sherpafy/proguard-project.txt new file mode 100644 index 0000000000..f2fe1559a2 --- /dev/null +++ b/plugins/Osmand-Sherpafy/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/plugins/Osmand-Sherpafy/project.properties b/plugins/Osmand-Sherpafy/project.properties new file mode 100644 index 0000000000..4ab125693c --- /dev/null +++ b/plugins/Osmand-Sherpafy/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-19 diff --git a/plugins/Osmand-Sherpafy/res/drawable-hdpi/ic_launcher.png b/plugins/Osmand-Sherpafy/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..96a442e5b8e9394ccf50bab9988cb2316026245d GIT binary patch literal 9397 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 R1%Utn002ovPDHLkV1fm{4kiEq literal 0 HcmV?d00001 diff --git a/plugins/Osmand-Sherpafy/res/drawable-ldpi/ic_launcher.png b/plugins/Osmand-Sherpafy/res/drawable-ldpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..99238729d8753585237a65b91c7cde426c90baef GIT binary patch literal 2729 zcmV;a3Rd-rP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L02dMf02dMgXP?qi00007bV*G`2ipt~ z7YY(F`_Sb8017EdL_t(o!?l=uuwPYm$3JVI^ZWho?|E--5|R`W6G$K=z*GYY6wr=V zEHLAs& zdz|M!d-acV?}e00xbt)P@m$z^s#fV*k#SgXB4;4pFT(w@xz)o_l~EwJ+$tL zNA}&l{N}CqzO8^B)M@;g^aHT<;0E84yNhu{N${eJ-?VeV-AUA6q$<9trt}a{U45TFsn9Sc6zfp($j8t2s@dE zQIjAUBn)CY?J)11fS?@`1`%Nx6NL#$Z0Usk7(Wr4STgIdiMw7!!ptNtBYrmL$nY(+rzsSZg&+Q(Pts z$DVsczi`HH^ri&>wJ9FAf9p&De1OdZH!;t<6V-n!4>5RGht>sq2l{?Fa6~?LaQm$9 z9qH`6yjb)4PhAIa?cbkttcHHF=ZgDOlWSCc`VaTB=hp)doVH}{g9J0z z{OG}rx?{_LG>2kT!Sf8oqKD@j#DD_oG}lq0#F53O8AgO^qo8w6oGP^*|D}1SXUk7K zb?V*KdY9iC3G_f;Tb_CB@TqH89N00=&{%tU%c0Z4WB~ApI*tQ-I@60@=bck#y}*T6 z_R1w!Pet&si6M<0X$&@1Z04|OhSLnh!5CX8&N-6E$;g1?;NIcJ!9M@ET6asjDj{j& zq&1Y$9Lh>#7>)s?>Lr;~P$jdD%&Hf*{8+t^cGKb)1Y-;$qr{4!>WIP!krE;qzA0ie zH@2QMam0}lG!0Rtu2d9Jhk!tC3eGyD1bu2t1_*& znD@VXDUHfZeztiTyAJ-0ENzq8EH4L{qM4F8hdRitic@fz!#TyN5{GdxF+&jQ7@$l6 zDL9*@Sw_A%6O4hL>RjG2?L1CC{!f_IyJ&pj%>v_aJj(1 zDV}G@zl}MeEcR)=MBzMj!s=}<^ zGdSzCOStu`m-76U#|fg&xSoPB<%f3P={hr%`p}{nf+USozR$hK7$G3*$9{2!b{no?XWStM8y#?82#n6GW?7)Zsa` zwL!I2XXA1vS#2G_6uFg)uUPcjE9|${UC9d@_w0xRuPYew-0*;GI=nx){rvMUu(54@ z+`1-W3}TdRyVvvF=0|BZ+svA_fYc`R9sDKlJoSV8^oiAcd+nE5_tZVqd%^b&f>BQz zGBTL-|M&8(H=O;xQ=e^A=e^iz^4+6@yKlSf%8Tv#hqkcmS4VRN-hS^#_`+wt2f#&F zoaoiN8`U^;=?_+H4ewj^5AQhK+SC`?KJ^PeVnke)?{!I}B<(sU&3He<>2?MWWu%2Z z{8ENr@N(U$qFI3=v-$PTS07#Z@0&k3QOG}i+j)HBi%%Z=`tcW^UCejx+4hFXpTF~> z6_NH`)m1V01y2Phns1H@BEv%=rBZ<`6)ly05y^ASTBkN~;?g=vr9P;=m7CX$|G)Zgm+aiXZ~uaNy+(I$oqD4|rBaJZ zrIPx7!4u>8HcdFJC#TdexmzBje$|6hQ{z`W;j zcxEL`omomE>(d+x8Qd8VhX=5+`P#GV58evMdoP*&lTI}9fl8%JsjEQ2FXPkIUzaTk zaNk#c^;wYqAW|>-DX%0C?1}#Zoic`Di%g1kcS7qn!=Ut&(rcy6c zEP5*Vl6GWL2O9olCKpP^6ib5fJT(SUCo~-tix$s^a?N*TuSl&?#P^M4X@Pb!L1}-x z&WA*#CC1=+BE_;txmKWDDTfD-_Gz_Ib&Z~KTI()QX%w`p;#2A}c%F3r-vD)*@$xL` zN{seU@}^QO)(>T_xfWpdaeovRE7^CZPMr}#|!d*|R6{H=+M{MV$Mp3LNPKT_t5 z(-+S5yz=?J*A+!U{KSTh8xFttSbqQdFU>bSjT8Q$)Ky#JnbOd}k;7ZR_W37=|NQzh jFn-Lp|K;W1YU6(Zg`N}+zmb=x00000NkvXXu0mjf_|!_9 literal 0 HcmV?d00001 diff --git a/plugins/Osmand-Sherpafy/res/drawable-ldpi/icon.png b/plugins/Osmand-Sherpafy/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c99e8a25f70d64ed2ba830c9deb80f940932e220 GIT binary patch literal 2683 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 literal 0 HcmV?d00001 diff --git a/plugins/Osmand-Sherpafy/res/drawable-mdpi/icon.png b/plugins/Osmand-Sherpafy/res/drawable-mdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..15eeaf60c26c5f3fb4f9c8d515aa671f28636c09 GIT binary patch literal 4055 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 JPDHLkV1ij1!pZ;u literal 0 HcmV?d00001 diff --git a/plugins/Osmand-Sherpafy/res/drawable-xhdpi/ic_launcher.png b/plugins/Osmand-Sherpafy/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..71c6d760f05183ef8a47c614d8d13380c8528499 GIT binary patch literal 14383 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 literal 0 HcmV?d00001 diff --git a/plugins/Osmand-Sherpafy/res/drawable-xhdpi/icon.png b/plugins/Osmand-Sherpafy/res/drawable-xhdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8c9caab40cce7fcd6a0ffce41ca86b75c2b89def GIT binary patch literal 10436 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 uZTwhy^G{X)pKc%hCjAtGk9Yh30t^84=xnuG?ik + + + + + \ No newline at end of file diff --git a/plugins/Osmand-Sherpafy/res/values/strings.xml b/plugins/Osmand-Sherpafy/res/values/strings.xml new file mode 100644 index 0000000000..5e29d65327 --- /dev/null +++ b/plugins/Osmand-Sherpafy/res/values/strings.xml @@ -0,0 +1,8 @@ + + + No + Yes + OsmAnd is not installed + Sherpafy + OsmAnd Sherpafy is installed and enabled in OsmAnd settings. + \ No newline at end of file diff --git a/plugins/Osmand-Sherpafy/src/net/osmand/sherpafy/SherpafyPluginActivity.java b/plugins/Osmand-Sherpafy/src/net/osmand/sherpafy/SherpafyPluginActivity.java new file mode 100644 index 0000000000..48ed70f7ac --- /dev/null +++ b/plugins/Osmand-Sherpafy/src/net/osmand/sherpafy/SherpafyPluginActivity.java @@ -0,0 +1,60 @@ +package net.osmand.sherpafy; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.net.Uri; +import android.os.Bundle; + +public class SherpafyPluginActivity extends Activity { + private static final String OSMAND_COMPONENT = "net.osmand"; //$NON-NLS-1$ + private static final String OSMAND_COMPONENT_PLUS = "net.osmand.plus"; //$NON-NLS-1$ + private static final String OSMAND_ACTIVITY = "net.osmand.plus.activities.MainMenuActivity"; //$NON-NLS-1$ + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + + Intent intentPlus = new Intent(); + intentPlus.setComponent(new ComponentName(OSMAND_COMPONENT_PLUS, OSMAND_ACTIVITY)); + intentPlus.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); + ResolveInfo resolved = getPackageManager().resolveActivity(intentPlus, PackageManager.MATCH_DEFAULT_ONLY); + if(resolved != null) { + stopService(intentPlus); + startActivity(intentPlus); + } else { + Intent intentNormal = new Intent(); + intentNormal.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); + intentNormal.setComponent(new ComponentName(OSMAND_COMPONENT, OSMAND_ACTIVITY)); + resolved = getPackageManager().resolveActivity(intentNormal, PackageManager.MATCH_DEFAULT_ONLY); + if (resolved != null) { + stopService(intentNormal); + startActivity(intentNormal); + } else { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage(getString(R.string.osmand_app_not_found)); + builder.setPositiveButton(getString(R.string.default_buttons_yes), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pname:" + OSMAND_COMPONENT_PLUS)); + try { + stopService(intent); + startActivity(intent); + } catch (ActivityNotFoundException e) { + } + } + }); + builder.setNegativeButton(getString(R.string.default_buttons_no), null); + builder.show(); + } + } + } + +} \ No newline at end of file From 99a75903b714eba5cea9ac09337113f8c7a18de3 Mon Sep 17 00:00:00 2001 From: vshcherb Date: Wed, 16 Apr 2014 20:23:11 +0200 Subject: [PATCH 17/29] Update sherpafy customization --- OsmAnd/res/layout/menu.xml | 8 +- OsmAnd/res/values/sherpafy.xml | 5 ++ .../osmand/plus/OsmAndAppCustomization.java | 32 ++++++++ .../net/osmand/plus/OsmandApplication.java | 32 ++++---- OsmAnd/src/net/osmand/plus/OsmandPlugin.java | 3 - .../src/net/osmand/plus/OsmandSettings.java | 22 +++++- .../plus/activities/MainMenuActivity.java | 79 ++++++++++++------- .../osmand/plus/api/FileSettingsAPIImpl.java | 18 +++-- .../plus/sherpafy/SherpafyCustomization.java | 71 +++++++++++++++++ .../osmand/plus/sherpafy/SherpafyPlugin.java | 44 ----------- plugins/Osmand-Sherpafy/AndroidManifest.xml | 2 - .../sherpafy/SherpafyPluginActivity.java | 4 + 12 files changed, 213 insertions(+), 107 deletions(-) create mode 100644 OsmAnd/res/values/sherpafy.xml create mode 100644 OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java create mode 100644 OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java delete mode 100644 OsmAnd/src/net/osmand/plus/sherpafy/SherpafyPlugin.java diff --git a/OsmAnd/res/layout/menu.xml b/OsmAnd/res/layout/menu.xml index 0d79c24bee..24da0231d0 100644 --- a/OsmAnd/res/layout/menu.xml +++ b/OsmAnd/res/layout/menu.xml @@ -54,11 +54,11 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:b - - @@ -66,12 +66,12 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:b - diff --git a/OsmAnd/res/values/sherpafy.xml b/OsmAnd/res/values/sherpafy.xml new file mode 100644 index 0000000000..461bc9d2be --- /dev/null +++ b/OsmAnd/res/values/sherpafy.xml @@ -0,0 +1,5 @@ + + + Couldn\'t create settings file in tour folder. + Tour + diff --git a/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java b/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java new file mode 100644 index 0000000000..195a7e5acd --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java @@ -0,0 +1,32 @@ +package net.osmand.plus; + +import android.view.Window; +import net.osmand.plus.api.SettingsAPI; + +public class OsmAndAppCustomization { + + protected OsmandApplication app; + + public void setup(OsmandApplication app) { + this.app = app; + } + + public OsmandSettings createSettings(SettingsAPI api) { + return new OsmandSettings(app, api); + } + + public boolean checkExceptionsOnStart() { + return true; + } + + public boolean showFirstTimeRunAndTips(boolean firstTime, boolean appVersionChanged) { + return true; + } + + public boolean checkBasemapDownloadedOnStart() { + return true; + } + + public void customizeMainMenu(Window window) { + } +} diff --git a/OsmAnd/src/net/osmand/plus/OsmandApplication.java b/OsmAnd/src/net/osmand/plus/OsmandApplication.java index 01a34f8d87..7e0f97be46 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandApplication.java +++ b/OsmAnd/src/net/osmand/plus/OsmandApplication.java @@ -29,6 +29,7 @@ import net.osmand.plus.activities.SettingsActivity; import net.osmand.plus.api.SQLiteAPI; import net.osmand.plus.api.SQLiteAPIImpl; import net.osmand.plus.api.SettingsAPI; +import net.osmand.plus.api.SettingsAPIImpl; import net.osmand.plus.render.NativeOsmandLibrary; import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.resources.ResourceManager; @@ -81,6 +82,7 @@ public class OsmandApplication extends Application { public static final String EXCEPTION_PATH = "exception.log"; //$NON-NLS-1$ private static final org.apache.commons.logging.Log LOG = PlatformUtil.getLog(OsmandApplication.class); + ResourceManager resourceManager = null; PoiFiltersHelper poiFilters = null; RoutingHelper routingHelper = null; @@ -89,6 +91,7 @@ public class OsmandApplication extends Application { OsmandSettings osmandSettings = null; + OsmAndAppCustomization appCustomization; DayNightHelper daynightHelper; NavigationService navigationService; RendererRegistry rendererRegistry; @@ -108,7 +111,6 @@ public class OsmandApplication extends Application { private boolean applicationInitializing = false; private Locale prefferedLocale = null; - SettingsAPI settingsAPI; SQLiteAPI sqliteAPI; BRouterServiceConnection bRouterServiceConnection; @@ -125,10 +127,10 @@ public class OsmandApplication extends Application { } } super.onCreate(); + appCustomization = new OsmAndAppCustomization(); + appCustomization.setup(this); - settingsAPI = new net.osmand.plus.api.SettingsAPIImpl(this); sqliteAPI = new SQLiteAPIImpl(this); - try { bRouterServiceConnection = BRouterServiceConnection.connect(this); } catch(Exception e) { @@ -136,7 +138,7 @@ public class OsmandApplication extends Application { } // settings used everywhere so they need to be created first - osmandSettings = createOsmandSettingsInstance(); + osmandSettings = appCustomization.createSettings(new net.osmand.plus.api.SettingsAPIImpl(this)); // always update application mode to default if(!osmandSettings.FOLLOW_THE_ROUTE.get()){ osmandSettings.APPLICATION_MODE.set(osmandSettings.DEFAULT_APPLICATION_MODE.get()); @@ -189,18 +191,19 @@ public class OsmandApplication extends Application { return taskManager; } - /** - * Creates instance of OsmandSettings - * - * @return Reference to instance of OsmandSettings - */ - protected OsmandSettings createOsmandSettingsInstance() { - return new OsmandSettings(this); - } public OsmAndLocationProvider getLocationProvider() { return locationProvider; } + + public OsmAndAppCustomization getAppCustomization() { + return appCustomization; + } + + public void setAppCustomization(OsmAndAppCustomization appCustomization) { + this.appCustomization = appCustomization; + this.appCustomization.setup(this); + } /** * Application settings @@ -692,11 +695,6 @@ public class OsmandApplication extends Application { AccessibleToast.makeText(this, msg, Toast.LENGTH_LONG).show(); } - public SettingsAPI getSettingsAPI() { - return settingsAPI; - } - - public SQLiteAPI getSQLiteAPI() { return sqliteAPI; } diff --git a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java index 287da2dde1..49c0efb921 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java +++ b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java @@ -20,7 +20,6 @@ import net.osmand.plus.osmedit.OsmEditingPlugin; import net.osmand.plus.osmodroid.OsMoDroidPlugin; import net.osmand.plus.parkingpoint.ParkingPositionPlugin; import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin; -import net.osmand.plus.sherpafy.SherpafyPlugin; import net.osmand.plus.srtmplugin.SRTMPlugin; import net.osmand.plus.views.OsmandMapTileView; import org.apache.commons.logging.Log; @@ -35,7 +34,6 @@ public abstract class OsmandPlugin { private static List activePlugins = new ArrayList(); private static final Log LOG = PlatformUtil.getLog(OsmandPlugin.class); - private static final String SHERPAFY_PLUGIN_COMPONENT = "net.osmand.sherpafy"; //$NON-NLS-1$ private static final String PARKING_PLUGIN_COMPONENT = "net.osmand.parkingPlugin"; //$NON-NLS-1$ private static final String SRTM_PLUGIN_COMPONENT_PAID = "net.osmand.srtmPlugin.paid"; //$NON-NLS-1$ private static final String SRTM_PLUGIN_COMPONENT = "net.osmand.srtmPlugin"; //$NON-NLS-1$ @@ -64,7 +62,6 @@ public abstract class OsmandPlugin { public static void initPlugins(OsmandApplication app) { OsmandSettings settings = app.getSettings(); OsmandRasterMapsPlugin rasterMapsPlugin = new OsmandRasterMapsPlugin(app); - installPlugin(SHERPAFY_PLUGIN_COMPONENT, SherpafyPlugin.ID, app, new SherpafyPlugin(app)); installedPlugins.add(rasterMapsPlugin); installedPlugins.add(new OsmandMonitoringPlugin(app)); installedPlugins.add(new AccessibilityPlugin(app)); diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index 888ff2eabe..0241cf0847 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -105,9 +105,9 @@ public class OsmandSettings { private boolean internetConnectionAvailable = true; - protected OsmandSettings(OsmandApplication clientContext) { + protected OsmandSettings(OsmandApplication clientContext, SettingsAPI settinsAPI) { ctx = clientContext; - settingsAPI = ctx.getSettingsAPI(); + this.settingsAPI = settinsAPI; globalPreferences = settingsAPI.getPreferenceObject(SHARED_PREFERENCES_NAME); // start from default settings @@ -123,6 +123,14 @@ public class OsmandSettings { return ctx; } + public void setSettingsAPI(SettingsAPI settingsAPI) { + this.settingsAPI = settingsAPI; + } + + public SettingsAPI getSettingsAPI() { + return settingsAPI; + } + public static String getSharedPreferencesName(ApplicationMode mode){ if(mode == null){ return SHARED_PREFERENCES_NAME; @@ -557,6 +565,16 @@ public class OsmandSettings { return p; } + @SuppressWarnings("unchecked") + public CommonPreference registerBooleanPreference(String id, String defValue) { + if(registeredPreferences.containsKey(id)) { + return (CommonPreference) registeredPreferences.get(id); + } + StringPreference p = new StringPreference(id, defValue); + registeredPreferences.put(id, p); + return p; + } + @SuppressWarnings("unchecked") public CommonPreference registerIntPreference(String id, int defValue) { if(registeredPreferences.containsKey(id)) { diff --git a/OsmAnd/src/net/osmand/plus/activities/MainMenuActivity.java b/OsmAnd/src/net/osmand/plus/activities/MainMenuActivity.java index 4f8101ab9c..16dc2500a3 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MainMenuActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MainMenuActivity.java @@ -6,11 +6,13 @@ import java.util.Random; import net.osmand.access.AccessibleAlertBuilder; import net.osmand.data.LatLon; +import net.osmand.plus.OsmAndAppCustomization; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; import net.osmand.plus.activities.search.SearchActivity; import net.osmand.plus.render.MapRenderRepositories; +import net.osmand.plus.sherpafy.SherpafyCustomization; import android.app.Activity; import android.app.AlertDialog.Builder; import android.app.Dialog; @@ -182,6 +184,9 @@ public class MainMenuActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { + if(getIntent() != null) { + setupCustomization(getIntent()); + } ((OsmandApplication) getApplication()).applyTheme(this); super.onCreate(savedInstanceState); boolean exit = false; @@ -195,6 +200,8 @@ public class MainMenuActivity extends Activity { requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.menu); + OsmAndAppCustomization appCustomization = getMyApplication().getAppCustomization(); + onCreateMainMenu(getWindow(), this); Window window = getWindow(); @@ -242,6 +249,7 @@ public class MainMenuActivity extends Activity { activity.startActivity(search); } }); + appCustomization.customizeMainMenu(window); if(exit){ getMyApplication().closeApplication(activity); return; @@ -255,43 +263,56 @@ public class MainMenuActivity extends Activity { } startProgressDialog = new ProgressDialog(this); getMyApplication().checkApplicationIsBeingInitialized(this, startProgressDialog); - SharedPreferences pref = getPreferences(MODE_WORLD_WRITEABLE); + boolean dialogShown = false; boolean firstTime = false; - if(!pref.contains(FIRST_TIME_APP_RUN)){ + SharedPreferences pref = getPreferences(MODE_WORLD_WRITEABLE); + boolean appVersionChanged = false; + if (!pref.contains(FIRST_TIME_APP_RUN)) { firstTime = true; pref.edit().putBoolean(FIRST_TIME_APP_RUN, true).commit(); pref.edit().putString(VERSION_INSTALLED, Version.getFullVersion(app)).commit(); - - applicationInstalledFirstTime(); - } else { - int i = pref.getInt(TIPS_SHOW, 0); - if (i < 7){ - pref.edit().putInt(TIPS_SHOW, ++i).commit(); - } - boolean appVersionChanged = false; - if(!Version.getFullVersion(app).equals(pref.getString(VERSION_INSTALLED, ""))){ - pref.edit().putString(VERSION_INSTALLED, Version.getFullVersion(app)).commit(); - appVersionChanged = true; - } - - if (i == 1 || i == 5 || appVersionChanged) { - TipsAndTricksActivity tipsActivity = new TipsAndTricksActivity(this); - Dialog dlg = tipsActivity.getDialogToShowTips(!appVersionChanged, false); - dlg.show(); + } else if (!Version.getFullVersion(app).equals(pref.getString(VERSION_INSTALLED, ""))) { + pref.edit().putString(VERSION_INSTALLED, Version.getFullVersion(app)).commit(); + appVersionChanged = true; + } + if (appCustomization.showFirstTimeRunAndTips(firstTime, appVersionChanged)) { + if (firstTime) { + applicationInstalledFirstTime(); + dialogShown = true; } else { - if (startProgressDialog.isShowing()) { - startProgressDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { - @Override - public void onDismiss(DialogInterface dialog) { - checkVectorIndexesDownloaded(); - } - }); - } else { - checkVectorIndexesDownloaded(); + int i = pref.getInt(TIPS_SHOW, 0); + if (i < 7) { + pref.edit().putInt(TIPS_SHOW, ++i).commit(); + } + if (i == 1 || i == 5 || appVersionChanged) { + TipsAndTricksActivity tipsActivity = new TipsAndTricksActivity(this); + Dialog dlg = tipsActivity.getDialogToShowTips(!appVersionChanged, false); + dlg.show(); + dialogShown = true; } } } - checkPreviousRunsForExceptions(firstTime); + if(!dialogShown && appCustomization.checkBasemapDownloadedOnStart()) { + if (startProgressDialog.isShowing()) { + startProgressDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + checkVectorIndexesDownloaded(); + } + }); + } else { + checkVectorIndexesDownloaded(); + } + } + if(appCustomization.checkExceptionsOnStart()){ + checkPreviousRunsForExceptions(firstTime); + } + } + + private void setupCustomization(Intent intent) { + if (intent.hasExtra("SHERPAFY")) { + ((OsmandApplication) getApplication()).setAppCustomization(new SherpafyCustomization()); + } } private void applicationInstalledFirstTime() { diff --git a/OsmAnd/src/net/osmand/plus/api/FileSettingsAPIImpl.java b/OsmAnd/src/net/osmand/plus/api/FileSettingsAPIImpl.java index fe50903186..199ca80285 100644 --- a/OsmAnd/src/net/osmand/plus/api/FileSettingsAPIImpl.java +++ b/OsmAnd/src/net/osmand/plus/api/FileSettingsAPIImpl.java @@ -20,12 +20,14 @@ public class FileSettingsAPIImpl implements SettingsAPI { public FileSettingsAPIImpl(OsmandApplication app, File file) throws IOException { this.file = file; - Properties props = new Properties(); - FileInputStream fis = new FileInputStream(file); - props.load(fis); - for (Object key : props.keySet()) { - String k = key.toString(); - map.put(k, props.get(key)); + if (file.exists()) { + Properties props = new Properties(); + FileInputStream fis = new FileInputStream(file); + props.load(fis); + for (Object key : props.keySet()) { + String k = key.toString(); + map.put(k, props.get(key)); + } } } @@ -95,6 +97,10 @@ public class FileSettingsAPIImpl implements SettingsAPI { map.put(e.getKey(), e.getValue()); } } + return saveFile(); + } + + public boolean saveFile() { try { Properties ps = new Properties(); ps.putAll(map); diff --git a/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java b/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java new file mode 100644 index 0000000000..6134c735d9 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java @@ -0,0 +1,71 @@ +package net.osmand.plus.sherpafy; + +import java.io.File; +import java.io.IOException; + +import net.osmand.plus.OsmAndAppCustomization; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.OsmandSettings; +import net.osmand.plus.OsmandSettings.CommonPreference; +import net.osmand.plus.R; +import net.osmand.plus.Version; +import net.osmand.plus.api.FileSettingsAPIImpl; +import android.view.Window; +import android.widget.TextView; + +public class SherpafyCustomization extends OsmAndAppCustomization { + + private static final String SELECTED_TOUR = "sherpafy_tour"; + private OsmandSettings originalSettings; + private CommonPreference selectedTourPref; + private File selectedTourFolder = null; + + @Override + public void setup(OsmandApplication app) { + super.setup(app); + originalSettings = createSettings(app.getSettings().getSettingsAPI()); + selectedTourPref = originalSettings.registerBooleanPreference(SELECTED_TOUR, null).makeGlobal(); + File toursFolder = new File(originalSettings.getExternalStorageDirectory(), "tours"); + if(selectedTourPref.get() != null) { + selectedTourFolder = new File(toursFolder, selectedTourPref.get()); + selectedTourFolder.mkdirs(); + } + + if(selectedTourFolder != null) { + File settingsFile = new File(selectedTourFolder, "settings.props"); + FileSettingsAPIImpl fapi; + try { + fapi = new FileSettingsAPIImpl(app, settingsFile); + if (!settingsFile.exists()) { + fapi.saveFile(); + } + app.getSettings().setSettingsAPI(fapi); + } catch (IOException e) { + app.showToastMessage(R.string.settings_file_create_error); + } + } + } + + public boolean checkExceptionsOnStart() { + return false; + } + + public boolean showFirstTimeRunAndTips(boolean firstTime, boolean appVersionChanged) { + return false; + } + + public boolean checkBasemapDownloadedOnStart() { + return false; + } + + @Override + public void customizeMainMenu(Window window) { + // Update app name + TextView v = (TextView) window.findViewById(R.id.AppName); + v.setText("Sherpafy " + Version.getAppVersion(app)); + + TextView toursButton = (TextView) window.findViewById(R.id.SettingsButtonText); + toursButton.setText(R.string.tour); + // the image could be updated + } +} diff --git a/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyPlugin.java b/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyPlugin.java deleted file mode 100644 index a09161a3e8..0000000000 --- a/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyPlugin.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.osmand.plus.sherpafy; - -import net.osmand.plus.OsmandApplication; -import net.osmand.plus.OsmandPlugin; -import net.osmand.plus.activities.MapActivity; - -public class SherpafyPlugin extends OsmandPlugin { - - public static final String ID = "osmand.shepafy"; - protected OsmandApplication app; - - @Override - public String getId() { - return ID ; - } - - public SherpafyPlugin(OsmandApplication app) { - this.app = app; - } - - @Override - public String getDescription() { - return "Sherpafy plugin (TODO externalize)"; - } - - @Override - public String getName() { - return "Sherpafy plugin "; - } - - @Override - public boolean init(final OsmandApplication app) { - return true; - } - - @Override - public void disable(OsmandApplication app) { - } - - @Override - public void registerLayers(MapActivity activity) { - } - -} diff --git a/plugins/Osmand-Sherpafy/AndroidManifest.xml b/plugins/Osmand-Sherpafy/AndroidManifest.xml index 3a2a3ff669..eeeea53793 100644 --- a/plugins/Osmand-Sherpafy/AndroidManifest.xml +++ b/plugins/Osmand-Sherpafy/AndroidManifest.xml @@ -14,12 +14,10 @@ - diff --git a/plugins/Osmand-Sherpafy/src/net/osmand/sherpafy/SherpafyPluginActivity.java b/plugins/Osmand-Sherpafy/src/net/osmand/sherpafy/SherpafyPluginActivity.java index 48ed70f7ac..a35c267b2f 100644 --- a/plugins/Osmand-Sherpafy/src/net/osmand/sherpafy/SherpafyPluginActivity.java +++ b/plugins/Osmand-Sherpafy/src/net/osmand/sherpafy/SherpafyPluginActivity.java @@ -28,7 +28,9 @@ public class SherpafyPluginActivity extends Activity { ResolveInfo resolved = getPackageManager().resolveActivity(intentPlus, PackageManager.MATCH_DEFAULT_ONLY); if(resolved != null) { stopService(intentPlus); + intentPlus.putExtra("SHERPAFY", true); startActivity(intentPlus); + finish(); } else { Intent intentNormal = new Intent(); intentNormal.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); @@ -36,7 +38,9 @@ public class SherpafyPluginActivity extends Activity { resolved = getPackageManager().resolveActivity(intentNormal, PackageManager.MATCH_DEFAULT_ONLY); if (resolved != null) { stopService(intentNormal); + intentNormal.putExtra("SHERPAFY", true); startActivity(intentNormal); + finish(); } else { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(getString(R.string.osmand_app_not_found)); From c6911d3eb8fb6ca8a71df043e6d89b8e800d5e5b Mon Sep 17 00:00:00 2001 From: vshcherb Date: Wed, 16 Apr 2014 20:26:48 +0200 Subject: [PATCH 18/29] Update sherpafy customization --- OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java b/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java index 6134c735d9..e51a0cd6b6 100644 --- a/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java +++ b/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java @@ -62,7 +62,7 @@ public class SherpafyCustomization extends OsmAndAppCustomization { public void customizeMainMenu(Window window) { // Update app name TextView v = (TextView) window.findViewById(R.id.AppName); - v.setText("Sherpafy " + Version.getAppVersion(app)); + v.setText("Sherpafy"); TextView toursButton = (TextView) window.findViewById(R.id.SettingsButtonText); toursButton.setText(R.string.tour); From 2f3cee4d50d533af61d980aecd42b6c1b4c4ab15 Mon Sep 17 00:00:00 2001 From: vshcherb Date: Wed, 16 Apr 2014 23:55:22 +0200 Subject: [PATCH 19/29] Add customization point / remove intents class --- .../net/osmand/binary/BinaryInspector.java | 4 +- OsmAnd/res/layout-land/menu.xml | 4 ++ OsmAnd/res/layout-large-land/menu.xml | 4 ++ OsmAnd/res/layout-large/menu.xml | 7 ++- .../osmand/plus/OsmAndAppCustomization.java | 46 ++++++++++++++++++- .../net/osmand/plus/OsmandApplication.java | 6 +-- .../plus/activities/LocalIndexesActivity.java | 2 - .../plus/activities/MainMenuActivity.java | 25 +++++----- .../osmand/plus/activities/MapActivity.java | 7 ++- .../plus/activities/MapActivityActions.java | 10 ++-- .../osmand/plus/activities/OsmandIntents.java | 40 ---------------- .../plus/activities/SettingsActivity.java | 6 +-- .../plus/sherpafy/SherpafyCustomization.java | 27 +++++++++-- .../plus/views/DownloadedRegionsLayer.java | 3 +- 14 files changed, 110 insertions(+), 81 deletions(-) delete mode 100644 OsmAnd/src/net/osmand/plus/activities/OsmandIntents.java diff --git a/OsmAnd-java/src/net/osmand/binary/BinaryInspector.java b/OsmAnd-java/src/net/osmand/binary/BinaryInspector.java index 90bc223619..cb427c1cb0 100644 --- a/OsmAnd-java/src/net/osmand/binary/BinaryInspector.java +++ b/OsmAnd-java/src/net/osmand/binary/BinaryInspector.java @@ -13,6 +13,7 @@ import java.io.IOException; import java.io.RandomAccessFile; import java.text.MessageFormat; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; @@ -62,6 +63,7 @@ public class BinaryInspector { //"-zoom=16", //"-bbox=4,55,7,50", //"/home/victor/projects/osmand/osm-gen/Map.obf" + // "/home/victor/projects/osmand/osm-gen/Russia_bashkiria_asia_2.obf" }); } else { in.inspector(args); @@ -422,7 +424,7 @@ public class BinaryInspector { try { BinaryMapIndexReader index = new BinaryMapIndexReader(r); int i = 1; - println("Binary index " + filename + " version = " + index.getVersion()); + println("Binary index " + filename + " version = " + index.getVersion() +" edition = " + new Date(index.getDateCreated())); for(BinaryIndexPart p : index.getIndexes()){ String partname = ""; if(p instanceof MapIndex ){ diff --git a/OsmAnd/res/layout-land/menu.xml b/OsmAnd/res/layout-land/menu.xml index d0a4c14f3a..6cff01c1db 100644 --- a/OsmAnd/res/layout-land/menu.xml +++ b/OsmAnd/res/layout-land/menu.xml @@ -60,10 +60,12 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:b - @@ -66,11 +68,12 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:b - diff --git a/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java b/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java index 195a7e5acd..58dfe77a1e 100644 --- a/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java +++ b/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java @@ -1,6 +1,15 @@ package net.osmand.plus; +import android.app.Activity; import android.view.Window; +import net.osmand.plus.activities.DownloadIndexActivity; +import net.osmand.plus.activities.FavouritesActivity; +import net.osmand.plus.activities.LocalIndexesActivity; +import net.osmand.plus.activities.MainMenuActivity; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.activities.PluginsActivity; +import net.osmand.plus.activities.SettingsActivity; +import net.osmand.plus.activities.search.SearchActivity; import net.osmand.plus.api.SettingsAPI; public class OsmAndAppCustomization { @@ -27,6 +36,41 @@ public class OsmAndAppCustomization { return true; } - public void customizeMainMenu(Window window) { + public void customizeMainMenu(Window window, Activity activity) { } + + + + public Class getSettingsActivity(){ + return SettingsActivity.class; + } + + public Class getMapActivity(){ + return MapActivity.class; + } + + public Class getSearchActivity(){ + return SearchActivity.class; + } + + public Class getFavoritesActivity(){ + return FavouritesActivity.class; + } + + public Class getMainMenuActivity() { + return MainMenuActivity.class; + } + + public Class getDownloadIndexActivity() { + return DownloadIndexActivity.class; + } + + public Class getPluginsActivity() { + return PluginsActivity.class; + } + + public Class getLocalIndexActivity() { + return LocalIndexesActivity.class; + } + } diff --git a/OsmAnd/src/net/osmand/plus/OsmandApplication.java b/OsmAnd/src/net/osmand/plus/OsmandApplication.java index 7e0f97be46..993c269145 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandApplication.java +++ b/OsmAnd/src/net/osmand/plus/OsmandApplication.java @@ -23,13 +23,10 @@ import net.osmand.plus.GPXUtilities.WptPt; import net.osmand.plus.access.AccessibilityMode; import net.osmand.plus.activities.DayNightHelper; import net.osmand.plus.activities.LiveMonitoringHelper; -import net.osmand.plus.activities.OsmandIntents; import net.osmand.plus.activities.SavingTrackHelper; import net.osmand.plus.activities.SettingsActivity; import net.osmand.plus.api.SQLiteAPI; import net.osmand.plus.api.SQLiteAPIImpl; -import net.osmand.plus.api.SettingsAPI; -import net.osmand.plus.api.SettingsAPIImpl; import net.osmand.plus.render.NativeOsmandLibrary; import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.resources.ResourceManager; @@ -635,7 +632,8 @@ public class OsmandApplication extends Application { public DefaultExceptionHandler() { defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); intent = PendingIntent.getActivity(OsmandApplication.this.getBaseContext(), 0, - new Intent(OsmandApplication.this.getBaseContext(), OsmandIntents.getMainMenuActivity()), 0); + new Intent(OsmandApplication.this.getBaseContext(), + getAppCustomization().getMainMenuActivity()), 0); } @Override diff --git a/OsmAnd/src/net/osmand/plus/activities/LocalIndexesActivity.java b/OsmAnd/src/net/osmand/plus/activities/LocalIndexesActivity.java index 60b5043279..96d190c5df 100644 --- a/OsmAnd/src/net/osmand/plus/activities/LocalIndexesActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/LocalIndexesActivity.java @@ -129,8 +129,6 @@ public class LocalIndexesActivity extends OsmandExpandableListActivity { } - - private void showContextMenu(final LocalIndexInfo info) { Builder builder = new AlertDialog.Builder(this); final ContextMenuAdapter adapter = new ContextMenuAdapter(this); diff --git a/OsmAnd/src/net/osmand/plus/activities/MainMenuActivity.java b/OsmAnd/src/net/osmand/plus/activities/MainMenuActivity.java index 16dc2500a3..90aa5b9b36 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MainMenuActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MainMenuActivity.java @@ -200,7 +200,7 @@ public class MainMenuActivity extends Activity { requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.menu); - OsmAndAppCustomization appCustomization = getMyApplication().getAppCustomization(); + final OsmAndAppCustomization appCustomization = getMyApplication().getAppCustomization(); onCreateMainMenu(getWindow(), this); @@ -210,7 +210,7 @@ public class MainMenuActivity extends Activity { showMap.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - final Intent mapIndent = new Intent(activity, OsmandIntents.getMapActivity()); + final Intent mapIndent = new Intent(activity, appCustomization.getMapActivity()); activity.startActivityForResult(mapIndent, 0); } }); @@ -218,7 +218,7 @@ public class MainMenuActivity extends Activity { settingsButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - final Intent settings = new Intent(activity, OsmandIntents.getSettingsActivity()); + final Intent settings = new Intent(activity, appCustomization.getSettingsActivity()); activity.startActivity(settings); } }); @@ -227,7 +227,7 @@ public class MainMenuActivity extends Activity { favouritesButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - final Intent favorites = new Intent(activity, OsmandIntents.getFavoritesActivity()); + final Intent favorites = new Intent(activity, appCustomization.getFavoritesActivity()); favorites.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); activity.startActivity(favorites); } @@ -244,12 +244,12 @@ public class MainMenuActivity extends Activity { searchButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - final Intent search = new Intent(activity, OsmandIntents.getSearchActivity()); + final Intent search = new Intent(activity, appCustomization.getSearchActivity()); search.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); activity.startActivity(search); } }); - appCustomization.customizeMainMenu(window); + appCustomization.customizeMainMenu(window, this); if(exit){ getMyApplication().closeApplication(activity); return; @@ -257,7 +257,7 @@ public class MainMenuActivity extends Activity { OsmandApplication app = getMyApplication(); // restore follow route mode if(app.getSettings().FOLLOW_THE_ROUTE.get() && !app.getRoutingHelper().isRouteCalculated()){ - final Intent mapIndent = new Intent(this, OsmandIntents.getMapActivity()); + final Intent mapIndent = new Intent(this, appCustomization.getMapActivity()); startActivityForResult(mapIndent, 0); return; } @@ -336,7 +336,7 @@ public class MainMenuActivity extends Activity { @Override public void onClick(DialogInterface dialog, int which) { - startActivity(new Intent(MainMenuActivity.this, OsmandIntents.getDownloadIndexActivity())); + startActivity(new Intent(MainMenuActivity.this, getMyApplication().getAppCustomization().getDownloadIndexActivity())); } }); @@ -409,6 +409,7 @@ public class MainMenuActivity extends Activity { final View menuView = (View) a.getLayoutInflater().inflate(R.layout.menu, null); menuView.setBackgroundColor(Color.argb(200, 150, 150, 150)); dlg.setContentView(menuView); + final OsmAndAppCustomization appCustomization = ((OsmandApplication) a.getApplication()).getAppCustomization(); MainMenuActivity.onCreateMainMenu(dlg.getWindow(), a); Animation anim = new Animation() { @Override @@ -432,7 +433,7 @@ public class MainMenuActivity extends Activity { settingsButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - final Intent settings = new Intent(a, OsmandIntents.getSettingsActivity()); + final Intent settings = new Intent(a, appCustomization.getSettingsActivity()); a.startActivity(settings); dlg.dismiss(); } @@ -442,7 +443,7 @@ public class MainMenuActivity extends Activity { favouritesButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - final Intent favorites = new Intent(a, OsmandIntents.getFavoritesActivity()); + final Intent favorites = new Intent(a, appCustomization.getFavoritesActivity()); favorites.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); a.startActivity(favorites); dlg.dismiss(); @@ -455,7 +456,7 @@ public class MainMenuActivity extends Activity { public void onClick(View v) { dlg.dismiss(); // 1. Work for almost all cases when user open apps from main menu - Intent newIntent = new Intent(a, OsmandIntents.getMainMenuActivity()); + Intent newIntent = new Intent(a, appCustomization.getMainMenuActivity()); newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); newIntent.putExtra(MainMenuActivity.APP_EXIT_KEY, MainMenuActivity.APP_EXIT_CODE); a.startActivity(newIntent); @@ -472,7 +473,7 @@ public class MainMenuActivity extends Activity { searchButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - final Intent search = new Intent(a, OsmandIntents.getSearchActivity()); + final Intent search = new Intent(a, appCustomization.getSearchActivity()); LatLon loc = searchLocation; search.putExtra(SearchActivity.SEARCH_LAT, loc.getLatitude()); search.putExtra(SearchActivity.SEARCH_LON, loc.getLongitude()); diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 1f20532c3e..3e5b0dd727 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -32,7 +32,6 @@ import net.osmand.plus.base.FailSafeFuntions; import net.osmand.plus.base.MapViewTrackingUtilities; import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.resources.ResourceManager; -import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.routing.RoutingHelper.RouteCalculationProgressCallback; import net.osmand.plus.views.AnimateDraggingMapThread; @@ -98,7 +97,7 @@ public class MapActivity extends AccessibleActivity { private Notification getNotification() { - Intent notificationIndent = new Intent(this, OsmandIntents.getMapActivity()); + Intent notificationIndent = new Intent(this, getMyApplication().getAppCustomization().getMapActivity()); notificationIndent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); Notification notification = new Notification(R.drawable.icon, "", //$NON-NLS-1$ System.currentTimeMillis()); @@ -392,7 +391,7 @@ public class MapActivity extends AccessibleActivity { mapActions.openOptionsMenuAsList(); return true; } else if (keyCode == KeyEvent.KEYCODE_SEARCH && event.getRepeatCount() == 0) { - Intent newIntent = new Intent(MapActivity.this, OsmandIntents.getSearchActivity()); + Intent newIntent = new Intent(MapActivity.this, getMyApplication().getAppCustomization().getSearchActivity()); // causes wrong position caching: newIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); LatLon loc = getMapLocation(); newIntent.putExtra(SearchActivity.SEARCH_LAT, loc.getLatitude()); @@ -653,7 +652,7 @@ public class MapActivity extends AccessibleActivity { public static void launchMapActivityMoveToTop(Context activity){ - Intent newIntent = new Intent(activity, OsmandIntents.getMapActivity()); + Intent newIntent = new Intent(activity, ((OsmandApplication) activity.getApplicationContext()).getAppCustomization().getMapActivity()); newIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); activity.startActivity(newIntent); } diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java index 9640a43505..21469c6dfa 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java @@ -416,7 +416,7 @@ public class MapActivityActions implements DialogProvider { if (click != null) { click.onContextMenuClick(standardId, which, false, dialog); } else if (standardId == R.string.context_menu_item_search) { - Intent intent = new Intent(mapActivity, OsmandIntents.getSearchActivity()); + Intent intent = new Intent(mapActivity, mapActivity.getMyApplication().getAppCustomization().getSearchActivity()); intent.putExtra(SearchActivity.SEARCH_LAT, latitude); intent.putExtra(SearchActivity.SEARCH_LON, longitude); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); @@ -731,7 +731,7 @@ public class MapActivityActions implements DialogProvider { .listen(new OnContextMenuClick() { @Override public void onContextMenuClick(int itemId, int pos, boolean isChecked, DialogInterface dialog) { - final Intent intentSettings = new Intent(mapActivity, OsmandIntents.getSettingsActivity()); + final Intent intentSettings = new Intent(mapActivity, mapActivity.getMyApplication().getAppCustomization().getSettingsActivity()); mapActivity.startActivity(intentSettings); } }).reg(); @@ -740,7 +740,7 @@ public class MapActivityActions implements DialogProvider { .listen(new OnContextMenuClick() { @Override public void onContextMenuClick(int itemId, int pos, boolean isChecked, DialogInterface dialog) { - Intent newIntent = new Intent(mapActivity, OsmandIntents.getSearchActivity()); + Intent newIntent = new Intent(mapActivity, mapActivity.getMyApplication().getAppCustomization().getSearchActivity()); // causes wrong position caching: newIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); LatLon loc = mapActivity.getMapLocation(); newIntent.putExtra(SearchActivity.SEARCH_LAT, loc.getLatitude()); @@ -754,7 +754,7 @@ public class MapActivityActions implements DialogProvider { .listen(new OnContextMenuClick() { @Override public void onContextMenuClick(int itemId, int pos, boolean isChecked, DialogInterface dialog) { - Intent newIntent = new Intent(mapActivity, OsmandIntents.getFavoritesActivity()); + Intent newIntent = new Intent(mapActivity, mapActivity.getMyApplication().getAppCustomization().getFavoritesActivity()); // causes wrong position caching: newIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); mapActivity.startActivity(newIntent); } @@ -811,7 +811,7 @@ public class MapActivityActions implements DialogProvider { @Override public void onContextMenuClick(int itemId, int pos, boolean isChecked, DialogInterface dialog) { // 1. Work for almost all cases when user open apps from main menu - Intent newIntent = new Intent(mapActivity, OsmandIntents.getMainMenuActivity()); + Intent newIntent = new Intent(mapActivity, mapActivity.getMyApplication().getAppCustomization().getMainMenuActivity()); newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); newIntent.putExtra(MainMenuActivity.APP_EXIT_KEY, MainMenuActivity.APP_EXIT_CODE); mapActivity.startActivity(newIntent); diff --git a/OsmAnd/src/net/osmand/plus/activities/OsmandIntents.java b/OsmAnd/src/net/osmand/plus/activities/OsmandIntents.java deleted file mode 100644 index 2570023d41..0000000000 --- a/OsmAnd/src/net/osmand/plus/activities/OsmandIntents.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.osmand.plus.activities; - -import net.osmand.plus.activities.search.SearchActivity; -import android.app.Activity; - -public class OsmandIntents { - - public static Class getSettingsActivity(){ - return SettingsActivity.class; - } - - public static Class getMapActivity(){ - return MapActivity.class; - } - - public static Class getSearchActivity(){ - return SearchActivity.class; - } - - public static Class getFavoritesActivity(){ - return FavouritesActivity.class; - } - - public static Class getMainMenuActivity() { - return MainMenuActivity.class; - } - - public static Class getDownloadIndexActivity() { - return DownloadIndexActivity.class; - } - - public static Class getPluginsActivity() { - return PluginsActivity.class; - } - - public static Class getLocalIndexActivity() { - return LocalIndexesActivity.class; - } - -} diff --git a/OsmAnd/src/net/osmand/plus/activities/SettingsActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsActivity.java index cef4b0611c..afa3dd6d1c 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsActivity.java @@ -99,9 +99,9 @@ public class SettingsActivity extends SettingsBaseActivity { } } if (empty) { - startActivity(new Intent(this, OsmandIntents.getDownloadIndexActivity())); + startActivity(new Intent(this, getMyApplication().getAppCustomization().getDownloadIndexActivity())); } else { - startActivity(new Intent(this, OsmandIntents.getLocalIndexActivity())); + startActivity(new Intent(this, getMyApplication().getAppCustomization().getLocalIndexActivity())); } return true; } else if (preference == bidforfix) { @@ -116,7 +116,7 @@ public class SettingsActivity extends SettingsBaseActivity { showAboutDialog(); return true; } else if (preference == plugins) { - startActivityForResult(new Intent(this, OsmandIntents.getPluginsActivity()), PLUGINS_SELECTION_REQUEST); + startActivityForResult(new Intent(this, getMyApplication().getAppCustomization().getPluginsActivity()), PLUGINS_SELECTION_REQUEST); return true; } else { super.onPreferenceClick(preference); diff --git a/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java b/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java index e51a0cd6b6..d0aa08a08c 100644 --- a/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java +++ b/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java @@ -8,8 +8,12 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.OsmandSettings.CommonPreference; import net.osmand.plus.R; -import net.osmand.plus.Version; +import net.osmand.plus.activities.MainMenuActivity; import net.osmand.plus.api.FileSettingsAPIImpl; +import android.app.Activity; +import android.content.Intent; +import android.view.View; +import android.view.View.OnClickListener; import android.view.Window; import android.widget.TextView; @@ -59,13 +63,26 @@ public class SherpafyCustomization extends OsmAndAppCustomization { } @Override - public void customizeMainMenu(Window window) { + public void customizeMainMenu(Window window, final Activity activity) { // Update app name TextView v = (TextView) window.findViewById(R.id.AppName); v.setText("Sherpafy"); - TextView toursButton = (TextView) window.findViewById(R.id.SettingsButtonText); - toursButton.setText(R.string.tour); - // the image could be updated + TextView toursButtonText = (TextView) window.findViewById(R.id.SettingsButtonText); + toursButtonText.setText(R.string.tour); + View toursButton = window.findViewById(R.id.SearchButton); + toursButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + final Intent search = new Intent(activity, getTourSelectionActivity()); + search.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + activity.startActivity(search); + } + }); + // the image could be also updated + } + + private Class getTourSelectionActivity() { + return MainMenuActivity.class; } } diff --git a/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java b/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java index 3a7cdc6fd0..6f471e2a7d 100644 --- a/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java @@ -13,7 +13,6 @@ import net.osmand.data.RotatedTileBox; import net.osmand.map.OsmandRegions; import net.osmand.plus.R; import net.osmand.plus.activities.DownloadIndexActivity; -import net.osmand.plus.activities.OsmandIntents; import net.osmand.plus.resources.ResourceManager; import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; @@ -87,7 +86,7 @@ public class DownloadedRegionsLayer extends OsmandMapLayer { downloadBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - final Intent intent = new Intent(view.getContext(), OsmandIntents.getDownloadIndexActivity()); + final Intent intent = new Intent(view.getContext(), view.getApplication().getAppCustomization().getDownloadIndexActivity()); intent.putExtra(DownloadIndexActivity.FILTER_KEY, filter.toString()); view.getContext().startActivity(intent); } From 4d00c93c5580a9c0d26836609ad194be90dbc866 Mon Sep 17 00:00:00 2001 From: vshcherb Date: Thu, 17 Apr 2014 00:08:04 +0200 Subject: [PATCH 20/29] Update constants --- OsmAnd-java/src/net/osmand/IndexConstants.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd-java/src/net/osmand/IndexConstants.java b/OsmAnd-java/src/net/osmand/IndexConstants.java index eb6c45b48e..a4edb1cc66 100644 --- a/OsmAnd-java/src/net/osmand/IndexConstants.java +++ b/OsmAnd-java/src/net/osmand/IndexConstants.java @@ -14,6 +14,7 @@ public class IndexConstants { public static final String BINARY_MAP_INDEX_EXT = ".obf"; //$NON-NLS-1$ public static final String BINARY_SRTM_MAP_INDEX_EXT = ".srtm.obf"; //$NON-NLS-1$ public static final String BINARY_SRTM_MAP_INDEX_EXT_ZIP = ".srtm.obf.zip"; //$NON-NLS-1$ + public static final String TOUR_INDEX_EXT = ".tour"; //$NON-NLS-1$ public static final String GEN_LOG_EXT = ".gen.log"; //$NON-NLS-1$ @@ -22,6 +23,7 @@ public class IndexConstants { public static final String TTSVOICE_INDEX_EXT_ZIP = ".ttsvoice.zip"; //$NON-NLS-1$ public static final String ANYVOICE_INDEX_EXT_ZIP = "voice.zip"; //$NON-NLS-1$ //to cactch both voices, .voice.zip and .ttsvoice.zip public static final String BINARY_MAP_INDEX_EXT_ZIP = ".obf.zip"; //$NON-NLS-1$ + public static final String TOUR_INDEX_EXT_ZIP = ".tour.zip"; //$NON-NLS-1$ public static final String EXTRA_ZIP_EXT = ".extra.zip"; public static final String EXTRA_EXT = ".extra"; From c129db64e6752e31d3f4bec7019fd2136ab035f4 Mon Sep 17 00:00:00 2001 From: Andy Joiner Date: Thu, 17 Apr 2014 16:14:33 +0100 Subject: [PATCH 21/29] Fix issue: https://code.google.com/p/osmand/issues/detail?id=2165 e.g. The following URL failed with "error occurred in offline search": http://maps.google.com/?daddr=51.584857,-4.1089541 --- .../plus/activities/search/GeoIntentActivity.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/activities/search/GeoIntentActivity.java b/OsmAnd/src/net/osmand/plus/activities/search/GeoIntentActivity.java index f99a4079e7..e87dd92feb 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/GeoIntentActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/GeoIntentActivity.java @@ -200,10 +200,14 @@ public class GeoIntentActivity extends OsmandListActivity { */ private MyService extract(Uri data) { if ("http".equalsIgnoreCase(data.getScheme()) && "maps.google.com".equals(data.getHost())) { - String q = data.getQueryParameter("q").split(" ")[0]; - if (q.indexOf(',') == -1) { - q = data.getQueryParameter("daddr").split(" ")[0]; - } + String q = null; + String parameter = data.getQueryParameter("q"); + if (parameter == null) { + parameter = data.getQueryParameter("daddr"); + } + if(parameter != null) { + q = parameter.split(" ")[0]; + } if (q.indexOf(',') != -1) { int i = q.indexOf(','); String lat = q.substring(0, i); From acb06db0c708e71d29bc7e8741f88f5a78b5a9ac Mon Sep 17 00:00:00 2001 From: Andy Joiner Date: Thu, 17 Apr 2014 16:22:23 +0100 Subject: [PATCH 22/29] Fixed bad whitespace. --- .../net/osmand/plus/activities/search/GeoIntentActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/activities/search/GeoIntentActivity.java b/OsmAnd/src/net/osmand/plus/activities/search/GeoIntentActivity.java index e87dd92feb..b422525623 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/GeoIntentActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/GeoIntentActivity.java @@ -204,7 +204,7 @@ public class GeoIntentActivity extends OsmandListActivity { String parameter = data.getQueryParameter("q"); if (parameter == null) { parameter = data.getQueryParameter("daddr"); - } + } if(parameter != null) { q = parameter.split(" ")[0]; } From 708685128a8e0771d00422878b51a21eee56e265 Mon Sep 17 00:00:00 2001 From: sonora Date: Fri, 18 Apr 2014 11:35:34 +0200 Subject: [PATCH 23/29] add backed-up indication for hillshade and srtm files to new download screen --- .../src/net/osmand/plus/download/DownloadIndexAdapter.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java index d95388aff5..c19561ba64 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java @@ -262,7 +262,12 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem if(e.getType() == DownloadActivityType.HILLSHADE_FILE || e.getType() == DownloadActivityType.SRTM_COUNTRY_FILE){ item.setTextColor(okColor); // GREEN - item.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); + String sfName = e.getTargetFileName(); + if (indexActivatedFileNames.containsKey(sfName)) { + item.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); + } else + item.setTypeface(Typeface.DEFAULT, Typeface.ITALIC); + } } else if (e.getDate() != null) { String sfName = e.getTargetFileName(); if (e.getDate().equals(indexActivatedFileNames.get(sfName))) { From 8281c690bf4553954b6a62cbc0d5f8047389e3ed Mon Sep 17 00:00:00 2001 From: sonora Date: Fri, 18 Apr 2014 11:48:10 +0200 Subject: [PATCH 24/29] fix typo --- OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java index c19561ba64..d21f97a9dd 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java @@ -265,7 +265,7 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem String sfName = e.getTargetFileName(); if (indexActivatedFileNames.containsKey(sfName)) { item.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); - } else + } else { item.setTypeface(Typeface.DEFAULT, Typeface.ITALIC); } } else if (e.getDate() != null) { From 78055e49d3c4146d6ec0c0436515703bc899bf9a Mon Sep 17 00:00:00 2001 From: sonora Date: Fri, 18 Apr 2014 12:03:02 +0200 Subject: [PATCH 25/29] reverse logic as we currently do not index hillshade files in backup folder --- .../src/net/osmand/plus/download/DownloadIndexAdapter.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java index d21f97a9dd..d4d5f3903d 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java @@ -263,10 +263,10 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem || e.getType() == DownloadActivityType.SRTM_COUNTRY_FILE){ item.setTextColor(okColor); // GREEN String sfName = e.getTargetFileName(); - if (indexActivatedFileNames.containsKey(sfName)) { - item.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); - } else { + if (!indexActivatedFileNames.containsKey(sfName)) { item.setTypeface(Typeface.DEFAULT, Typeface.ITALIC); + } else { + item.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); } } else if (e.getDate() != null) { String sfName = e.getTargetFileName(); From 98a7ff9c7e2615ee0354671c27affb6b72ab6157 Mon Sep 17 00:00:00 2001 From: sonora Date: Fri, 18 Apr 2014 13:56:58 +0200 Subject: [PATCH 26/29] use regular order like in other cases, we do not activate/de-activate hillshade files at all for now --- .../src/net/osmand/plus/download/DownloadIndexAdapter.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java index d4d5f3903d..d21f97a9dd 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java @@ -263,10 +263,10 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem || e.getType() == DownloadActivityType.SRTM_COUNTRY_FILE){ item.setTextColor(okColor); // GREEN String sfName = e.getTargetFileName(); - if (!indexActivatedFileNames.containsKey(sfName)) { - item.setTypeface(Typeface.DEFAULT, Typeface.ITALIC); - } else { + if (indexActivatedFileNames.containsKey(sfName)) { item.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); + } else { + item.setTypeface(Typeface.DEFAULT, Typeface.ITALIC); } } else if (e.getDate() != null) { String sfName = e.getTargetFileName(); From 877e7a93f66a777a1fa24726dc56182aeea5dec7 Mon Sep 17 00:00:00 2001 From: sonora Date: Sun, 20 Apr 2014 18:32:38 +0200 Subject: [PATCH 27/29] make hillshade files always appear in normal typeface, as they cannot be deactivated, but are not in indexActivatedFilesNames --- OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java index d21f97a9dd..007f1423b6 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexAdapter.java @@ -265,6 +265,9 @@ public class DownloadIndexAdapter extends OsmandBaseExpandableListAdapter implem String sfName = e.getTargetFileName(); if (indexActivatedFileNames.containsKey(sfName)) { item.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); + // next case since present hillshade files cannot be deactivated, but are not in indexActivatedFileNames + } else if (e.getType() == DownloadActivityType.HILLSHADE_FILE) { + item.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); } else { item.setTypeface(Typeface.DEFAULT, Typeface.ITALIC); } From 859783a864fd09aa99a482bf692e202558b45c07 Mon Sep 17 00:00:00 2001 From: GiZig Date: Tue, 22 Apr 2014 03:25:19 +0200 Subject: [PATCH 28/29] Update strings.xml --- OsmAnd/res/values-fr/strings.xml | 125 ++++++++++++++++++++++--------- 1 file changed, 88 insertions(+), 37 deletions(-) diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 57d896d26a..15a4ea8a63 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -84,7 +84,7 @@ \n\tPour ajouter un nouveau PI, utiliser l\'option \'Créer un point d\'intérêt\' dans le menu contextuel de la carte. Saisir les informations dans la boite de dialogue \'Créer un point d\'intérêt\' avant d\'enregistrer. \n\tLes erreurs de cartographie peuvent être signalées immédiatement via les bogues OSM, permettant à la communauté OSM de corriger plus rapidement le problème. \n\tPour créer un bogue OSM utiliser l\'option \'Ouvrir un bogue OSM\' dans le menu contextuel de la carte. Saisir une description détaillée du problème et le poster avec le bouton \'Ajouter\'. -\n\tOSMAnd supporte la mise en cache de vos entrées en mode déconnecté (voir le paramètre correspondant), mais una connexion internet est bien sûr nécessaire pour l\'envoi des contributions de PI et de bogues OSM. +\n\tOsmAnd supporte la mise en cache de vos entrées en mode déconnecté (voir le paramètre correspondant), mais une connexion internet est bien sûr nécessaire pour l\'envoi des contributions de PI et de bogues OSM. Il n\'y a pas assez de place pour télécharger %1$s MB (disponible: %2$s). Espace actuellement disponible: {2} MB ! Télécharger {0} fichier(s) ({1} MB) ? @@ -174,8 +174,8 @@ Afficher plus de détails Afficher plus de détails sur les cartes vectorielles (routes etc.) aux niveaux de zooms inférieurs Favoris correctement supprimés. - Vous allez supprimer %1$d favoris et %2$d groupes de favoris. Êtes vous sûr ? - Maison + Vous allez supprimer %1$d favoris et %2$d groupes de favoris. Êtes-vous sûr ? + Domicile Amis Lieux Autres @@ -261,10 +261,10 @@ Connexion Internet nécessaire pour cette opération non disponible Installer plus… Mise à jour des cartes hors-ligne - Il est très important d\'avoir des données cartographiques à jour, pour la visualisation des cartes hors-ligne, pour la recherche de points d\'intérêt ou d\'adresses, et pour la navigation hors-ligne. OsmAnd fournit un gestionnaire de données qui permet de télécharger ces cartes hors-ligne (et d\'autres données), et de vérifier si des mises à jour sont disponibles. - \n\nPour télécharger ou vérifier les mises à jour, allez à \'Menu Principal\' → \'Paramètres\' → \'Données hors-ligne\' → \'Télécharger des données hors-ligne\'. - \n\nUne fois la liste des régions établie à partir d\'internet, sélectionnez le fichier à télécharger ou mettre à jour. Un menu en haut de l\'écran vous permet de sélectionner le type de données recherché (cartes standards, courbes de niveau, etc.). - \n\nL\'option \'Cartes téléchargées\' dans le menu contextuel à droite de l\'écran permet de n\'afficher que les cartes déjà téléchargées sur votre système, avec les couleurs ou polices suivantes : + \tIl est très important d\'avoir des données cartographiques à jour pour la visualisation des cartes hors-ligne, la recherche de points d\'intérêt ou d\'adresses, et la navigation hors-ligne. OsmAnd fournit un gestionnaire de données qui permet de télécharger ces cartes hors-ligne (et d\'autres données), et de vérifier si des mises à jour sont disponibles. + \n\tPour télécharger ou vérifier les mises à jour, allez dans \'Menu Principal\' → \'Paramètres\' → \'Données hors-ligne\' → \'Télécharger des données hors-ligne\'. + \n\tUne fois la liste des régions établie à partir d\'internet, sélectionnez le fichier à télécharger ou mettre à jour. Un menu en haut de l\'écran vous permet de sélectionner le type de données recherché (cartes standards, courbes de niveau, etc.). + \n\tL\'option \'Cartes téléchargées\' dans le menu contextuel à droite de l\'écran permet de n\'afficher que les cartes déjà téléchargées sur votre système, avec les couleurs ou polices suivantes : \n\n\'Vert\' - pour les cartes à jour avec le serveur \n\n\'Bleu\' - pour les cartes qui peuvent être mises à jour depuis le serveur \n\n\'Italique\' - pour les cartes désactivées sur l\'appareil @@ -272,16 +272,16 @@ Niveau de zoom maximum pour l\'utilisation des cartes vectorielles au lieu des tuiles de carte Niveau de zoom vectoriel Partage d\'emplacement - Vous notez un point d\'intérêt pendant votre voyage que vous voulez partager avec des amis ou de la famille ? -\nOsmAnd vous permet de facilement partager un lieu. -\n\tVous pouvez aller dans \'Menu contextuel de la carte\'->\'Partager un lieu\'. + \tPendant votre voyage, vous notez un point d\'intérêt que vous voulez partager avec des amis ou de la famille ? +\n\tOsmAnd vous permet de facilement partager un lieu. +\n\tAllez dans \'Menu contextuel de la carte\' → \'Partager le lieu\'. \nSélectionnez alors le mode de partage parmi : courriel, SMS, ou copie vers le presse-papier. Lieux favoris - "Les points utilisés fréquemment peuvent être enregistrés en tant que favoris. -\n\tPour créer un favori, allez dans le menu contextuel de la carte, sélectionnez l\'option \'Ajouter aux favoris\' et saisissez un nom adapté. Après enregistrement, ce lieu est facilement accessible par \'Menu\' → \'Favoris\'. + "\tLes points utilisés fréquemment peuvent être enregistrés en tant que favoris. +\n\tPour créer un favori, allez dans le menu contextuel de la carte, sélectionnez l\'option \'Ajouter aux favoris\' et saisissez un nom adapté. Après enregistrement, ce lieu est facilement accessible dans \'Menu\' → \'Favoris\'. \n\tUn appui court sur un favori dans le menu \'Favoris\' permet de créer un itinéraire pour s\'y rendre. -\n\tPour afficher tous les favoris sur la carte, activer la couche \'Favoris\' dans \'Menu\' → \'Couches\'. " +\n\tPour afficher tous les favoris sur la carte, activez la couche \'Favoris\' dans \'Menu\' → \'Couches\'. " OSM en ligne classification des cartes en images Une erreur est survenue lors de la recherche hors-ligne Ne peut interpréter le geo intent:\'%s\' @@ -294,23 +294,23 @@ Mode de fonctionnement Navigation - La navigation vers un point peut être lancée soit directement par un appui long à son emplacement sur la carte (un appui court sur la bulle apparue ouvre alors le menu contextuel avec le choix \'Aller vers le point\'), soit par un appui court sur un favori ou un résultat de recherche (en choisissant alors \'Navigation\'). - \n\nLa destination est alors indiquée par un point orange et un drapeau à damier. OsmAnd affiche la distance qui vous en sépare, et sa direction (par une flèche orange). + \tLa navigation vers un point peut être lancée soit directement par un appui long à son emplacement sur la carte (une bulle apparaît alors, sur laquelle un appui court ouvre le menu contextuel avec le choix \'Aller vers le point\'), soit par un appui court sur un favori ou un résultat de recherche (en choisissant alors \'Navigation\'). + \n\tLa destination est alors indiquée par un point orange et un drapeau à damier. OsmAnd affiche la distance qui vous en sépare, et sa direction (par une flèche orange). Recherche - Vous pouvez rechercher un lieu via l\'option \'Rechercher autour du point\' dans le menu contextuel de la carte, ou via \'Menu\' → \'Rechercher\'. + \tVous pouvez rechercher un lieu via l\'option \'Rechercher autour du point\' dans le menu contextuel de la carte, ou via \'Menu\' → \'Rechercher\'. \n\nVous pouvez alors rechercher : \n\t* un point d\'intérêt (par type ou par nom) \n\t* une adresse \n\t* des coordonnées \n\t* un favori prédéfini \n\t* dans l\'historique des recherches - \n\nDans chacun des cas, il vous sera proposé un choix entre \'Navigation\' (vers le point) ou \'Voir sur la carte\', etc. + \n\tDans chacun des cas, il vous sera proposé un choix entre \'Navigation\' (vers le point) ou \'Voir sur la carte\', etc. Menu contextuel de la carte - \tLe menu contextuel de la carte est disponible par un appui long sur la carte ou le bouton trackball. -\n\tUne bulle apparaît alors avec les coordonnées du point : un appui court dessus ouvre le menu contextuel, un appui long fait disparaître la bulle. Le menu contextuel est également disponible depuis le bouton \'Menu\'. -\n\tLe menu contextuel de la carte regroupe les actions possibles autour de ce point. + \tLe menu contextuel de la carte regroupe les actions possibles au niveau d\'un point (un lieu). +\n\tIl est disponible par un appui long au niveau du point sur la carte, suivi d\'un appui court sur la bulle apparue avec les coordonnées du point (un appui long sur la bulle la fait disparaître). +\n\tIl est également disponible via \'Menu\' → \'Options du point\', ou par un appui sur le bouton trackball (dans ces deux derniers cas, le point défini est le centre de la carte). Conseils et astuces \tOsmAnd est une application de navigation avec beaucoup de fonctionnalités. @@ -1017,8 +1017,8 @@ \n\t\'Ne pas tourner (nord vers le haut)\' - La carte ne change pas d\'orientation, le nord est toujours vers le haut. \n\t\'Direction du déplacement\' - La carte est continuellement alignée dans la direction du déplacement. \n\t\'Boussole\' - La carte est continuellement alignée sur les informations de la boussole. -"\tLe style de la carte peut, pour certaines cartes vectorielles, être modifié selon qu\'il fait jour (plus clair) ou nuit (plus sombre) -\n\tLes couleurs de nuit sont plus sûres pour la conduite nocturne +"\tLe style de la carte peut, pour certaines cartes vectorielles, être modifié selon qu\'il fait jour (plus clair) ou nuit (plus sombre). +\n\tLes couleurs de nuit sont plus sûres pour la conduite nocturne. \n\tVous pouvez changer de règle pour la bascule jour/nuit dans \'Menu\' → \'Configurer l\'écran\' → \'Mode jour/nuit\'. \n\tLes choix sont : \n\t\'Lever/coucher du soleil\' - Bascule automatique, en fonction de l\'éphéméride (mode par défaut) @@ -1038,8 +1038,8 @@ Coller à la route " OsmAnd (OSM Automated Navigation Directions) OsmAnd est un logiciel libre de navigation exploitant une grande variété de données issues OpenStreetMap (OSM). Toutes les données (cartes vectorielles ou à base de tuiles) peuvent être stockées dans la mémoire du téléphone pour un usage hors-ligne. OsmAnd permet également le routage en ligne et hors-ligne avec des instructions vocales pas à pas. Fonctionnalités principales : - Fonctionne complètement hors-ligne (stockage des cartes téléchargées au format vectoriel ou tuile dans un répertoire paramétrable) - Cartes hors-lignes compactes disponibles pour le monde entier - Téléchargement des cartes pour un pays ou une région directement depuis l\'application - Possibilité de superposer plusieurs couches, telles que des traces GPX ou de navigation, des points d\'intérêt (PI), des favoris, des courbes de niveau, les arrêts de transport en commun, et bien d\'autres cartes avec une transparence personnalisable - Recherche hors-ligne d\'adresses et de lieux (PI) - Navigation hors-ligne pour de courtes distances (expérimentale) - Mode voiture, vélo et piéton avec : - Option de vue jour/nuit automatique - Option de zoom automatique lors des déplacements - Orientation automatique de la carte (fixe, boussole, cap) Limitations de la version gratuite de OsmAnd : - Nombre de téléchargement de cartes limité - Pas d\'accès aux PI Wikipédia hors-ligne. OsmAnd est activement développé et notre projet et ses progrès futurs dépendent des contributions financières pour financer le développement et le test de nouvelles fonctionnalités. Veuillez considérer l\'achat d\'OsmAnd+, le financement d\'une fonctionnalité spécifique, ou un donation sur osmand.net. " " OsmAnd+ (OSM Automated Navigation Directions) OsmAnd+ est un logiciel libre de navigation exploitant une grande variété de données issues OpenStreetMap (OSM). Toutes les données (cartes vectorielles ou à base de tuiles) peuvent être stockées dans la mémoire du téléphone pour un usage hors-ligne. OsmAnd permet également le routage en ligne et hors-ligne avec des instructions vocales pas à pas. OsmAnd+ est la version payante de l\'application, en l\'achetant vous supportez le projet, financez le développement de nouvelles fonctionnalités, et recevez les dernières mises à jour. Fonctionnalités principales : - Fonctionne complètement hors-ligne (stockage des cartes téléchargées au format vectoriel ou tuile dans un répertoire paramétrable) - Cartes es compactes disponibles pour le monde entier - Téléchargement illimité des cartes pour un pays ou une région directement depuis l\'application - Points d\'intérêt (PI) Wikipédia hors-ligne, parfait pour le tourisme - Possibilité de superposer plusieurs couches, telles que des traces GPX ou de navigation, des points d\'intérêt, des favoris, des courbes de niveau, les arrêts de transport en commun, et bien d\'autres cartes avec une transparence personnalisable - Recherche hors-ligne d\'adresses et de lieux (PI) - Navigation hors-ligne pour de courtes distances (expérimentale) - Mode voiture, vélo et piéton avec : - Option de vue jour/nuit automatique - Option de zoom automatique lors des déplacements - Orientation automatique de la carte (fixe, boussole, cap) - Affichage des limitations de vitesse, voix enregistrées et voix de synthèse" -\tLa source des cartes et des couches affichées est modifiable via \'Menu\' -> \'Couches\'. -\n\tDans \'Source de la carte…\' vous pouvez choisir entre les cartes vectorielles préchargées (choix par défaut, nécessaires pour la navigation hors-ligne), ou des sources prédéfinies de tuiles de carte en ligne ou en cache (activer le greffon \'Cartes en ligne\' pour cela), ou des cartes créées manuellement sur un PC grâce à OsmAndMapCreator. +\tLa source des cartes et des couches affichées est modifiable via \'Menu\' → \'Couches\' → \'Source de la carte…\'. +\n\tVous pouvez choisir entre les cartes vectorielles hors-ligne préchargées (choix par défaut, nécessaires pour la navigation hors-ligne), ou des sources prédéfinies de tuiles de carte en ligne ou en cache (activer le greffon \'Cartes en ligne\' pour cela), ou des cartes créées manuellement sur un PC grâce à OsmAndMapCreator. \n\tOsmAnd supporte également des sources personnalisées. \tOsmAnd propose des profils (personnalisables) adaptés aux différentes utilisations. @@ -1085,12 +1085,12 @@ "Changements en 1.0 :\n\t* Amélioration de la navigation, plus rapide et plus précise (jusqu\'à 250 km)\n\t* Cartographie des routes\n\t* La carte ne perd plus la position courante après les interruptions\n\t* Active le service d\'arrière-plan pendant la navigation " Exécuter l\'application dans le mode sûr (ne pas utiliser de code natif). Mode sûr - L\'application s\'exécute en mode sûr (désactiver le dans les paramètres). - Sélectionner quand afficher uniquement les cartes routières : + L\'application s\'exécute en mode sûr (peut être désactivé dans Paramètres). + Sélectionner à quel moment afficher les cartes uniquement routières : Cartes uniquement routières Routes uniquement Cartes standards - Cartes routières uniquement + Cartes uniquement routières incomplet Aucun bâtiment trouvé. Rechercher les villages et les codes postaux @@ -1105,12 +1105,12 @@ Ne pas afficher les limites administratives régionales (niveaux 5 à 9) "\tLa plupart des périphériques GPS donnent des mesures d\'altitude dans le référentiel ellipsoïdal WGS84, depuis lequel une conversion vers le système local nécessite une correction en fonction de la position courante. \n\tUne meilleure approximation des systèmes locaux est le référentiel EGM96. OsmAnd supporte désormais l\'affichage automatique de l\'altitude dans ce référentiel. -\n\tIl suffit pour cela de télécharger le fichier WW15MGH.DAC depuis le gestionnaire de données hors-ligne (l\'original est à l\'adresse http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm96/binary/WW15MGH.DAC). " +\n\tIl suffit pour cela de télécharger le fichier 'Monde - Correction d\'altitude' depuis le gestionnaire de données hors-ligne (l\'original est à l\'adresse http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm96/binary/WW15MGH.DAC). " Le greffon OsMoDroid est obsolète et doit être mis à jour. Le greffon OsMoDroid est une extension OsmAnd pour l\'application OsMoDroid qui permet la création de traces. Pour plus d\'information à propos du service, consulter le site http://esya.ru. Greffon OsMoDroid Courbes de niveau - Ce greffon permet de télécharger les courbes de niveaux (\'Paramètres\' → \'Données hors-ligne\' → \'Télécharger des donées hors-ligne\', sélectionner \'Courbes de niveau\' dans le menu) pour une région spécifique, et de les utiliser avec les cartes hors-ligne. + Ce greffon permet de télécharger les courbes de niveaux pour une région spécifique (\'Paramètres\' → \'Données hors-ligne\' → \'Télécharger des données hors-ligne\', puis sélectionner \'Courbes de niveau\' dans le menu), et de les utiliser avec les cartes hors-ligne. Courbes de niveau Autres cartes Courbes de niveau @@ -1120,7 +1120,7 @@ L\'emplacement à associer à la note n\'est pas encore défini. Utilisez le menu contextuel de la carte pour associer à la note l\'emplacement ainsi spécifié. arrêter Notes audio - Ce greffon permet de prendre des notes audio/vidéo/photo durant le voyage + Ce greffon permet de prendre des notes audio/vidéo/photo durant le voyage. Notes audio/vidéo Greffon OsmAnd pour les courbes de niveau hors-ligne @@ -1415,20 +1415,20 @@ Arrêt de l\'auto-zoom Zoom éloigné Zoom très éloigné - OsmAnd permet l\'affichage des cartes vectorielles hors-ligne selon différents styles de rendu en fonction de vos besoins. - \n\nÀ la place du style de rendu \'default\', vous pouvez dans \'Menu\' → \'Configurer l\'écran\' → \'Styles de rendu\' sélectionner par exemple : - \n\t* le style \'Touring view\', qui fournit les informations les plus détaillées possibles pour le voyage et le tourisme, incluant des optimisations pour les conducteurs professionnels (contraste élevé, diverses routes bien distinguables). + \tOsmAnd propose différents styles de rendu pour l\'affichage des cartes vectorielles hors-ligne, en fonction de vos besoins. + \n\tDans \'Menu\' → \'Configurer l\'écran\' → \'Styles de rendu\', vous pouvez à la place du style de rendu \'default\' sélectionner par exemple : + \n\t* le style \'Touring view\', qui fournit les informations les plus détaillées possibles pour le voyage et le tourisme, avec des optimisations pour les conducteurs professionnels (contraste élevé, distinction claire des différentes routes), des options pour la randonnée alpine (Alpine hiking, classification du Club Alpin Suisse), l\'affichage des symboles de randonnée, des véloroutes \n\t* \'High contrast roads\' affiche les routes avec des couleurs très accentuées pour les situations de forte luminosité. - \n\t* \'Cycle-map\' est optimisé pour l\'affichage des routes pour cyclistes. - \n\t* \'Winter and ski\' crée une vue hivernale du paysage, et montre les domaines skiables (nécessite le téléchargement de la carte \'World ski\') - \n\t* \'Topo-map-assimilation\' est optimisé pour la randonnée et affiche les chemins en fonction de l\'échelle SAC, ainsi que les symboles de randonnée. + \n\t* \'Cycle-map\' est optimisé pour l\'affichage des voies pour cyclistes. + \n\t* \'Winter and ski\' crée une vue hivernale du paysage, et montre les domaines skiables (nécessite le téléchargement de la carte \'Monde - Ski\') + \n\t* \'Topo-map-assimilation\' est optimisé pour la randonnée, et affiche les chemins en fonction de la classification du Club Alpin Suisse (SAC scale), ainsi que les symboles de randonnée. Mémoriser mon choix GPS Status Veuillez d\'abord calculer l\'itinéraire Simulation avec l\'itinéraire calculé Simulation avec la trace GPX - Merci de visiter https://code.google.com/p/osmand/wiki/FAQ pour la Foire Aux Questions. + \tMerci de visiter https://code.google.com/p/osmand/wiki/FAQ pour la Foire Aux Questions. Foire Aux Questions Vous allez supprimer %1$d modifications OSM. Êtes-vous sûr ? Effacer tout @@ -1495,4 +1495,55 @@ Calculer un itinéraire OsmAnd pour le début et la fin de l\'itinéraire Calculer un itinéraire OsmAnd hors-ligne + Europe - Italie + Europe - Grande-Bretagne + Amérique du Nord - Canada +Adresses sur l\'ensemble du pays +Monde - Correction d\'altitude +Monde - Balisage maritime +Monde - Paiement en bitcoin +Monde - Carte générale + Monde - Ski + Croate + Chinois + Portugais (Brésil) + Anglais +Afrikaans +Arménien +Basque +Biélorusse +Bosnien +Bulgare +Catalan +Tchèque +Danois +Néerlandais +Finnois +Français +Géorgien +Allemand +Grec +Hébreu +Hindi +Hongrois +Indonésien +Italien +Japonais +Coréen +Letton +Lituanien +Marathi +Norvégien +Polonais +Portugais +Roumain +Russe +Slovaque +Slovène +Espagnol +Suédois +Turc +Ukrainien +Vietnamien +Gallois From e6dc2456e5f44c57ba52f670b80fae002a8be638 Mon Sep 17 00:00:00 2001 From: GiZig Date: Tue, 22 Apr 2014 03:26:50 +0200 Subject: [PATCH 29/29] Minor correc(t)ion --- OsmAnd/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 97fc59b013..8f0756202b 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -10,7 +10,7 @@ PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy --> addresses nationwide - World altitude correcion + World altitude correction World seamarks World bitcoin payments World overview map