package br.com.livrowebservices.carros.fragment; import android.app.Activity; import android.content.Intent; import android.databinding.DataBindingUtil; import android.databinding.ViewDataBinding; import android.graphics.Bitmap; import android.location.Location; import android.os.Bundle; import android.util.Log; 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.RadioGroup; import android.widget.TextView; import com.google.android.gms.location.LocationListener; import org.parceler.Parcels; import java.io.File; 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.databinding.FragmentCarroEditBinding; import br.com.livrowebservices.carros.domain.Carro; import br.com.livrowebservices.carros.domain.CarroService; import br.com.livrowebservices.carros.rest.Response; import br.com.livrowebservices.carros.rest.ResponseWithURL; import br.com.livrowebservices.carros.domain.event.BusEvent; import br.com.livrowebservices.carros.utils.CameraUtil; import br.com.livrowebservices.carros.utils.ImageUtils; import livroandroid.lib.fragment.BaseFragment; import livroandroid.lib.utils.GooglePlayServicesHelper; /** * Fragment com form para editar o carro. * <p> * Herda do CarroFragment para aproveitar a lógica de visualização. */ public class CarroEditFragment extends BaseFragment implements LocationListener, CarroActivity.ClickHeaderListener { // Camera Foto private CameraUtil camera = new CameraUtil(); private GooglePlayServicesHelper gps; private FragmentCarroEditBinding binding; protected ImageView img; protected TextView tUrlVideo; protected TextView tLatLng; protected TextView tLat; protected TextView tLng; protected RadioGroup tTipo; private Carro carro; @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_edit, container, false); View view = binding.getRoot(); initViews(view); initViews(view); if (carro != null) { setCarro(carro); } if (savedInstanceState != null) { // Se girou a tela recupera o estado camera.onCreate(savedInstanceState); } // Ligar o Google Play Services if (carro == null) { // Se não existe carro, liga GPS gps = new GooglePlayServicesHelper(getContext(), true); } return view; } 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); tTipo = (RadioGroup) view.findViewById(R.id.radioTipo); tLat = (TextView) view.findViewById(R.id.tLat); tLng = (TextView) view.findViewById(R.id.tLng); } 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); setTipo(c.tipo); 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); } // Seta o tipo no RadioGroup protected void setTipo(String tipo) { if ("classicos".equals(tipo)) { tTipo.check(R.id.tipoClassico); } else if ("esportivos".equals(tipo)) { tTipo.check(R.id.tipoEsportivo); } else if ("luxo".equals(tipo)) { tTipo.check(R.id.tipoLuxo); } } @Override public void onResume() { super.onResume(); // Conecta no Google Play Services if (gps != null) { gps.onResume(this); } } @Override public void onPause() { super.onPause(); // Desconecta no Google Play Services if (gps != null) { gps.onPause(); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); camera.onSaveInstanceState(outState); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_frag_edit_carro, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_salvar) { if (carro == null) { // Novo carro carro = new Carro(); carro.tipo = "esportivos"; } boolean formOk = validate(R.id.tNome, R.id.tDesc); if (formOk) { // Validação de campos preenchidos carro.nome = binding.tNome.getText().toString(); carro.desc = binding.tDesc.getText().toString(); carro.latitude = tLat.getText().toString(); carro.longitude = tLng.getText().toString(); carro.urlVideo = tUrlVideo.getText().toString(); carro.tipo = getTipo(); Log.d(TAG, "Salvar carro tipo: " + carro.tipo); startTask("salvar", taskSaveCarro()); } return true; } return super.onOptionsItemSelected(item); } // Retorna o tipo em string conforme marcado no RadioGroup protected String getTipo() { if (tTipo != null) { int id = tTipo.getCheckedRadioButtonId(); switch (id) { case R.id.tipoClassico: return "classicos"; case R.id.tipoEsportivo: return "esportivos"; case R.id.tipoLuxo: return "luxo"; } } return "classicos"; } private boolean validate(int... textViewIds) { for (int id : textViewIds) { TextView t = (TextView) getView().findViewById(id); String s = t.getText().toString(); if (s == null || s.trim().length() == 0) { t.setError(getString(R.string.msg_error_campo_obrigatorio)); return false; } } return true; } private BaseTask taskSaveCarro() { return new BaseTask<Response>() { @Override public Response execute() throws Exception { // Faz upload da foto File file = camera.getFile(); if (file != null && file.exists()) { ResponseWithURL response = CarroService.postFotoBase64(file); if (response != null && response.isOk()) { // Atualiza a foto do carro carro.urlFoto = response.getUrl(); } } // Salva o carro Response response = CarroService.saveCarro(carro); //Response response = Retrofit.getCarroREST().saveCarro(carro); return response; } @Override public void updateView(Response response) { super.updateView(response); if (response != null && "OK".equals(response.getStatus())) { // Envia o evento para o bus CarrosApplication.getInstance().getBus().post(new BusEvent.NovoCarroEvent()); // Fecha a tela getActivity().finish(); } else { toast("Erro ao salvar o carro " + carro.nome); } } }; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { // Resize da imagem Bitmap bitmap = camera.getBitmap(600, 600); if (bitmap != null) { // Salva arquivo neste tamanho camera.save(bitmap); // Atualiza imagem do Header CarroActivity activity = (CarroActivity) getActivity(); activity.setImage(bitmap); } } } private void setImage(File file) { //ImageUtils.setImage(getContext(), file.getAbsolutePath().toString(), imgView); Log.d(TAG, "setImage: " + file); ((CarroActivity) getActivity()).setImage(file); } public void setImage(String url) { //ImageUtils.setImage(getContext(),url, imgView); ((CarroActivity) getActivity()).setImage(url); } // @Override // public void onHeaderClicked() { // // Se clicar na imagem de header, tira a foto // // Cria o o arquivo no sdcard // long ms = System.currentTimeMillis(); // String fileName = String.format("foto_carro_%s_%s.jpg", carro != null ? carro.id : ms, ms); // // A classe Camera cria a intent e o arquivo no sdcard. // Intent intent = camera.open(fileName); // startActivityForResult(intent, 0); // } @Override public void onLocationChanged(Location location) { if (gps != null) { // Atualiza GPS quando abre o formulário vazio. tLat.setText(String.valueOf(location.getLatitude())); tLng.setText(String.valueOf(location.getLongitude())); } } @Override public void onHeaderClicked() { // Se clicar na imagem de header, tira a foto // Cria o o arquivo no sdcard long ms = System.currentTimeMillis(); String fileName = String.format("foto_carro_%s_%s.jpg", carro != null ? carro.id : ms, ms); // A classe Camera cria a intent e o arquivo no sdcard. Intent intent = camera.open(getContext(),fileName); startActivityForResult(intent, 0); } @Override public void onFabButtonClicked(Carro carro) { } }