package br.com.livrowebservices.carros.fragment; import android.content.Intent; import android.databinding.DataBindingUtil; import android.databinding.ViewDataBinding; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.app.Fragment; 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.webkit.URLUtil; import android.widget.ImageView; import android.widget.RadioGroup; import android.widget.TextView; import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import org.parceler.Parcels; import br.com.livrowebservices.carros.CarrosApplication; import br.com.livrowebservices.carros.R; import br.com.livrowebservices.carros.activity.CarroActivity; import br.com.livrowebservices.carros.databinding.FragmentCarroBinding; import br.com.livrowebservices.carros.domain.Carro; import br.com.livrowebservices.carros.domain.CarroService; import br.com.livrowebservices.carros.domain.event.BusEvent; import br.com.livrowebservices.carros.utils.ImageUtils; import livroandroid.lib.fragment.BaseFragment; import livroandroid.lib.utils.IntentUtils; /** * A simple {@link Fragment} subclass. */ public class CarroFragment extends BaseFragment implements OnMapReadyCallback, CarroActivity.ClickHeaderListener { private static final int REQUEST_CODE_SALVAR = 1; protected ImageView img; protected TextView tUrlVideo; protected TextView tLatLng; protected TextView tLat; protected TextView tLng; private GoogleMap map; protected Carro carro; protected FragmentCarroBinding binding; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Lê os argumentos carro = Parcels.unwrap(getArguments().getParcelable("carro")); setHasOptionsMenu(true); CarroActivity activity = (CarroActivity) getActivity(); activity.setClickHeaderListener(this); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = DataBindingUtil.inflate(inflater,R.layout.fragment_carro, container, false); View view = binding.getRoot(); initViews(view); if (carro != null) { setCarro(carro); } // Mapa SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map); // Inicia o Google Maps dentro do fragment mapFragment.getMapAsync(this); return view; } @Override public void onResume() { super.onResume(); if(carro != null) { startTask("loadFavoritos",taskLoadFavoritos(),R.id.progress); } } protected void initViews(View view) { img = (ImageView) view.findViewById(R.id.img); tUrlVideo = (TextView) view.findViewById(R.id.tUrlVideo); tLatLng = (TextView) view.findViewById(R.id.tLatLng); tLat = (TextView) view.findViewById(R.id.tLat); tLng = (TextView) view.findViewById(R.id.tLng); } @Override public void onMapReady(GoogleMap googleMap) { this.map = googleMap; if (carro != null && map != null) { // Ativa o botão para mostrar minha localização map.setMyLocationEnabled(true); // Cria o objeto LatLng com a coordenada da fábrica double lat = carro.getLatitude(); double lng = carro.getLongitude(); if (lat > 0 && lng > 0) { LatLng location = new LatLng(lat, lng); // Posiciona o mapa na coordenada da fábrica (zoom = 13) CameraUpdate update = CameraUpdateFactory.newLatLngZoom(location, 13); //map.moveCamera(update); map.animateCamera(update, 2000, null); // Marcador no local da fábrica map.addMarker(new MarkerOptions() .title(carro.nome) .snippet(carro.desc) .position(location)); } // Tipo do mapa: MAP_TYPE_NORMAL, // MAP_TYPE_TERRAIN, MAP_TYPE_HYBRID and MAP_TYPE_NONE map.setMapType(GoogleMap.MAP_TYPE_NORMAL); } } private void setCarro(Carro c) { if (c != null) { if (img != null) { ImageUtils.setImage(getContext(), c.urlFoto, img); img.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showVideo(); } }); } // Data Binding binding.setCarro(c); if (tLatLng != null) { tLatLng.setText(String.format("%s/%s", c.latitude, c.longitude)); } else { tLat.setText(c.latitude); tLng.setText(c.longitude); } } // Imagem do Header na Toolbar CarroActivity activity = (CarroActivity) getActivity(); activity.setAppBarInfo(c); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_frag_carro, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_edit) { Intent intent = new Intent(getActivity(), CarroActivity.class); intent.putExtra("carro", Parcels.wrap(carro)); intent.putExtra("editMode", true); ActivityOptionsCompat opts = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity()); ActivityCompat.startActivityForResult(getActivity(), intent, REQUEST_CODE_SALVAR, opts.toBundle()); // Por definição, vamos fechar esta tela para ficar somente a de editar. getActivity().finish(); return true; } else if (id == R.id.action_video) { showVideo(); return true; } return super.onOptionsItemSelected(item); } protected void showVideo() { // Abre o vídeo no Player de Vídeo Nativo if (carro.urlVideo != null && carro.urlVideo.trim().length() > 0) { if (URLUtil.isValidUrl(carro.urlVideo)) { IntentUtils.showVideo(getContext(), carro.urlVideo); } else { toast(getString(R.string.msg_url_invalida)); } } else { toast(getString(R.string.msg_carro_sem_video)); } } @Override public void onHeaderClicked() { toast("Para alterar a foto precisa editar o carro."); } @Override public void onFabButtonClicked(final Carro carro) { // Favoritar o carro if(carro != null) { startTask("favorito", taskFavoritar(carro), R.id.progress); } } @NonNull protected BaseTask<Boolean> taskFavoritar(final Carro carro) { return new BaseTask<Boolean>(){ @Override public Boolean execute() throws Exception { CarroService.toogleFavorite(getContext(),carro); return true; } @Override public void updateView(Boolean response) { super.updateView(response); // Atualiza o FAB button CarroActivity activity = (CarroActivity) getActivity(); activity.toogleFavorite(carro.favorited); // Envia o evento para o bus CarrosApplication.getInstance().getBus().post(new BusEvent.FavoritosEvent()); } }; } /** * // Atualiza a cor do FAB button, conforme se o carro está favoritado ou não */ @NonNull protected BaseTask<Boolean> taskLoadFavoritos() { return new BaseTask<Boolean>(){ @Override public Boolean execute() throws Exception { // Verifica se o carro está favoritado. Boolean favorito = CarroService.isFavorito(getContext(),carro); return favorito; } @Override public void updateView(Boolean favorito) { super.updateView(favorito); // Atualiza a cor do FAB button. CarroActivity activity = (CarroActivity) getActivity(); activity.setFavoriteColor(favorito); } }; } }