blob: 0df77725d385ec1c51f93395d68b4d8ac379803b [file] [log] [blame]
/*
* Copyright 2015 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.xyztouristattractions.ui;
import android.app.TaskStackBuilder;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.NavUtils;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.android.xyztouristattractions.R;
import com.example.android.xyztouristattractions.common.Attraction;
import com.example.android.xyztouristattractions.common.Constants;
import com.example.android.xyztouristattractions.common.Utils;
import com.google.android.gms.maps.model.LatLng;
import java.util.List;
import java.util.Map;
import static com.example.android.xyztouristattractions.provider.TouristAttractions.ATTRACTIONS;
/**
* The tourist attraction detail fragment which contains the details of a
* a single attraction (contained inside
* {@link com.example.android.xyztouristattractions.ui.DetailActivity}).
*/
public class DetailFragment extends Fragment {
private static final String EXTRA_ATTRACTION = "attraction";
private Attraction mAttraction;
public static DetailFragment createInstance(String attractionName) {
DetailFragment detailFragment = new DetailFragment();
Bundle bundle = new Bundle();
bundle.putString(EXTRA_ATTRACTION, attractionName);
detailFragment.setArguments(bundle);
return detailFragment;
}
public DetailFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setHasOptionsMenu(true);
View view = inflater.inflate(R.layout.fragment_detail, container, false);
String attractionName = getArguments().getString(EXTRA_ATTRACTION);
mAttraction = findAttraction(attractionName);
if (mAttraction == null) {
getActivity().finish();
return null;
}
TextView nameTextView = (TextView) view.findViewById(R.id.nameTextView);
TextView descTextView = (TextView) view.findViewById(R.id.descriptionTextView);
TextView distanceTextView = (TextView) view.findViewById(R.id.distanceTextView);
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
LatLng location = Utils.getLocation(getActivity());
String distance = Utils.formatDistanceBetween(location, mAttraction.location);
if (TextUtils.isEmpty(distance)) {
distanceTextView.setVisibility(View.GONE);
}
nameTextView.setText(attractionName);
distanceTextView.setText(distance);
descTextView.setText(mAttraction.longDescription);
int imageSize = getResources().getDimensionPixelSize(R.dimen.image_size)
* Constants.IMAGE_ANIM_MULTIPLIER;
Glide.with(getActivity())
.load(mAttraction.imageUrl)
.placeholder(R.color.lighter_gray)
.override(imageSize, imageSize)
.into(imageView);
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.detail, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// Some small additions to handle "up" navigation correctly
Intent upIntent = NavUtils.getParentActivityIntent(getActivity());
upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
// Check if up activity needs to be created (usually when
// detail screen is opened from a notification or from the
// Wearable app
if (NavUtils.shouldUpRecreateTask(getActivity(), upIntent)
|| getActivity().isTaskRoot()) {
// Synthesize parent stack
TaskStackBuilder.create(getActivity())
.addNextIntentWithParentStack(upIntent)
.startActivities();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// On Lollipop+ we finish so to run the nice animation
getActivity().finishAfterTransition();
return true;
}
// Otherwise let the system handle navigating "up"
return false;
case R.id.map:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(Constants.MAPS_INTENT_URI +
Uri.encode(mAttraction.name + ", " + mAttraction.city)));
startActivity(intent);
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* Really hacky loop for finding attraction in our static content provider.
* Obviously would not be used in a production app.
*/
private Attraction findAttraction(String attractionName) {
for (Map.Entry<String, List<Attraction>> attractionsList : ATTRACTIONS.entrySet()) {
List<Attraction> attractions = attractionsList.getValue();
for (Attraction attraction : attractions) {
if (attractionName.equals(attraction.name)) {
return attraction;
}
}
}
return null;
}
}