package com.safemobile.safedispatch; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import androidx.annotation.NonNull; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.model.Marker; import com.safemobile.lib.HistPos; import com.safemobile.lib.SuperVehicle; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Hashtable; import java.util.Locale; import java.util.concurrent.TimeUnit; public class GoogleMapsInfoBubble implements GoogleMap.InfoWindowAdapter { private final String TAG = GoogleMapsInfoBubble.class.getName(); private final View mWindow; private Hashtable superVehHash; private final Context context; private ArrayList histPosList; private boolean isLiveTab = true; public GoogleMapsInfoBubble(LayoutInflater layoutInflater, Context context, Hashtable vehicles) { this.context = context; this.superVehHash = vehicles; mWindow = layoutInflater.inflate(R.layout.map_marker_info_bubble, null); } public GoogleMapsInfoBubble(LayoutInflater layoutInflater, Context context) { isLiveTab = false; this.context = context; mWindow = layoutInflater.inflate(R.layout.map_marker_info_bubble, null); } public void setHistoryPositions(ArrayList positions) { this.histPosList = positions; } @Override public View getInfoWindow(@NonNull Marker marker) { render(marker, mWindow); return mWindow; } @Override public View getInfoContents(@NonNull Marker marker) { render(marker, mWindow); return mWindow; } private void render(Marker marker, View view) { long key = 0; int position = 0; if (isLiveTab) { try { key = Long.parseLong(marker.getTitle()); } catch (Exception ex) { Log.v(TAG, "Unable to parse Google Maps Info Bubble title"); } } else { try { position = Integer.parseInt(marker.getTitle()); } catch (Exception e) { Log.v(TAG, "Unable to parse Google Maps Info Bubble title on History"); } } RelativeLayout rlMapInfoBubbleInfo = view.findViewById(R.id.rlMapInfoBubbleInfo); TextView tvUnitName = view.findViewById(R.id.tvUnitName); TextView tvGPSLocation = view.findViewById(R.id.tvGPSLocation); TextView tvTimeAgo = view.findViewById(R.id.tvTimeAgo); TextView tvSpeed = view.findViewById(R.id.tvSpeed); TextView tvStreetView = view.findViewById(R.id.tvStreetView); ImageView streetView = view.findViewById(R.id.streetView); rlMapInfoBubbleInfo.setVisibility(View.VISIBLE); boolean isMilitaryTime = false; Date positionTime; long timeGMT = 0; String speed, address, gpsLocation, name = ""; if (isLiveTab) { SuperVehicle vehicle = superVehHash.get(key); //positionTime = new Date((new Date()).getTime() - vehicle.timeGMT); timeGMT = vehicle.timeGMT; address = vehicle.Address != null ? vehicle.Address : ""; name = vehicle.name; speed = String.format(context.getResources().getString(R.string.speedMph), (int)(0.621371192 * vehicle.speed)); gpsLocation = "[" + String.format("%.4f", vehicle.lat) + "," + String.format("%.4f",vehicle.lng) + "]"; } else { HistPos histPos = histPosList.get(position); //positionTime = new Date((new Date()).getTime() - histPos.timeGMT); timeGMT = histPos.timeGMT; address = histPos.Address != null ? histPos.Address : ""; speed = String.format(context.getResources().getString(R.string.speedMph), (int)(0.621371192 * histPos.speed)); gpsLocation = "[" + String.format("%.4f", histPos.lat) + "," + String.format("%.4f",histPos.lng) + "]"; } //String timeFormat = isMilitaryTime // ? "HH:mm:ss dd.MMM.yyyy" // : "hh:mm:ss a dd.MMM.yyy"; //DateFormat format = new SimpleDateFormat(timeFormat, Locale.ENGLISH); //tvTimeAgo.setText(format.format(positionTime)); DateFormat format = new SimpleDateFormat("hh:mm:ss", Locale.ENGLISH); tvTimeAgo.setText( getDateTimeAgo(timeGMT * 1000) + " [" + format.format(new Date(timeGMT*1000) ) + "]"); tvStreetView.setText(address); streetView.setVisibility(address.length() > 0 ? View.VISIBLE : View.GONE); tvStreetView.setVisibility(address.length() > 0 ? View.VISIBLE : View.GONE); if (!isLiveTab) tvUnitName.setVisibility(View.GONE); else tvUnitName.setText(name); tvSpeed.setText(speed); tvGPSLocation.setText(gpsLocation); } /// /// Get a text representation for the date time representing /// the difference in minutes/hours/days from now /// /// DateTime value which needs to be converted /// String 'Ago' representation fot he date public static String getDateTimeAgo(long time) { String timeValue = ""; long diffInMs = (new Date().getTime() - time); long secondsDifference = TimeUnit.MILLISECONDS.toSeconds(diffInMs);; if (secondsDifference < 60) timeValue = "less than 1 minute"; else if (secondsDifference < 3600) timeValue = (secondsDifference / 60) + " minute" + ((secondsDifference / 60) > 1 ? "s" : "") + " ago"; else if (secondsDifference < 7200) timeValue = "1 hour ago"; else if (secondsDifference < 86400) { timeValue = (secondsDifference / 3600) + " hours ago"; } else { timeValue = (secondsDifference / 86400) + " days ago"; } return timeValue; } }