/* * Copyright (C) 2014 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.wearable.speedtracker; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; import com.google.android.gms.maps.model.PolylineOptions; import android.app.DatePickerDialog; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.format.DateUtils; import android.util.Log; import android.view.View; import android.widget.DatePicker; import android.widget.TextView; import com.example.android.wearable.speedtracker.common.LocationEntry; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * The main activity for the handset application. When a watch device reconnects to the handset * app, the collected GPS data on the watch, if any, is synced up and user can see their track on * a map. This data is then saved into an internal database and the corresponding data items are * deleted. */ public class PhoneMainActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener, OnMapReadyCallback { private static final String TAG = "PhoneMainActivity"; private static final int BOUNDING_BOX_PADDING_PX = 50; private TextView mSelectedDateText; private GoogleMap mMap; private SupportMapFragment mMapFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); mSelectedDateText = (TextView) findViewById(R.id.selected_date); mMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); mMapFragment.getMapAsync(this); } public void onClick(View view) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); new DatePickerDialog(PhoneMainActivity.this, PhoneMainActivity.this, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)).show(); } @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { // the following if-clause is to get around a bug that causes this callback to be called // twice if (view.isShown()) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, monthOfYear); calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); String date = DateUtils.formatDateTime(this, calendar.getTimeInMillis(), DateUtils.FORMAT_SHOW_DATE); mSelectedDateText.setText(getString(R.string.showing_for_date, date)); showTrack(calendar); } } /** * An {@link android.os.AsyncTask} that is responsible for getting a list of {@link * com.example.android.wearable.speedtracker.common.LocationEntry} objects for a given day and * building a track from those points. In addition, it sets the smallest bounding box for the * map that covers all the points on the track. */ private void showTrack(Calendar calendar) { new AsyncTask() { private List coordinates; private LatLngBounds bounds; @Override protected Void doInBackground(Calendar... params) { LocationDataManager dataManager = ((PhoneApplication) getApplicationContext()) .getDataManager(); List entries = dataManager.getPoints(params[0]); if (entries != null && !entries.isEmpty()) { coordinates = new ArrayList(); LatLngBounds.Builder builder = new LatLngBounds.Builder(); for (LocationEntry entry : entries) { LatLng latLng = new LatLng(entry.latitude, entry.longitude); builder.include(latLng); coordinates.add(latLng); } bounds = builder.build(); } return null; } @Override protected void onPostExecute(Void aVoid) { mMap.clear(); if (coordinates == null || coordinates.isEmpty()) { if (Log.isLoggable(TAG, Log.DEBUG)) { Log.d(TAG, "No Entries found for that date"); } } else { mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, BOUNDING_BOX_PADDING_PX)); mMap.addPolyline(new PolylineOptions().geodesic(true).addAll(coordinates)); } } }.execute(calendar); } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; } }