package eu.faircode.backpacktrack2; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; import android.location.Location; import android.preference.PreferenceManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CursorAdapter; import android.widget.ImageView; import android.widget.TextView; import java.text.SimpleDateFormat; public class LocationAdapter extends CursorAdapter { private static final String TAG = "BPT2.LocationAdapter"; private Context mContext; private int colTime; private int colProvider; private int colLatitude; private int colLongitude; private int colAltitude; private int colBearing; private int colAccuracy; private int colName; private Location lastLocation; public LocationAdapter(Context context, Cursor cursor) { super(context, cursor, 0); mContext = context; colTime = cursor.getColumnIndex("time"); colProvider = cursor.getColumnIndex("provider"); colLatitude = cursor.getColumnIndex("latitude"); colLongitude = cursor.getColumnIndex("longitude"); colAltitude = cursor.getColumnIndex("altitude"); colBearing = cursor.getColumnIndex("bearing"); colAccuracy = cursor.getColumnIndex("accuracy"); colName = cursor.getColumnIndex("name"); init(); } public void init() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); lastLocation = BackgroundService.LocationDeserializer.deserialize(prefs.getString(SettingsFragment.PREF_LAST_LOCATION, null)); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return LayoutInflater.from(context).inflate(R.layout.location, parent, false); } @Override public void bindView(final View view, final Context context, final Cursor cursor) { // Get values final long time = cursor.getLong(colTime); final String provider = cursor.getString(colProvider); final double latitude = cursor.getDouble(colLatitude); final double longitude = cursor.getDouble(colLongitude); final boolean hasAltitude = !cursor.isNull(colAltitude); boolean hasBearing = !cursor.isNull(colBearing); boolean hasAccuracy = !cursor.isNull(colAccuracy); double altitude = cursor.getDouble(colAltitude); double bearing = cursor.getDouble(colBearing); double accuracy = cursor.getDouble(colAccuracy); final String name = cursor.getString(colName); // Calculate distance to last location Location dest = new Location(""); dest.setLatitude(latitude); dest.setLongitude(longitude); double distance = (lastLocation == null ? 0 : lastLocation.distanceTo(dest)); // Get views TextView tvTime = (TextView) view.findViewById(R.id.tvTime); ImageView ivWaypoint = (ImageView) view.findViewById(R.id.ivWaypoint); TextView tvProvider = (TextView) view.findViewById(R.id.tvProvider); TextView tvAltitude = (TextView) view.findViewById(R.id.tvAltitude); ImageView ivBearing = (ImageView) view.findViewById(R.id.ivBearing); TextView tvAccuracy = (TextView) view.findViewById(R.id.tvAccuracy); TextView tvDistance = (TextView) view.findViewById(R.id.tvDistance); // Set values tvTime.setText( new SimpleDateFormat("dd").format(time) + " " + SimpleDateFormat.getTimeInstance(SimpleDateFormat.SHORT).format(time)); ivWaypoint.setVisibility(name == null ? View.INVISIBLE : View.VISIBLE); int resId = context.getResources().getIdentifier("provider_" + provider, "string", context.getPackageName()); tvProvider.setText(resId == 0 ? "-" : context.getString(resId).substring(0, 1)); tvAltitude.setText(hasAltitude ? Long.toString(Math.round(altitude)) : "?"); if (hasBearing) { ivBearing.setRotation((float) bearing - 90); ivBearing.setVisibility(View.VISIBLE); } else ivBearing.setVisibility(View.INVISIBLE); tvAccuracy.setText(hasAccuracy ? Long.toString(Math.round(accuracy)) : "?"); if (lastLocation != null && distance >= 1e7) tvDistance.setText(Long.toString(Math.round(distance / 1e6)) + "M"); else if (lastLocation != null && distance >= 1e4) tvDistance.setText(Long.toString(Math.round(distance / 1e3)) + "k"); else tvDistance.setText(lastLocation == null ? "?" : Long.toString(Math.round(distance))); } }