package com.sanchez.fmf.fragment;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.AppCompatButton;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.sanchez.fmf.MarketDetailActivity;
import com.sanchez.fmf.MarketListActivity;
import com.sanchez.fmf.R;
import com.sanchez.fmf.adapter.MarketListAdapter;
import com.sanchez.fmf.event.GetMarketListFailEvent;
import com.sanchez.fmf.event.GetMarketListSuccessEvent;
import com.sanchez.fmf.event.MapFABClickEvent;
import com.sanchez.fmf.event.MarketClickEvent;
import com.sanchez.fmf.event.PlaceTitleResolvedEvent;
import com.sanchez.fmf.event.RetryGetMarketListEvent;
import com.sanchez.fmf.model.MarketListItemModel;
import com.sanchez.fmf.util.MarketUtils;
import com.sanchez.fmf.util.ViewUtils;
import java.util.ArrayList;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import de.greenrobot.event.EventBus;
public class MarketListFragment extends Fragment implements GoogleApiClient.OnConnectionFailedListener {
public static final String TAG = MarketListFragment.class.getSimpleName();
@Bind(R.id.toolbar_market_list_fragment)
Toolbar mToolbar;
@Bind(R.id.market_list)
RecyclerView mMarketList;
@Bind(R.id.fragment_no_markets)
View mNoMarkets;
@Bind(R.id.layout_try_again)
ViewGroup mTryAgain;
@Bind(R.id.try_again_button)
Button mTryAgainButton;
@Bind(R.id.market_backdrop)
ImageView mMarketBackDrop;
@Bind(R.id.map_view_fab)
FloatingActionButton mMapFab;
@Bind(R.id.progress_bar)
View mProgressBar;
@Bind(R.id.progress_bar_full)
View mProgressBarFull;
private static int MED_ANIM_TIME;
//private static final int GOOGLE_API_CLIENT_ID = 0;
//private GoogleApiClient mGoogleApiClient = null;
private MarketListAdapter mAdapter;
private List<MarketListItemModel> mMarkets;
private String mPlaceTitle = null;
private String mPlaceId = null;
private boolean mUsedDeviceCoordinates = false;
// grab coordinates sent from MainFragment intent
public static MarketListFragment newInstance(String placeTitle,
String placeId,
boolean usedDeviceCoordinates) {
MarketListFragment fragment = new MarketListFragment();
Bundle args = new Bundle();
args.putString(MarketListActivity.EXTRA_PLACE_TITLE, placeTitle);
args.putString(MarketListActivity.EXTRA_PLACE_ID, placeId);
args.putBoolean(MarketListActivity.EXTRA_USED_DEVICE_COORDINATES, usedDeviceCoordinates);
fragment.setArguments(args);
return fragment;
}
public MarketListFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mPlaceTitle = getArguments().getString(MarketListActivity.EXTRA_PLACE_TITLE);
mPlaceId = getArguments().getString(MarketListActivity.EXTRA_PLACE_ID);
mUsedDeviceCoordinates = getArguments().getBoolean(MarketListActivity.EXTRA_USED_DEVICE_COORDINATES);
}
MED_ANIM_TIME = getResources().getInteger(android.R.integer.config_mediumAnimTime);
// register client for Google APIs
// mGoogleApiClient = new GoogleApiClient
// .Builder(getActivity())
// .addApi(Places.GEO_DATA_API)
// .enableAutoManage(getActivity(), GOOGLE_API_CLIENT_ID, this)
// .build();
//
// if(mPlaceId != null) {
// // change width & height params in future
// getPlacePhotoAsync(mPlaceId, 600, 400);
// }
}
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().registerSticky(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_market_list, container, false);
ButterKnife.bind(this, view);
AppCompatActivity a = (AppCompatActivity)getActivity();
a.setSupportActionBar(mToolbar);
a.getSupportActionBar().setTitle("");
a.getSupportActionBar().setDisplayShowHomeEnabled(true);
a.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (null != mPlaceTitle) {
a.getSupportActionBar().setTitle(mPlaceTitle);
}
// set backgroundTint programmatically as xml method is undefined...
int pureWhite = getResources().getColor(R.color.pure_white);
ColorStateList cSL2 = new ColorStateList(new int[][]{new int[0]}, new int[]{pureWhite});
((AppCompatButton)mTryAgainButton).setSupportBackgroundTintList(cSL2);
int marketColor = getResources().getColor(MarketUtils.getRandomMarketColor());
ColorStateList cSL = new ColorStateList(new int[][]{new int[0]}, new int[]{marketColor});
mMapFab.setBackgroundTintList(cSL);
// linear RecyclerView
RecyclerView.LayoutManager linearLM = new LinearLayoutManager(getContext());
mMarketList.setLayoutManager(linearLM);
mMarketList.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_LEFT);
// dummy adapter so Android doesn't complain
mMarketList.setAdapter(new MarketListAdapter(new ArrayList<>(), false));
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mMapFab.setOnClickListener((v) -> {
mProgressBarFull.setVisibility(View.VISIBLE);
mMapFab.setEnabled(false);
EventBus.getDefault().post(new MapFABClickEvent());
});
mTryAgainButton.setOnClickListener((v) -> {
mProgressBar.setVisibility(View.VISIBLE);
mTryAgain.setVisibility(View.GONE);
EventBus.getDefault().post(new RetryGetMarketListEvent());
});
loadBackdrop();
if(null != mMarkets) {
showMarkets(mMarkets);
}
}
private void loadBackdrop() {
Glide.with(getActivity()).load(MarketUtils.getRandomMarketDrawable())
.centerCrop()
.into(mMarketBackDrop);
}
// TODO: check to see if this photo API is usable in future
// current state: most place IDs don't return any photos....
// private void getPlacePhotoAsync(String placeId, int width, int height) {
// Places.GeoDataApi.getPlacePhotos(mGoogleApiClient, placeId)
// .setResultCallback(new ResultCallback<PlacePhotoMetadataResult>() {
//
// @Override
// public void onResult(PlacePhotoMetadataResult photos) {
// if (!photos.getStatus().isSuccess()) {
// return;
// }
//
// PlacePhotoMetadataBuffer photoMetadataBuffer = photos.getPhotoMetadata();
// if (photoMetadataBuffer.getCount() > 0) {
// // Display the first bitmap in an ImageView in the size of the view
// photoMetadataBuffer.get(0)
// .getScaledPhoto(mGoogleApiClient, width, height)
// .setResultCallback(mDisplayPhotoResultCallback);
// }
// photoMetadataBuffer.release();
// }
// });
// }
//
// private ResultCallback<PlacePhotoResult> mDisplayPhotoResultCallback
// = new ResultCallback<PlacePhotoResult>() {
// @Override
// public void onResult(PlacePhotoResult placePhotoResult) {
// if (!placePhotoResult.getStatus().isSuccess()) {
// return;
// }
// mImageView.setImageBitmap(placePhotoResult.getBitmap());
// }
// };
private void showMarkets(List<MarketListItemModel> markets) {
View incomingView;
if(markets.size() > 0) {
mAdapter = new MarketListAdapter(new ArrayList<>(markets), mUsedDeviceCoordinates);
mMarketList.setAdapter(mAdapter);
mMarketList.setHasFixedSize(true);
incomingView = mMarketList;
} else {
incomingView = mNoMarkets;
}
ViewUtils.crossfadeTwoViews(incomingView, mProgressBar, MED_ANIM_TIME);
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.e(TAG, "Google Places API connection failed with error code: "
+ connectionResult.getErrorCode());
}
public void onEvent(GetMarketListSuccessEvent event) {
mMarkets = event.getMarketList().getMarkets();
showMarkets(mMarkets);
EventBus.getDefault().removeStickyEvent(GetMarketListSuccessEvent.class);
}
public void onEvent(GetMarketListFailEvent event) {
mProgressBar.setVisibility(View.GONE);
mTryAgain.setVisibility(View.VISIBLE);
EventBus.getDefault().removeStickyEvent(GetMarketListFailEvent.class);
}
public void onEvent(PlaceTitleResolvedEvent event) {
mPlaceTitle = event.getPlaceTitle();
ActionBar ab = ((AppCompatActivity)getActivity()).getSupportActionBar();
if(null != ab) {
ab.setTitle(event.getPlaceTitle());
}
}
// use clicked on a market card
public void onEvent(MarketClickEvent event) {
int position = mMarketList.getChildAdapterPosition(event.getMarket());
MarketListItemModel market = mAdapter.getDataSet().get(position);
Intent i = new Intent(getActivity(), MarketDetailActivity.class);
i.putExtra(MarketDetailActivity.EXTRA_MARKET_ID, market.getId());
i.putExtra(MarketDetailActivity.EXTRA_MARKET_NAME,
MarketUtils.getNameFromMarketString(market.getName()));
startActivity(i);
}
}