/** * Copyright (c) 2014-present, Facebook, Inc. All rights reserved. * * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, * copy, modify, and distribute this software in source code or binary form for use * in connection with the web services and APIs provided by Facebook. * * As with any software that integrates with the Facebook platform, your use of * this software is subject to the Facebook Developer Principles and Policies * [http://developers.facebook.com/policy/]. This copyright notice shall be * included in all copies or substantial portions of the software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.example.places.fragments; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.DialogFragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.example.places.PlacesGraphSDKHelper; import com.example.places.R; import com.example.places.adapters.PlaceListAdapter; import com.example.places.model.CurrentPlaceResult; import com.example.places.model.Place; import com.facebook.GraphResponse; import com.facebook.places.PlaceManager; /** * This dialog fragment illustrates how to: * <ul> * <li>Fetch a collection of current place candidates where the user might be located.</li> * <li>Display a list of current place candidates.</li> * <li>Provide feedback about the current place estimate.</li> * </ul> */ public class CurrentPlaceDialogFragment extends DialogFragment implements PlaceListAdapter.Listener { public static final String EXTRA_CURRENT_PLACE = "current_place"; private RecyclerView recyclerView; private View loadingView; private CurrentPlaceResult currentPlaceResult; private CurrentPlaceRequestListener currentPlaceRequestListener = new CurrentPlaceRequestListener(); public static CurrentPlaceDialogFragment newInstance() { return new CurrentPlaceDialogFragment(); } @Override public void onDetach() { super.onDetach(); currentPlaceRequestListener = null; } public View onCreateView( LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { getDialog().setTitle(getString(R.string.current_place)); return inflater.inflate(R.layout.current_place_fragment, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); recyclerView = (RecyclerView) view.findViewById(R.id.current_place_recyclerview); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); loadingView = view.findViewById(R.id.current_place_loading_container); getCurrentPlace(); } private void getCurrentPlace() { PlacesGraphSDKHelper.getCurrentPlace(currentPlaceRequestListener); } @Override public void onPlaceSelected(Place place) { // Provides feedback to the Places Graph once the user confirms presence at // a place. This feedback helps Facebook improve the accuracy of current place estimates. PlacesGraphSDKHelper.provideCurrentPlaceFeedback( currentPlaceResult, place, true); Intent data = new Intent(); data.putExtra(EXTRA_CURRENT_PLACE, place); getTargetFragment().onActivityResult( getTargetRequestCode(), Activity.RESULT_OK, data); dismiss(); } private void refreshCurrentPlaceList(CurrentPlaceResult result) { currentPlaceResult = result; PlaceListAdapter adapter = new PlaceListAdapter( R.layout.current_place_list_item, result.getPlaces(), this); recyclerView.setAdapter(adapter); recyclerView.setVisibility(View.VISIBLE); loadingView.setVisibility(View.GONE); } private class CurrentPlaceRequestListener implements PlacesGraphSDKHelper.CurrentPlaceRequestListener { @Override public void onCurrentPlaceResult( @Nullable final CurrentPlaceResult result, final GraphResponse response) { if (isAdded()) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { if (result == null) { Toast.makeText( getActivity(), R.string.error, Toast.LENGTH_SHORT).show(); dismiss(); } else { refreshCurrentPlaceList(result); } } }); } } @Override public void onLocationError(PlaceManager.LocationError error) { if (isAdded()) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText( getActivity(), R.string.location_error_unknown, Toast.LENGTH_SHORT).show(); dismiss(); } }); } } } }