This repository has been archived on 2022-11-03. You can view files and clone it, but cannot push or open issues or pull requests.
DevOpsOpenHack/MobileApps/MyDriving/MyDriving.Android/Activities/PastTripDetailsActivity.cs
2022-11-03 16:41:13 -04:00

204 lines
7.9 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for details.
using System.Linq;
using Android.App;
using Android.OS;
using Android.Views;
using Android.Widget;
using Android.Content.PM;
using Android.Graphics;
using Android.Support.V4.Content;
using Android.Gms.Maps;
using MyDriving.ViewModel;
using Android.Gms.Maps.Model;
using Android.Graphics.Drawables;
using System;
using MyDriving.DataObjects;
namespace MyDriving.Droid.Activities
{
[Activity(Label = "Details", ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation,
ScreenOrientation = ScreenOrientation.Portrait)]
public class PastTripDetailsActivity : BaseActivity, IOnMapReadyCallback
{
Marker carMarker;
TextView distance, distanceUnits, time, speed, speedUnits, consumption, consumptionUnits;
string id;
GoogleMap map;
SupportMapFragment mapFrag;
SeekBar seekBar;
TextView startTime, endTime;
PastTripsDetailViewModel viewModel;
protected override int LayoutResource => Resource.Layout.activity_past_trip_details;
public async void OnMapReady(GoogleMap googleMap)
{
map = googleMap;
var success = await viewModel.ExecuteLoadTripCommandAsync(id);
if (!success)
{
Finish();
return;
}
startTime.Text = viewModel.Trip.StartTimeDisplay;
endTime.Text = viewModel.Trip.EndTimeDisplay;
SupportActionBar.Title = viewModel.Title;
SetupMap();
UpdateStats();
}
public static Trip Trip { get; set; }
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
if ((int) Build.VERSION.SdkInt >= 21)
{
Window.SetStatusBarColor(new Color(ContextCompat.GetColor(this, Resource.Color.primary_dark)));
Window.DecorView.SystemUiVisibility = StatusBarVisibility.Visible;
}
viewModel = new PastTripsDetailViewModel {Title = id = Intent.GetStringExtra("Id")};
viewModel.Trip = Trip;
seekBar = FindViewById<SeekBar>(Resource.Id.trip_progress);
seekBar.Enabled = false;
startTime = FindViewById<TextView>(Resource.Id.text_start_time);
endTime = FindViewById<TextView>(Resource.Id.text_end_time);
startTime.Text = endTime.Text = string.Empty;
time = FindViewById<TextView>(Resource.Id.text_time);
distance = FindViewById<TextView>(Resource.Id.text_distance);
distanceUnits = FindViewById<TextView>(Resource.Id.text_distance_units);
consumption = FindViewById<TextView>(Resource.Id.text_consumption);
consumptionUnits = FindViewById<TextView>(Resource.Id.text_consumption_units);
speed = FindViewById<TextView>(Resource.Id.text_speed);
speedUnits = FindViewById<TextView>(Resource.Id.text_speed_units);
mapFrag = (SupportMapFragment) SupportFragmentManager.FindFragmentById(Resource.Id.map);
mapFrag.GetMapAsync(this);
}
void UpdateStats()
{
time.Text = viewModel.ElapsedTime;
consumption.Text = viewModel.FuelConsumption;
consumptionUnits.Text = viewModel.FuelConsumptionUnits;
speed.Text = viewModel.Speed;
speedUnits.Text = viewModel.SpeedUnits;
distanceUnits.Text = viewModel.DistanceUnits;
distance.Text = viewModel.Distance;
}
void SetupMap()
{
if (mapFrag.View.Width == 0)
{
mapFrag.View.PostDelayed(SetupMap, 500);
return;
}
if (viewModel.Trip == null || viewModel.Trip.Points == null || viewModel.Trip.Points.Count == 0)
return;
var start = viewModel.Trip.Points[0];
var end = viewModel.Trip.Points[viewModel.Trip.Points.Count - 1];
seekBar.Max = viewModel.Trip.Points.Count - 1;
seekBar.ProgressChanged += SeekBar_ProgressChanged;
var logicalDensity = Resources.DisplayMetrics.Density;
var thicknessCar = (int) Math.Ceiling(26*logicalDensity + .5f);
var thicknessPoints = (int) Math.Ceiling(20*logicalDensity + .5f);
var b = ContextCompat.GetDrawable(this, Resource.Drawable.ic_car_blue) as BitmapDrawable;
var finalIcon = Bitmap.CreateScaledBitmap(b.Bitmap, thicknessCar, thicknessCar, false);
var car = new MarkerOptions();
car.SetPosition(new LatLng(start.Latitude, start.Longitude));
car.SetIcon(BitmapDescriptorFactory.FromBitmap(finalIcon));
car.Anchor(.5f, .5f);
b = ContextCompat.GetDrawable(this, Resource.Drawable.ic_start_point) as BitmapDrawable;
finalIcon = Bitmap.CreateScaledBitmap(b.Bitmap, thicknessPoints, thicknessPoints, false);
var startMarker = new MarkerOptions();
startMarker.SetPosition(new LatLng(start.Latitude, start.Longitude));
startMarker.SetIcon(BitmapDescriptorFactory.FromBitmap(finalIcon));
startMarker.Anchor(.5f, .5f);
b = ContextCompat.GetDrawable(this, Resource.Drawable.ic_end_point) as BitmapDrawable;
finalIcon = Bitmap.CreateScaledBitmap(b.Bitmap, thicknessPoints, thicknessPoints, false);
var endMarker = new MarkerOptions();
endMarker.SetPosition(new LatLng(end.Latitude, end.Longitude));
endMarker.SetIcon(BitmapDescriptorFactory.FromBitmap(finalIcon));
endMarker.Anchor(.5f, .5f);
b = ContextCompat.GetDrawable(this, Resource.Drawable.ic_tip) as BitmapDrawable;
finalIcon = Bitmap.CreateScaledBitmap(b.Bitmap, thicknessPoints, thicknessPoints, false);
var poiIcon = BitmapDescriptorFactory.FromBitmap(finalIcon);
foreach (var poi in viewModel.POIs)
{
var poiMarker = new MarkerOptions();
poiMarker.SetPosition(new LatLng(poi.Latitude, poi.Longitude));
poiMarker.SetIcon(poiIcon);
poiMarker.Anchor(.5f, .5f);
map.AddMarker(poiMarker);
}
var points = viewModel.Trip.Points.Select(s => new LatLng(s.Latitude, s.Longitude)).ToArray();
var rectOptions = new PolylineOptions();
rectOptions.Add(points);
rectOptions.InvokeColor(ContextCompat.GetColor(this, Resource.Color.primary_dark));
map.AddPolyline(rectOptions);
map.AddMarker(startMarker);
map.AddMarker(endMarker);
carMarker = map.AddMarker(car);
var boundsPoints = new LatLngBounds.Builder();
foreach (var point in points)
boundsPoints.Include(point);
var bounds = boundsPoints.Build();
map.MoveCamera(CameraUpdateFactory.NewLatLngBounds(bounds, 64));
map.MoveCamera(CameraUpdateFactory.NewLatLng(carMarker.Position));
seekBar.Enabled = true;
}
void SeekBar_ProgressChanged(object sender, SeekBar.ProgressChangedEventArgs e)
{
if (carMarker == null)
return;
viewModel.CurrentPosition = viewModel.Trip.Points[e.Progress];
RunOnUiThread(() =>
{
UpdateStats();
carMarker.Position = new LatLng(viewModel.CurrentPosition.Latitude,
viewModel.CurrentPosition.Longitude);
map.MoveCamera(CameraUpdateFactory.NewLatLng(carMarker.Position));
});
}
public override bool OnOptionsItemSelected(IMenuItem item)
{
if (item.ItemId == Android.Resource.Id.Home)
Finish();
return base.OnOptionsItemSelected(item);
}
}
}