Android Open Source - advanced-tourist-map Advanced Tourist Map Application






From Project

Back to project page advanced-tourist-map.

License

The source code is released under:

GNU General Public License

If you think the Android project advanced-tourist-map listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package org.muxe.advancedtouristmap;
//from w  ww  . ja v a 2  s .co  m
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Locale;

import org.mapsforge.android.mobileHighwayHierarchies.HHRouter;
import org.mapsforge.core.Router;
import org.mapsforge.poi.PointOfInterest;
import org.mapsforge.poi.persistence.IPersistenceManager;
import org.mapsforge.poi.persistence.PersistenceManagerFactory;
import org.muxe.advancedtouristmap.routing.Route;
import org.muxe.advancedtouristmap.sourcefiles.FileManager;
import org.muxe.advancedtouristmap.sourcefiles.MapBundle;
import org.muxe.advancedtouristmap.sourcefiles.RoutingFile;
import org.muxe.advancedtouristmap.wikipedia.WikiArticleInterface;

import android.app.Activity;
import android.app.Application;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.res.AssetManager;
import android.preference.PreferenceManager;
import android.util.Log;
import android.util.TimingLogger;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;

/**
 * Base Application class to store Objects needed in more than one Activity like the Router
 */
public class AdvancedTouristMapApplication extends Application {

  static final int ROUTING_MAIN_MEMORY_CACHE_SIZE = 1024 * 2048;
  public static final String HELP_PREFERENCES_NAME = "helpModulePrefs";
  private Router router;
  public Route currentRoute;

  /** The currently displayed pois on map */
  private ArrayList<PointOfInterest> currentPois;
  private ArrayList<WikiArticleInterface> currentWikiArticles;
  private FileManager fileManager;
  private String baseBundlePath;
  private String currentUsedBundlePath;
  private MapBundle currentMapBundle;
  private String currentRoutingFile;
  public SharedPreferences prefs;
  private IPersistenceManager perstManager;
  public boolean positioningEnabled;

  @Override
  public void onCreate() {
    super.onCreate();
    this.prefs = PreferenceManager.getDefaultSharedPreferences(this);
    this.prefs
        .registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() {
          @Override
          public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
              String key) {
            // TODO: use this to react to changes in e.g. mapfilepath instead of
            // EditPreferences
          }
        });
  }

  public MapBundle getCurrentMapBundle() {
    if (this.currentMapBundle == null) {
      this.currentUsedBundlePath = this.prefs.getString("bundlePath", null);
      if (this.currentUsedBundlePath != null) {
        this.currentMapBundle = this.getFileManager().getSingleBundle(
            this.currentUsedBundlePath);
        Log.d("FileManager", "got current bundle: " + this.currentUsedBundlePath);
      }
    }
    return this.currentMapBundle;
  }

  public void resetCurrentMapBundle() {
    this.currentMapBundle = null;
    this.resetRouter();
    this.perstManager = null;
  }

  public synchronized FileManager getFileManager() {
    TimingLogger timings = new TimingLogger("timing", "getFileManager");
    Log.d("FileManager", "get file manager");
    String directory = this.getBaseBundlePath();
    if (this.fileManager == null) {
      this.fileManager = new FileManager(directory);
      timings.addSplit("got new file manager");
      Log.d("FileManager", "got new file manager");
    } else if (!this.fileManager.getBaseDirectory().equals(directory)) {
      this.fileManager.rescan(directory);
      timings.addSplit("rescanned file manager");
      Log.d("FileManager", "rescanned: " + directory);
    }
    timings.dumpToLog();
    return this.fileManager;
  }

  /**
   * Gets a Router Object based on the path to a Routing Binary. If there already is a Router
   * object it is checked whether the existent Router is based on the same Routing Binary.
   * Only if they differ, a new Router gets created and returned.
   * 
   * @param file
   *            Absolute path to a Routing Binary
   * @return Router Object
   */
  public synchronized Router getRouter(String file) {
    if (this.router == null || !this.currentRoutingFile.equals(file)) {
      try {
        this.router = new HHRouter(new File(file), ROUTING_MAIN_MEMORY_CACHE_SIZE);
        this.currentRoutingFile = file;
        Log.d("Application", "new Router created: " + file);
      } catch (IOException e) {
        e.printStackTrace();
        return null;
      }
    }
    return this.router;
  }

  /**
   * Gets a Singleton Router Object with lazy creation. If there already is a Router, this one
   * is returned. If there is none but the path to the last used binary is stored, a new
   * Router for this binary gets created. If no info is stored or passed at all, the first
   * Routing Binary from the current Map Bundle is used.
   * 
   * @return the singleton Router Object
   */
  public synchronized Router getRouter() {
    if (this.router == null) {
      if (this.currentRoutingFile != null) {
        return this.getRouter(this.currentRoutingFile);
      }
      // no router yet, and no filepath given: take first one
      ArrayList<RoutingFile> rfs = this.getCurrentMapBundle().getRoutingFiles();
      if (rfs.size() > 0) {
        String path = this.getBaseBundlePath() + File.separator
            + rfs.get(0).getRelativePath();
        return this.getRouter(path);
      }
    }
    return this.router;
  }

  public void resetRouter() {
    this.router = null;
    this.currentRoutingFile = null;
  }

  public String getBaseBundlePath() {
    if (this.baseBundlePath == null) {
      this.baseBundlePath = this.prefs.getString("baseBundlePath", "/sdcard");
    }
    return this.baseBundlePath;
  }

  public void resetBaseBundlePath() {
    this.baseBundlePath = null;
    // if the base path is changed, the current bundles are useless
    this.resetCurrentMapBundle();
  }

  public IPersistenceManager getPerstManager() {
    if (this.perstManager == null) {
      if (getCurrentMapBundle().isPoiable()) {
        this.perstManager = PersistenceManagerFactory
            .getPerstPersistenceManager(getBaseBundlePath() + File.separator
                + getCurrentMapBundle().getPoiFile().getRelativePath());
      }
    }
    return this.perstManager;
  }

  public ArrayList<PointOfInterest> getCurrentPois() {
    if (this.currentPois == null) {
      this.currentPois = new ArrayList<PointOfInterest>();
    }
    return this.currentPois;
  }

  public ArrayList<WikiArticleInterface> getCurrentWikiArticles() {
    if (this.currentWikiArticles == null) {
      this.currentWikiArticles = new ArrayList<WikiArticleInterface>();
    }
    return this.currentWikiArticles;
  }

  public String getWikiLocale() {
    String savedLocale = this.prefs.getString("wikiLang", "default");
    if (savedLocale.equals("default")) {
      savedLocale = Locale.getDefault().getLanguage();
    }
    // TODO: check if wikipedia avaiable in this locale oO
    return savedLocale;
  }

  public void setViewWithHelp(Activity activity, int layoutResource) {
    final String helpResource = getHelpResource(activity);
    // check if really needs help
    if (helpResource == null || hasSeenHelp(helpResource)) {
      activity.setContentView(layoutResource);
    } else {
      // create a new framelayout as new root element
      FrameLayout frameLayout = new FrameLayout(activity);
      // add the actual view to the new root
      activity.getLayoutInflater().inflate(layoutResource, frameLayout);
      // also add the help layout (will overlay the actual layout)
      activity.getLayoutInflater().inflate(R.layout.help_layout, frameLayout);
      // set the newly created view as content view
      activity.setContentView(frameLayout);

      final LinearLayout helpLayoutRoot = (LinearLayout) activity
          .findViewById(R.id.help_linear_layout);
      // webview to display help text
      WebView webView = (WebView) activity.findViewById(R.id.help_web_view);
      // button to close the help view
      ImageView closeButton = (ImageView) activity.findViewById(R.id.help_close_button);

      // close the help view on button click
      closeButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
          helpLayoutRoot.setVisibility(View.GONE);
          // mark this help article read
          setHelpSeen(helpResource);
        }
      });
      // handle links internally
      webView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
          view.loadUrl(url);
          return false;
        }
      });
      // load the html formatted help resource
      webView.loadUrl(helpResource);
      // make the background transparent (needs to be called *after* loadUrl)
      webView.setBackgroundColor(0x00000000);
    }
  }

  /**
   * Gets the URI to a help file in the assets folder to display in a WebView. The name of the
   * xml file is the name of the activity in lowercase. It is then checked if there is a file
   * for the default locale (which needs to be in folder help-<locale>/) if there is none, it
   * falls back to the default en-locale. So if the activity is "PositionInfo" it is first
   * checked if "/assets/help-<locale>/positioninfo.xml" exists, and the URI
   * "file:///android_asset/help-<locale>/positioninfo.xml" is returned.
   * 
   * If it doesn't exist, "/assets/help-en/positioninfo.xml" is checked.
   * 
   * If this doesn't exist as well, null is returned
   * 
   * @param activity
   *            Activity for which to create the help resource
   * 
   * @return a file URI to a found xml resource or null if no matching resource could be found
   */
  private String getHelpResource(Activity activity) {
    String languageLocale = Locale.getDefault().getLanguage();
    String activityNamePck = activity.getClass().getName().toLowerCase(Locale.getDefault());
    // cut out the package information
    int mid = activityNamePck.lastIndexOf('.') + 1;
    String activityName = activityNamePck.substring(mid);
    AssetManager assetManager = getResources().getAssets();

    String result = "help-" + languageLocale + "/" + activityName + ".xml";
    try {
      assetManager.open(result);
      return "file:///android_asset/" + result;
    } catch (IOException e) {
    }
    // file didn't exist, check again with en locale
    result = "help-en/" + activityName + ".xml";
    try {
      assetManager.open(result);
      return "file:///android_asset/" + result;
    } catch (IOException e) {
    }
    // didn't exist as well, return null :(
    return null;
  }

  private boolean hasSeenHelp(String key) {
    SharedPreferences helpPrefs = getSharedPreferences(HELP_PREFERENCES_NAME, MODE_PRIVATE);
    return helpPrefs.getBoolean(key, false);
  }

  void setHelpSeen(String key) {
    Editor editor = getSharedPreferences(HELP_PREFERENCES_NAME, MODE_PRIVATE).edit();
    editor.putBoolean(key, true);
    editor.commit();
  }
}




Java Source Code List

org.mapsforge.geocoding.Unchecked.java
org.mapsforge.geocoding.widget.CityCompletionAdapter.java
org.mapsforge.geocoding.widget.PlaceCompletionAdapter.java
org.mapsforge.geocoding.widget.RoadCompletionAdapter.java
org.mapsforge.geocoding.widget.RoadListAdapter.java
org.mapsforge.geocoding.widget.SqliteCompletionAdapter.java
org.mapsforge.geocoding.widget.State.java
org.muxe.advancedtouristmap.AdvancedTouristMapApplication.java
org.muxe.advancedtouristmap.AdvancedTouristMap.java
org.muxe.advancedtouristmap.BaseActivity.java
org.muxe.advancedtouristmap.CacheSizePreference.java
org.muxe.advancedtouristmap.EditPreferences.java
org.muxe.advancedtouristmap.FilePickerIconAdapter.java
org.muxe.advancedtouristmap.FilePicker.java
org.muxe.advancedtouristmap.InfoView.java
org.muxe.advancedtouristmap.LocationPicker.java
org.muxe.advancedtouristmap.MoveSpeedPreference.java
org.muxe.advancedtouristmap.PositionInfo.java
org.muxe.advancedtouristmap.Search.java
org.muxe.advancedtouristmap.SeekBarPreference.java
org.muxe.advancedtouristmap.Utility.java
org.muxe.advancedtouristmap.overlay.GenericOverlayItem.java
org.muxe.advancedtouristmap.overlay.GenericOverlay.java
org.muxe.advancedtouristmap.overlay.PoiOverlayItem.java
org.muxe.advancedtouristmap.overlay.PositionOverlayItem.java
org.muxe.advancedtouristmap.overlay.WikiOverlayItem.java
org.muxe.advancedtouristmap.poi.PoiBrowserActivity.java
org.muxe.advancedtouristmap.poi.PoiOrCategory.java
org.muxe.advancedtouristmap.routing.AngleCalc.java
org.muxe.advancedtouristmap.routing.DecisionOverlay.java
org.muxe.advancedtouristmap.routing.DecisionPoint.java
org.muxe.advancedtouristmap.routing.RouteCalculator.java
org.muxe.advancedtouristmap.routing.RouteList.java
org.muxe.advancedtouristmap.routing.Route.java
org.muxe.advancedtouristmap.sourcefiles.AddressFile.java
org.muxe.advancedtouristmap.sourcefiles.FileManagerActivity.java
org.muxe.advancedtouristmap.sourcefiles.FileManager.java
org.muxe.advancedtouristmap.sourcefiles.MapBundle.java
org.muxe.advancedtouristmap.sourcefiles.MapFile.java
org.muxe.advancedtouristmap.sourcefiles.PoiFile.java
org.muxe.advancedtouristmap.sourcefiles.RoutingFile.java
org.muxe.advancedtouristmap.sourcefiles.SourceFile.java
org.muxe.advancedtouristmap.wikipedia.AbstractWikiArticle.java
org.muxe.advancedtouristmap.wikipedia.ArticleRetrieverFactory.java
org.muxe.advancedtouristmap.wikipedia.ArticleRetriever.java
org.muxe.advancedtouristmap.wikipedia.GeonamesRetriever.java
org.muxe.advancedtouristmap.wikipedia.OnlineWikiArticle.java
org.muxe.advancedtouristmap.wikipedia.WikiArticleInterface.java
org.muxe.advancedtouristmap.wikipedia.WikilocationRetriever.java