/* * 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.design.widget.FloatingActionButton; import android.support.v4.app.Fragment; import android.support.v4.app.NavUtils; import android.text.TextUtils; import android.view.LayoutInflater; 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.bumptech.glide.load.engine.DiskCacheStrategy; 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); FloatingActionButton mapFab = (FloatingActionButton) view.findViewById(R.id.mapFab); 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) .diskCacheStrategy(DiskCacheStrategy.SOURCE) .placeholder(R.color.lighter_gray) .override(imageSize, imageSize) .into(imageView); mapFab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(Constants.MAPS_INTENT_URI + Uri.encode(mAttraction.name + ", " + mAttraction.city))); startActivity(intent); } }); return view; } @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; } 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; } }