/*
* Copyright (C) 2015 University of South Florida, Sean J. Barbeau (sjbarbeau@gmail.com)
*
* 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 org.onebusaway.android.map.googlemapsv2;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.common.GooglePlayServicesRepairableException;
import com.google.android.gms.location.places.Place;
import com.google.android.gms.location.places.ui.PlaceAutocomplete;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.LatLngBounds;
import com.google.android.gms.maps.model.Marker;
import org.onebusaway.android.R;
import org.onebusaway.android.directions.util.CustomAddress;
import org.onebusaway.android.io.elements.ObaRegion;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.support.v4.app.Fragment;
import android.view.View;
/**
* Helper methods specific to Google Maps API v2
*/
public class ProprietaryMapHelpV2 {
private static final String TAG = "ProprietaryMapHelpV2";
private static final String PLACES_ADDRESS_SEPARATOR = ",";
/**
* Returns true if Android Maps V2 is installed, false if it is not
*/
public static boolean isMapsInstalled(Context context) {
try {
ApplicationInfo info = context.getPackageManager()
.getApplicationInfo("com.google.android.apps.maps", 0);
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
/**
* Prompts the user to install Android Maps V2 from Google Play
*/
public static void promptUserInstallMaps(final Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(context.getString(R.string.please_install_google_maps_dialog_title));
builder.setCancelable(false);
builder.setPositiveButton(context.getString(R.string.install_google_maps_positive_button),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse(context.getString(R.string.android_maps_v2_market_url)));
ResolveInfo info = context.getPackageManager()
.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
if (info != null) {
context.startActivity(intent);
} else {
// User doesn't have Play Store installed
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(context.getString(
R.string.no_play_store));
builder.setCancelable(true);
builder.setPositiveButton(context.getString(R.string.ok),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
AlertDialog d = builder.create();
d.show();
}
}
}
);
AlertDialog dialog = builder.create();
dialog.show();
}
/**
* Decode the result of an Intent to Google Places Autocomplete into a CustomAddress.
* Here because of LatLng, Place which are specific to Google Places API.
*/
public static CustomAddress getCustomAddressFromPlacesIntent(Context context, Intent intent) {
Place place = PlaceAutocomplete.getPlace(context, intent);
CustomAddress address = new CustomAddress();
String placeName = place.getName().toString();
address.setAddressLine(0, placeName);
String addressString = place.getAddress().toString();
String[] tokens = addressString.split(PLACES_ADDRESS_SEPARATOR);
// Posible that first line of address is place name.
int start = placeName.equals(tokens[0]) ? 1 : 0;
int j = 1; // address line index
for (int i = start; i < tokens.length; i++) {
address.setAddressLine(j++, tokens[i]);
}
LatLng loc = place.getLatLng();
address.setLatitude(loc.latitude);
address.setLongitude(loc.longitude);
return address;
}
/**
* Helper class to start Google Places Autocomplete when a field is clicked.
* Does not check that Google API is available.
* Here because of the use of LatLngBounds. Decode result with
* getCustomAddressFromPlacesIntent.
*/
public static class StartPlacesAutocompleteOnClick implements View.OnClickListener {
int mRequestCode;
Fragment mFragment;
ObaRegion mRegion;
public StartPlacesAutocompleteOnClick(int requestCode, Fragment fragment, ObaRegion region) {
mRequestCode = requestCode;
mFragment = fragment;
mRegion = region;
}
@Override
public void onClick(View v) {
Intent intent = null;
PlaceAutocomplete.IntentBuilder builder =
new PlaceAutocomplete.IntentBuilder(PlaceAutocomplete.MODE_OVERLAY);
if (mRegion != null) {
// Bias search results to region bounds
LatLngBounds bounds = MapHelpV2.getRegionBounds(mRegion);
builder.setBoundsBias(bounds);
}
try {
intent = builder.build(mFragment.getActivity());
} catch (GooglePlayServicesRepairableException e) {
e.printStackTrace();
} catch (GooglePlayServicesNotAvailableException e) {
e.printStackTrace();
}
mFragment.startActivityForResult(intent, mRequestCode);
}
}
/**
* Sets the zIndex for the given marker to the given zIndex. This is in ProprietaryMapHelpV2
* because there is no such corresponding Marker.setZIndex() method on Amazon Maps v2.
* @param m marker to set the zIndex for
* @param zIndex zIndex to set on the given marker (default is 0)
*/
public static void setZIndex(Marker m, float zIndex) {
m.setZIndex(zIndex);
}
}