Search in sources :

Example 61 with OsmandApplication

use of net.osmand.plus.OsmandApplication in project Osmand by osmandapp.

the class GpxUiHelper method createSingleChoiceDialog.

private static AlertDialog createSingleChoiceDialog(final Activity activity, final boolean showCurrentGpx, final CallbackWithObject<GPXFile[]> callbackWithObject, final List<GPXInfo> list, final ContextMenuAdapter adapter) {
    final OsmandApplication app = (OsmandApplication) activity.getApplication();
    final IconsCache iconsCache = app.getIconsCache();
    final File dir = app.getAppPath(IndexConstants.GPX_INDEX_DIR);
    AlertDialog.Builder builder = new AlertDialog.Builder(activity);
    final int layout = R.layout.list_menu_item_native_singlechoice;
    final ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(activity, layout, R.id.text1, adapter.getItemNames()) {

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            // User super class to create the View
            View v = convertView;
            if (v == null) {
                v = activity.getLayoutInflater().inflate(layout, null);
            }
            final ContextMenuItem item = adapter.getItem(position);
            TextView tv = (TextView) v.findViewById(R.id.text1);
            Drawable icon;
            if (showCurrentGpx && position == 0) {
                icon = null;
            } else {
                icon = iconsCache.getThemedIcon(item.getIcon());
            }
            tv.setCompoundDrawablePadding(AndroidUtils.dpToPx(activity, 10f));
            tv.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
            tv.setText(item.getTitle());
            tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
            return v;
        }
    };
    int selectedIndex = 0;
    String prevSelectedGpx = app.getSettings().LAST_SELECTED_GPX_TRACK_FOR_NEW_POINT.get();
    if (prevSelectedGpx != null) {
        selectedIndex = list.indexOf(prevSelectedGpx);
    }
    if (selectedIndex == -1) {
        selectedIndex = 0;
    }
    final int[] selectedPosition = { selectedIndex };
    builder.setSingleChoiceItems(listAdapter, selectedIndex, new OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int position) {
            selectedPosition[0] = position;
        }
    });
    builder.setTitle(R.string.select_gpx).setPositiveButton(R.string.shared_string_ok, new OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            int position = selectedPosition[0];
            if (position != -1) {
                if (showCurrentGpx && position == 0) {
                    callbackWithObject.processResult(null);
                    app.getSettings().LAST_SELECTED_GPX_TRACK_FOR_NEW_POINT.set(null);
                } else {
                    String fileName = list.get(position).getFileName();
                    app.getSettings().LAST_SELECTED_GPX_TRACK_FOR_NEW_POINT.set(fileName);
                    SelectedGpxFile selectedGpxFile = app.getSelectedGpxHelper().getSelectedFileByName(fileName);
                    if (selectedGpxFile != null) {
                        callbackWithObject.processResult(new GPXFile[] { selectedGpxFile.getGpxFile() });
                    } else {
                        loadGPXFileInDifferentThread(activity, callbackWithObject, dir, null, fileName);
                    }
                }
            }
        }
    }).setNegativeButton(R.string.shared_string_cancel, null);
    final AlertDialog dlg = builder.create();
    dlg.setCanceledOnTouchOutside(false);
    dlg.show();
    try {
        dlg.getListView().setFastScrollEnabled(true);
    } catch (Exception e) {
    // java.lang.ClassCastException: com.android.internal.widget.RoundCornerListAdapter
    // Unknown reason but on some devices fail
    }
    return dlg;
}
Also used : AlertDialog(android.support.v7.app.AlertDialog) OsmandApplication(net.osmand.plus.OsmandApplication) ContextMenuItem(net.osmand.plus.ContextMenuItem) DialogInterface(android.content.DialogInterface) ViewGroup(android.view.ViewGroup) Drawable(android.graphics.drawable.Drawable) SpannableString(android.text.SpannableString) ImageView(android.widget.ImageView) View(android.view.View) AdapterView(android.widget.AdapterView) MarkerView(com.github.mikephil.charting.components.MarkerView) TextView(android.widget.TextView) SuppressLint(android.annotation.SuppressLint) SelectedGpxFile(net.osmand.plus.GpxSelectionHelper.SelectedGpxFile) OnClickListener(android.content.DialogInterface.OnClickListener) TextView(android.widget.TextView) IconsCache(net.osmand.plus.IconsCache) SelectedGpxFile(net.osmand.plus.GpxSelectionHelper.SelectedGpxFile) File(java.io.File) GPXFile(net.osmand.plus.GPXUtilities.GPXFile) ArrayAdapter(android.widget.ArrayAdapter)

Example 62 with OsmandApplication

use of net.osmand.plus.OsmandApplication in project Osmand by osmandapp.

the class GpxUiHelper method selectGPXFiles.

public static AlertDialog selectGPXFiles(List<String> selectedGpxList, final Activity activity, final CallbackWithObject<GPXFile[]> callbackWithObject) {
    OsmandApplication app = (OsmandApplication) activity.getApplication();
    final File dir = app.getAppPath(IndexConstants.GPX_INDEX_DIR);
    final List<GPXInfo> allGpxList = getSortedGPXFilesInfo(dir, selectedGpxList, false);
    if (allGpxList.isEmpty()) {
        Toast.makeText(activity, R.string.gpx_files_not_found, Toast.LENGTH_LONG).show();
    }
    allGpxList.add(0, new GPXInfo(activity.getString(R.string.show_current_gpx_title), 0, 0));
    final ContextMenuAdapter adapter = createGpxContextMenuAdapter(allGpxList, selectedGpxList, true);
    return createDialog(activity, true, true, true, callbackWithObject, allGpxList, adapter);
}
Also used : ContextMenuAdapter(net.osmand.plus.ContextMenuAdapter) OsmandApplication(net.osmand.plus.OsmandApplication) SelectedGpxFile(net.osmand.plus.GpxSelectionHelper.SelectedGpxFile) File(java.io.File) GPXFile(net.osmand.plus.GPXUtilities.GPXFile)

Example 63 with OsmandApplication

use of net.osmand.plus.OsmandApplication in project Osmand by osmandapp.

the class GpxUiHelper method selectGPXFile.

public static AlertDialog selectGPXFile(final Activity activity, final boolean showCurrentGpx, final boolean multipleChoice, final CallbackWithObject<GPXFile[]> callbackWithObject) {
    OsmandApplication app = (OsmandApplication) activity.getApplication();
    final File dir = app.getAppPath(IndexConstants.GPX_INDEX_DIR);
    final List<GPXInfo> list = getSortedGPXFilesInfo(dir, null, false);
    if (list.isEmpty()) {
        Toast.makeText(activity, R.string.gpx_files_not_found, Toast.LENGTH_LONG).show();
    }
    if (!list.isEmpty() || showCurrentGpx) {
        if (showCurrentGpx) {
            list.add(0, new GPXInfo(activity.getString(R.string.show_current_gpx_title), 0, 0));
        }
        final ContextMenuAdapter adapter = createGpxContextMenuAdapter(list, null, showCurrentGpx);
        return createDialog(activity, showCurrentGpx, multipleChoice, false, callbackWithObject, list, adapter);
    }
    return null;
}
Also used : ContextMenuAdapter(net.osmand.plus.ContextMenuAdapter) OsmandApplication(net.osmand.plus.OsmandApplication) SelectedGpxFile(net.osmand.plus.GpxSelectionHelper.SelectedGpxFile) File(java.io.File) GPXFile(net.osmand.plus.GPXUtilities.GPXFile)

Example 64 with OsmandApplication

use of net.osmand.plus.OsmandApplication in project Osmand by osmandapp.

the class AmenityMenuBuilder method buildInternal.

@Override
public void buildInternal(View view) {
    boolean hasWiki = false;
    MapPoiTypes poiTypes = app.getPoiTypes();
    String preferredLang = getPreferredMapAppLang();
    List<AmenityInfoRow> infoRows = new LinkedList<>();
    List<AmenityInfoRow> descriptions = new LinkedList<>();
    Map<String, List<PoiType>> poiAdditionalCategories = new HashMap<>();
    AmenityInfoRow cuisineRow = null;
    for (Map.Entry<String, String> e : amenity.getAdditionalInfo().entrySet()) {
        int iconId = 0;
        Drawable icon = null;
        int textColor = 0;
        String key = e.getKey();
        String vl = e.getValue();
        if (key.equals("image") || key.equals("mapillary") || key.equals("subway_region")) {
            continue;
        }
        String textPrefix = "";
        CollapsableView collapsableView = null;
        boolean collapsable = false;
        boolean isWiki = false;
        boolean isText = false;
        boolean isDescription = false;
        boolean needLinks = !"population".equals(key);
        boolean isPhoneNumber = false;
        boolean isUrl = false;
        boolean isCuisine = false;
        int poiTypeOrder = 0;
        String poiTypeKeyName = "";
        AbstractPoiType pt = poiTypes.getAnyPoiAdditionalTypeByKey(key);
        if (pt == null && !Algorithms.isEmpty(vl) && vl.length() < 50) {
            pt = poiTypes.getAnyPoiAdditionalTypeByKey(key + "_" + vl);
        }
        PoiType pType = null;
        if (pt != null) {
            pType = (PoiType) pt;
            if (pType.isFilterOnly()) {
                continue;
            }
            poiTypeOrder = pType.getOrder();
            poiTypeKeyName = pType.getKeyName();
        }
        if (pType != null && !pType.isText()) {
            String categoryName = pType.getPoiAdditionalCategory();
            if (!Algorithms.isEmpty(categoryName)) {
                List<PoiType> poiAdditionalCategoryTypes = poiAdditionalCategories.get(categoryName);
                if (poiAdditionalCategoryTypes == null) {
                    poiAdditionalCategoryTypes = new ArrayList<>();
                    poiAdditionalCategories.put(categoryName, poiAdditionalCategoryTypes);
                }
                poiAdditionalCategoryTypes.add(pType);
                continue;
            }
        }
        if (amenity.getType().isWiki()) {
            if (!hasWiki) {
                String lng = amenity.getContentLanguage("content", preferredLang, "en");
                if (Algorithms.isEmpty(lng)) {
                    lng = "en";
                }
                final String langSelected = lng;
                String content = amenity.getDescription(langSelected);
                vl = (content != null) ? Html.fromHtml(content).toString() : "";
                if (vl.length() > 300) {
                    vl = vl.substring(0, 300);
                }
                hasWiki = true;
                isWiki = true;
                needLinks = false;
            } else {
                continue;
            }
        } else if (key.startsWith("name:")) {
            continue;
        } else if (Amenity.OPENING_HOURS.equals(key)) {
            iconId = R.drawable.ic_action_time;
            collapsableView = getCollapsableTextView(view.getContext(), true, amenity.getOpeningHours());
            collapsable = true;
            OpeningHoursParser.OpeningHours rs = OpeningHoursParser.parseOpenedHours(amenity.getOpeningHours());
            if (rs != null) {
                vl = rs.toLocalString();
                Calendar inst = Calendar.getInstance();
                inst.setTimeInMillis(System.currentTimeMillis());
                boolean opened = rs.isOpenedForTime(inst);
                if (opened) {
                    textColor = R.color.color_ok;
                } else {
                    textColor = R.color.color_invalid;
                }
            }
            needLinks = false;
        } else if (Amenity.PHONE.equals(key)) {
            iconId = R.drawable.ic_action_call_dark;
            isPhoneNumber = true;
        } else if (Amenity.WEBSITE.equals(key)) {
            iconId = R.drawable.ic_world_globe_dark;
            isUrl = true;
        } else if (Amenity.CUISINE.equals(key)) {
            isCuisine = true;
            iconId = R.drawable.ic_action_cuisine;
            StringBuilder sb = new StringBuilder();
            for (String c : e.getValue().split(";")) {
                if (sb.length() > 0) {
                    sb.append(", ");
                    sb.append(poiTypes.getPoiTranslation("cuisine_" + c).toLowerCase());
                } else {
                    sb.append(poiTypes.getPoiTranslation("cuisine_" + c));
                }
            }
            textPrefix = app.getString(R.string.poi_cuisine);
            vl = sb.toString();
        } else if (key.contains(Amenity.ROUTE)) {
            continue;
        } else {
            if (key.contains(Amenity.DESCRIPTION)) {
                iconId = R.drawable.ic_action_note_dark;
            } else {
                iconId = R.drawable.ic_action_info_dark;
            }
            if (pType != null) {
                poiTypeOrder = pType.getOrder();
                poiTypeKeyName = pType.getKeyName();
                if (pType.getParentType() != null && pType.getParentType() instanceof PoiType) {
                    icon = getRowIcon(view.getContext(), ((PoiType) pType.getParentType()).getOsmTag() + "_" + pType.getOsmTag().replace(':', '_') + "_" + pType.getOsmValue());
                }
                if (!pType.isText()) {
                    vl = pType.getTranslation();
                } else {
                    isText = true;
                    isDescription = iconId == R.drawable.ic_action_note_dark;
                    textPrefix = pType.getTranslation();
                    vl = amenity.unzipContent(e.getValue());
                }
                if (!isDescription && icon == null) {
                    icon = getRowIcon(view.getContext(), pType.getIconKeyName());
                    if (isText && icon != null) {
                        textPrefix = "";
                    }
                }
                if (icon == null && isText) {
                    iconId = R.drawable.ic_action_note_dark;
                }
            } else {
                textPrefix = Algorithms.capitalizeFirstLetterAndLowercase(e.getKey());
                vl = amenity.unzipContent(e.getValue());
            }
        }
        if (vl.startsWith("http://") || vl.startsWith("https://") || vl.startsWith("HTTP://") || vl.startsWith("HTTPS://")) {
            isUrl = true;
        }
        boolean matchWidthDivider = !isDescription && isWiki;
        AmenityInfoRow row;
        if (isDescription) {
            row = new AmenityInfoRow(key, R.drawable.ic_action_note_dark, textPrefix, vl, collapsable, collapsableView, 0, false, true, true, 0, "", false, false, matchWidthDivider, 0);
        } else if (icon != null) {
            row = new AmenityInfoRow(key, icon, textPrefix, vl, collapsable, collapsableView, textColor, isWiki, isText, needLinks, poiTypeOrder, poiTypeKeyName, isPhoneNumber, isUrl, matchWidthDivider, 0);
        } else {
            row = new AmenityInfoRow(key, iconId, textPrefix, vl, collapsable, collapsableView, textColor, isWiki, isText, needLinks, poiTypeOrder, poiTypeKeyName, isPhoneNumber, isUrl, matchWidthDivider, 0);
        }
        if (isDescription) {
            descriptions.add(row);
        } else {
            if (!isCuisine) {
                infoRows.add(row);
            } else {
                cuisineRow = row;
            }
        }
    }
    if (cuisineRow != null) {
        boolean hasCuisineOrDish = poiAdditionalCategories.get(Amenity.CUISINE) != null || poiAdditionalCategories.get(Amenity.DISH) != null;
        if (!hasCuisineOrDish) {
            infoRows.add(cuisineRow);
        }
    }
    for (Map.Entry<String, List<PoiType>> e : poiAdditionalCategories.entrySet()) {
        String categoryName = e.getKey();
        List<PoiType> categoryTypes = e.getValue();
        if (categoryTypes.size() > 0) {
            Drawable icon;
            PoiType pType = categoryTypes.get(0);
            String poiAdditionalCategoryName = pType.getPoiAdditionalCategory();
            String poiAddidionalIconName = poiTypes.getPoiAdditionalCategoryIconName(poiAdditionalCategoryName);
            icon = getRowIcon(view.getContext(), poiAddidionalIconName);
            if (icon == null) {
                icon = getRowIcon(view.getContext(), poiAdditionalCategoryName);
            }
            if (icon == null) {
                icon = getRowIcon(view.getContext(), pType.getIconKeyName());
            }
            if (icon == null) {
                icon = getRowIcon(R.drawable.ic_action_note_dark);
            }
            StringBuilder sb = new StringBuilder();
            for (PoiType pt : categoryTypes) {
                if (sb.length() > 0) {
                    sb.append(" • ");
                }
                sb.append(pt.getTranslation());
            }
            boolean cuisineOrDish = categoryName.equals(Amenity.CUISINE) || categoryName.equals(Amenity.DISH);
            CollapsableView collapsableView = getPoiAdditionalCollapsableView(view.getContext(), true, categoryTypes, cuisineOrDish ? cuisineRow : null);
            infoRows.add(new AmenityInfoRow(poiAdditionalCategoryName, icon, pType.getPoiAdditionalCategoryTranslation(), sb.toString(), true, collapsableView, 0, false, false, false, pType.getOrder(), pType.getKeyName(), false, false, false, 1));
        }
    }
    Collections.sort(infoRows, new Comparator<AmenityInfoRow>() {

        @Override
        public int compare(AmenityInfoRow row1, AmenityInfoRow row2) {
            if (row1.order < row2.order) {
                return -1;
            } else if (row1.order == row2.order) {
                return row1.name.compareTo(row2.name);
            } else {
                return 1;
            }
        }
    });
    for (AmenityInfoRow info : infoRows) {
        buildAmenityRow(view, info);
    }
    String langSuffix = ":" + preferredLang;
    AmenityInfoRow descInPrefLang = null;
    for (AmenityInfoRow desc : descriptions) {
        if (desc.key.length() > langSuffix.length() && desc.key.substring(desc.key.length() - langSuffix.length(), desc.key.length()).equals(langSuffix)) {
            descInPrefLang = desc;
            break;
        }
    }
    if (descInPrefLang != null) {
        descriptions.remove(descInPrefLang);
        descriptions.add(0, descInPrefLang);
    }
    for (AmenityInfoRow info : descriptions) {
        buildAmenityRow(view, info);
    }
    if (processNearstWiki() && nearestWiki.size() > 0) {
        AmenityInfoRow wikiInfo = new AmenityInfoRow("nearest_wiki", R.drawable.ic_action_wikipedia, null, app.getString(R.string.wiki_around) + " (" + nearestWiki.size() + ")", true, getCollapsableWikiView(view.getContext(), true), 0, false, false, false, 1000, null, false, false, false, 0);
        buildAmenityRow(view, wikiInfo);
    }
    OsmandSettings st = ((OsmandApplication) mapActivity.getApplicationContext()).getSettings();
    boolean osmEditingEnabled = OsmandPlugin.getEnabledPlugin(OsmEditingPlugin.class) != null;
    if (osmEditingEnabled && amenity.getId() != null && amenity.getId() > 0 && (amenity.getId() % 2 == 0 || (amenity.getId() >> 1) < Integer.MAX_VALUE)) {
        String link;
        if (amenity.getId() % 2 == 0) {
            link = "https://www.openstreetmap.org/node/";
        } else {
            link = "https://www.openstreetmap.org/way/";
        }
        buildRow(view, R.drawable.ic_action_info_dark, null, link + (amenity.getId() >> 1), 0, false, null, true, 0, true, null, false);
    }
    buildRow(view, R.drawable.ic_action_get_my_location, null, PointDescription.getLocationName(app, amenity.getLocation().getLatitude(), amenity.getLocation().getLongitude(), true).replaceAll("\n", " "), 0, false, null, false, 0, false, null, false);
}
Also used : OsmandApplication(net.osmand.plus.OsmandApplication) HashMap(java.util.HashMap) AbstractPoiType(net.osmand.osm.AbstractPoiType) PoiType(net.osmand.osm.PoiType) ArrayList(java.util.ArrayList) ColorStateList(android.content.res.ColorStateList) LinkedList(java.util.LinkedList) List(java.util.List) Calendar(java.util.Calendar) Drawable(android.graphics.drawable.Drawable) AbstractPoiType(net.osmand.osm.AbstractPoiType) OpeningHoursParser(net.osmand.util.OpeningHoursParser) MapPoiTypes(net.osmand.osm.MapPoiTypes) LinkedList(java.util.LinkedList) OsmandSettings(net.osmand.plus.OsmandSettings) OsmEditingPlugin(net.osmand.plus.osmedit.OsmEditingPlugin) HashMap(java.util.HashMap) Map(java.util.Map)

Example 65 with OsmandApplication

use of net.osmand.plus.OsmandApplication in project Osmand by osmandapp.

the class PerformLiveUpdateAsyncTask method onPostExecute.

@Override
protected void onPostExecute(IncrementalChangesManager.IncrementalUpdateList result) {
    LOG.debug("onPostExecute");
    if (context instanceof AbstractDownloadActivity) {
        AbstractDownloadActivity activity = (AbstractDownloadActivity) context;
        activity.setSupportProgressBarIndeterminateVisibility(false);
    }
    final OsmandApplication application = getMyApplication();
    final OsmandSettings settings = application.getSettings();
    if (result.errorMessage != null) {
        LOG.info(result.errorMessage);
        tryRescheduleDownload(context, settings, localIndexFileName);
    } else {
        settings.LIVE_UPDATES_RETRIES.resetToDefault();
        List<IncrementalChangesManager.IncrementalUpdate> ll = result.getItemsForUpdate();
        if (ll != null && !ll.isEmpty()) {
            ArrayList<IndexItem> itemsToDownload = new ArrayList<>(ll.size());
            for (IncrementalChangesManager.IncrementalUpdate iu : ll) {
                IndexItem indexItem = new IndexItem(iu.fileName, "Incremental update", iu.timestamp, iu.sizeText, iu.contentSize, iu.containerSize, DownloadActivityType.LIVE_UPDATES_FILE);
                itemsToDownload.add(indexItem);
            }
            DownloadIndexesThread downloadThread = application.getDownloadThread();
            if (context instanceof DownloadIndexesThread.DownloadEvents) {
                downloadThread.setUiActivity((DownloadIndexesThread.DownloadEvents) context);
            }
            boolean downloadViaWiFi = LiveUpdatesHelper.preferenceDownloadViaWiFi(localIndexFileName, settings).get();
            if (getMyApplication().getSettings().isInternetConnectionAvailable()) {
                if (forceUpdate || settings.isWifiConnected() || !downloadViaWiFi) {
                    long szLong = 0;
                    int i = 0;
                    for (IndexItem es : downloadThread.getCurrentDownloadingItems()) {
                        szLong += es.getContentSize();
                        i++;
                    }
                    for (IndexItem es : itemsToDownload) {
                        szLong += es.getContentSize();
                        i++;
                    }
                    double sz = ((double) szLong) / (1 << 20);
                    // get availabile space
                    double asz = downloadThread.getAvailableSpace();
                    if (asz == -1 || asz <= 0 || sz / asz <= 0.4) {
                        IndexItem[] itemsArray = new IndexItem[itemsToDownload.size()];
                        itemsArray = itemsToDownload.toArray(itemsArray);
                        downloadThread.runDownloadFiles(itemsArray);
                        if (context instanceof DownloadIndexesThread.DownloadEvents) {
                            ((DownloadIndexesThread.DownloadEvents) context).downloadInProgress();
                        }
                    }
                }
            }
        } else {
            if (context instanceof DownloadIndexesThread.DownloadEvents) {
                ((DownloadIndexesThread.DownloadEvents) context).downloadInProgress();
            }
        }
    }
}
Also used : OsmandApplication(net.osmand.plus.OsmandApplication) AbstractDownloadActivity(net.osmand.plus.download.AbstractDownloadActivity) ArrayList(java.util.ArrayList) OsmandSettings(net.osmand.plus.OsmandSettings) IndexItem(net.osmand.plus.download.IndexItem) IncrementalChangesManager(net.osmand.plus.resources.IncrementalChangesManager) DownloadIndexesThread(net.osmand.plus.download.DownloadIndexesThread)

Aggregations

OsmandApplication (net.osmand.plus.OsmandApplication)181 View (android.view.View)46 TextView (android.widget.TextView)39 ArrayList (java.util.ArrayList)33 AlertDialog (android.support.v7.app.AlertDialog)32 ImageView (android.widget.ImageView)31 DialogInterface (android.content.DialogInterface)27 OsmandSettings (net.osmand.plus.OsmandSettings)27 LatLon (net.osmand.data.LatLon)25 Intent (android.content.Intent)21 AdapterView (android.widget.AdapterView)19 File (java.io.File)17 OsmandMapTileView (net.osmand.plus.views.OsmandMapTileView)15 Location (net.osmand.Location)13 EditText (android.widget.EditText)12 ContextMenuAdapter (net.osmand.plus.ContextMenuAdapter)12 ArrayAdapter (android.widget.ArrayAdapter)11 ListView (android.widget.ListView)11 ContextMenuItem (net.osmand.plus.ContextMenuItem)11 SelectedGpxFile (net.osmand.plus.GpxSelectionHelper.SelectedGpxFile)11