com.androzic.waypoint.WaypointInfo.java Source code

Java tutorial

Introduction

Here is the source code for com.androzic.waypoint.WaypointInfo.java

Source

/*
 * Androzic - android navigation client that uses OziExplorer maps (ozf2, ozfx3).
 * Copyright (C) 2010-2014  Andrey Novikov <http://andreynovikov.info/>
 *
 * This file is part of Androzic application.
 *
 * Androzic is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
    
 * Androzic is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
    
 * You should have received a copy of the GNU General Public License
 * along with Androzic.  If not, see <http://www.gnu.org/licenses/>.
 */

/*
 * Contributor: Gutorov Dmitry <dolfwolkov at gmail dot com>
 */

package com.androzic.waypoint;

import java.io.File;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.text.format.DateFormat;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageButton;
import android.widget.TextView;

import com.androzic.Androzic;
import com.androzic.R;
import com.androzic.data.Waypoint;
import com.androzic.util.Geo;
import com.androzic.util.StringFormatter;

public class WaypointInfo extends DialogFragment implements OnClickListener {
    private Waypoint waypoint;
    private OnWaypointActionListener waypointActionsCallback;

    public WaypointInfo() {
        setRetainInstance(true);
    }

    public void setWaypoint(Waypoint waypoint) {
        this.waypoint = waypoint;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.act_waypoint_info, container);
        ((ImageButton) view.findViewById(R.id.navigate_button)).setOnClickListener(this);
        ((ImageButton) view.findViewById(R.id.edit_button)).setOnClickListener(this);
        ((ImageButton) view.findViewById(R.id.share_button)).setOnClickListener(this);
        ((ImageButton) view.findViewById(R.id.remove_button)).setOnClickListener(this);
        return view;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            waypointActionsCallback = (OnWaypointActionListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnWaypointActionListener");
        }
    }

    @Override
    public void onStart() {
        super.onStart();
        Bundle args = getArguments();
        if (args != null) {
            double lat = args.getDouble("lat");
            double lon = args.getDouble("lon");
            updateWaypointInfo(lat, lon);
        }
    }

    @Override
    public void onDestroyView() {
        if (getDialog() != null && getRetainInstance())
            getDialog().setDismissMessage(null);
        super.onDestroyView();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.navigate_button:
            waypointActionsCallback.onWaypointNavigate(waypoint);
            break;
        case R.id.edit_button:
            waypointActionsCallback.onWaypointEdit(waypoint);
            break;
        case R.id.share_button:
            waypointActionsCallback.onWaypointShare(waypoint);
            break;
        case R.id.remove_button:
            waypointActionsCallback.onWaypointRemove(waypoint);
            break;
        }
        dismiss();
    }

    @SuppressLint("NewApi")
    private void updateWaypointInfo(double lat, double lon) {
        Androzic application = Androzic.getApplication();
        Activity activity = getActivity();
        Dialog dialog = getDialog();
        View view = getView();

        WebView description = (WebView) view.findViewById(R.id.description);

        if ("".equals(waypoint.description)) {
            description.setVisibility(View.GONE);
        } else {
            String descriptionHtml;
            try {
                TypedValue tv = new TypedValue();
                Theme theme = activity.getTheme();
                Resources resources = getResources();
                theme.resolveAttribute(android.R.attr.textColorSecondary, tv, true);
                int secondaryColor = resources.getColor(tv.resourceId);
                String css = String.format(
                        "<style type=\"text/css\">html,body{margin:0;background:transparent} *{color:#%06X}</style>\n",
                        (secondaryColor & 0x00FFFFFF));
                descriptionHtml = css + waypoint.description;
                description.setWebViewClient(new WebViewClient() {
                    @Override
                    public void onPageFinished(WebView view, String url) {
                        view.setBackgroundColor(Color.TRANSPARENT);
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
                            view.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
                    }
                });
                description.setBackgroundColor(Color.TRANSPARENT);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
                    description.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
            } catch (Resources.NotFoundException e) {
                description.setBackgroundColor(Color.LTGRAY);
                descriptionHtml = waypoint.description;
            }

            WebSettings settings = description.getSettings();
            settings.setDefaultTextEncodingName("utf-8");
            settings.setAllowFileAccess(true);
            Uri baseUrl = Uri.fromFile(new File(application.dataPath));
            description.loadDataWithBaseURL(baseUrl.toString() + "/", descriptionHtml, "text/html", "utf-8", null);
        }

        String coords = StringFormatter.coordinates(" ", waypoint.latitude, waypoint.longitude);
        ((TextView) view.findViewById(R.id.coordinates)).setText(coords);

        if (waypoint.altitude != Integer.MIN_VALUE) {
            ((TextView) view.findViewById(R.id.altitude)).setText(StringFormatter.elevationH(waypoint.altitude));
        }

        double dist = Geo.distance(lat, lon, waypoint.latitude, waypoint.longitude);
        double bearing = Geo.bearing(lat, lon, waypoint.latitude, waypoint.longitude);
        bearing = application.fixDeclination(bearing);
        String distance = StringFormatter.distanceH(dist) + " " + StringFormatter.angleH(bearing);
        ((TextView) view.findViewById(R.id.distance)).setText(distance);

        if (waypoint.date != null)
            ((TextView) view.findViewById(R.id.date))
                    .setText(DateFormat.getDateFormat(activity).format(waypoint.date) + " "
                            + DateFormat.getTimeFormat(activity).format(waypoint.date));
        else
            ((TextView) view.findViewById(R.id.date)).setVisibility(View.GONE);

        dialog.setTitle(waypoint.name);
    }
}