Java tutorial
/* * Copyright 2016 Anteros Tecnologia * * 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 br.com.anteros.vendas.gui; import android.Manifest; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.ActivityNotFoundException; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.KeyEvent; import android.view.Menu; import android.view.View; import android.webkit.MimeTypeMap; import android.widget.AdapterView; import android.widget.EditText; import android.widget.ImageView; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import br.com.anteros.android.core.util.AndroidFileUtils; import br.com.anteros.android.core.util.ImageUtils; import br.com.anteros.android.ui.controls.ErrorAlert; import br.com.anteros.android.ui.controls.QuestionAlert; import br.com.anteros.core.utils.StringUtils; import br.com.anteros.vendas.R; import br.com.anteros.vendas.modelo.Anexo; import br.com.anteros.vendas.modelo.TipoConteudoAnexo; /** * Acitivity para o cadastro de anexos do cliente. * * @author Eduardo Greco (eduardogreco93@gmail.com) * Eduardo Albertini (albertinieduardo@hotmail.com) * Edson Martins (edsonmartins2005@gmail.com) * Data: 13/05/16. */ public class AnexoCadastroActivity extends AppCompatActivity implements AdapterView.OnLongClickListener, View.OnClickListener { /** * Constantes dos cdigos de resultados a chamadas de outras activities. */ public static final int NAO_ALTEROU_ANEXO = 0; public static final int ALTEROU_ANEXO = 1; public static final int TIRAR_FOTO = 2; public static final int SELECIONAR_ARQUIVO = 3; public static final String ANTEROSVENDAS_ANEXO = "/anterosvendas/anexo"; /** * Objeto Anexo sendo editado */ private static Anexo anexo; /** * Controles visuais */ private ImageView imgVisualizar; private ImageView imgFoto; private EditText edDescricao; private static Bitmap fotoGaleria; /** * Dados do arquivo para captura da cmera. */ private String filePath; private String fileName; private Uri mUri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.anexo_cadastro); setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); getSupportActionBar().setDisplayHomeAsUpEnabled(true); ActionBar mActionBar = getSupportActionBar(); mActionBar.setDisplayHomeAsUpEnabled(true); mActionBar.setDisplayShowHomeEnabled(true); /** * Obtm os controles visuais do layout */ edDescricao = (EditText) findViewById(R.id.anexo_edDescricao); /** * Atribui os eventos */ imgFoto = (ImageView) findViewById(R.id.anexo_imgFoto); imgFoto.setOnLongClickListener(this); imgVisualizar = (ImageView) findViewById(R.id.anexo_imgVisualizar); imgVisualizar.setOnClickListener(this); /** * Inicia os dados do arquivo */ if ((anexo != null) && (StringUtils.isNotEmpty(anexo.getConteudoPath()))) { File file = new File(anexo.getConteudoPath()); filePath = file.getAbsolutePath(); fileName = file.getName(); } else { filePath = getCaminhoArquivo(); fileName = getFileName(); } mUri = getUriArquivo(); /** * Carrega os dados na view */ carregaDadosParaView(); } /** * Carrega os dados do objeto Anexo na view. */ private void carregaDadosParaView() { edDescricao.setText(anexo.getNome()); File imgFile = null; if (anexo.hasConteudo()) { fileName = anexo.getNome(); imgFile = new File(anexo.getConteudoPath()); } else { imgFile = new File(filePath, fileName); } if (imgFile.exists()) { atribuiImageParaFotoGaleria(imgFile); imgFoto.setImageBitmap(fotoGaleria); imgVisualizar.setEnabled(true); } else { imgFoto.setImageDrawable(getResources().getDrawable(R.drawable.ic_arquivo_nao_encontrado)); imgVisualizar.setEnabled(false); } /** * Obtm a URI referente ao arquivo anexo */ mUri = Uri.fromFile(imgFile); } /** * Cria as opes no menu * @param menu Menu * @return True se criou */ @Override public boolean onCreateOptionsMenu(Menu menu) { Toolbar tb = (Toolbar) findViewById(R.id.toolbar); tb.inflateMenu(R.menu.anexo_cadastro_action); tb.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(android.view.MenuItem item) { return onOptionsItemSelected(item); } }); return true; } /** * Evento quando um item do menu foi clicado * @param item * @return */ @Override public boolean onOptionsItemSelected(android.view.MenuItem item) { switch (item.getItemId()) { case android.R.id.home: /** * Volta para tela anterior. Se estiver editando pergunta * ao usurio se deseja cancelar. */ new QuestionAlert(this, getResources().getString(R.string.app_name), "Cancelar anexo ?", new QuestionAlert.QuestionListener() { public void onPositiveClick() { cancelaEdicaoAnexo(); } public void onNegativeClick() { } }).show(); break; case R.id.cliente_cadastro_action_upload: /** * Chama o mtodo para anexar arquivos. */ if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.READ_EXTERNAL_STORAGE }, 1); } else { anexarArquivos(); } break; case R.id.cliente_cadastro_action_camera: /** * Verifica se App possu permisso para usar a cmera e gravar arquivos. Se no tiver * requisita permisso. */ if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0); } else { /** * Se j tem permisso inicia a cmera. */ iniciaCamera(); } break; case R.id.cliente_cadastro_action_salvar: /** * Pergunta ao usurio se deseja salvar o anexo. */ new QuestionAlert(this, getResources().getString(R.string.app_name), "Salvar Anexo ?", new QuestionAlert.QuestionListener() { public void onPositiveClick() { salvarAnexo(); } public void onNegativeClick() { } }).show(); break; } return true; } /** * Evento long click para iniciar captura de imagem da cmera. No foi usado onClick pois j foi * usado na imagem de visualizar para ver o anexo. * @param v View * @return True se executou */ @Override public boolean onLongClick(View v) { /** * Verifica se App possu permisso para usar a cmera e gravar arquivos. Se no tiver * requisita permisso. */ if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0); } else { /** * Se j tem permisso inicia a cmera. */ iniciaCamera(); } return false; } /** * Evento que ocorre quando o usurio confirmou a requisio de permisso. * @param requestCode Cdigo da requisio * @param permissions Permisses * @param grantResults Grants */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { /** * Se requestcode for igual 0(Zero) ele confirmou requisio */ if (requestCode == 0) { /** * Verifica se ele aceitou a requisio com as permisses. */ if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) { /** * Se j tem permisso inicia a cmera. */ iniciaCamera(); } } /** * Se requestcode for igual 1(Um) ele confirmou requisio */ if (requestCode == 1) { /** * Verifica se ele aceitou a requisio com as permisses. */ if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) { /** * Se j tem permisso abre a galeria. */ anexarArquivos(); } } } /** * Evento atribuido a imagem para visualizar o anexo. * @param v View */ @Override public void onClick(View v) { /** * Se clicou na imagem abre o anexo. */ if (v == imgVisualizar) { abrirAnexo(mUri); } } /** * Evento que retorna o resultado da chamada de outras activities. * @param requestCode Cdigo da requisio * @param resultCode Cdigo do resultado * @param data Dados */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { /** * Se a requiso era para tira foto. */ if (requestCode == TIRAR_FOTO) { if (resultCode == RESULT_OK) { try { new SalvaArquivoAnexo().execute(requestCode); } catch (Exception e) { e.printStackTrace(); new ErrorAlert(this, getResources().getString(R.string.app_name), "Ocorreu um erro ao salvar a foto. " + e.getMessage()).show(); } } /** * Se a requisio era para selecionar arquivo */ } else if (requestCode == SELECIONAR_ARQUIVO) { if (resultCode == RESULT_OK) { try { mUri = data.getData(); new SalvaArquivoAnexo().execute(requestCode); } catch (Exception e) { e.printStackTrace(); new ErrorAlert(this, getResources().getString(R.string.app_name), "Ocorreu um erro ao selecionar o arquivo. " + e.getMessage()).show(); } } } } /** * Se clicou no boto voltar para sair da Activity. * @param keyCode Tecla pressionada * @param event Evento * @return true se OK */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK)) { /** * Pergunta ao usurio se deseja cancelar a edio do anexo. */ new QuestionAlert(this, getResources().getString(R.string.app_name), "Cancelar o anexo?", new QuestionAlert.QuestionListener() { public void onPositiveClick() { cancelaEdicaoAnexo(); } public void onNegativeClick() { } }).show(); return false; } return super.onKeyDown(keyCode, event); } /** * Devolve o caminho do arquivo do anexo. * @return */ private String getCaminhoArquivo() { if (filePath == null) { filePath = Environment.getExternalStorageDirectory() + ANTEROSVENDAS_ANEXO; File path = new File(filePath); if (!path.exists()) { path.mkdirs(); } } return filePath; } /** * Cria um novo nome de arquivo para o anexo. * @return Nome do arquivo */ public String getFileName() { return "img_" + new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) + ".png"; } /** * Retorna a URI do arquivo de anexo. * @return */ private Uri getUriArquivo() { File f = new File(getCaminhoArquivo(), getFileName()); return Uri.fromFile(f); } /** * Inicia a cmera para captura da imagem de anexo. */ private void iniciaCamera() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mUri); startActivityForResult(takePictureIntent, TIRAR_FOTO); } /** * Anexar arquivos */ private void anexarArquivos() { String items[] = { "Imagem", "Outros tipos" }; AlertDialog.Builder ab = new AlertDialog.Builder(this); ab.setTitle("Seleo de arquivos"); ab.setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface d, int choice) { if (choice == 0) { selecionarImagem(); } else if (choice == 1) { selecionarOutrosTiposArquivo(); } } }); ab.show(); } /** * Seleciona um arquivo do tipo imagem para anexar */ private void selecionarImagem() { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Selecione"), SELECIONAR_ARQUIVO); } /** * Seleciona outros tipos de arquivos para anexar */ private void selecionarOutrosTiposArquivo() { Intent intent = new Intent(); intent.setAction(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("file/*"); startActivityForResult(Intent.createChooser(intent, "Selecione"), SELECIONAR_ARQUIVO); } private void atribuiImageParaFotoGaleria(File file) { String extension = FilenameUtils.getExtension(file.getAbsolutePath()); TipoConteudoAnexo tipoConteudoAnexo = TipoConteudoAnexo.getTipoConteudoAnexoPorExtensao(extension); switch (tipoConteudoAnexo) { case IMAGEM: fotoGaleria = ImageUtils.loadScaledImage(file.getPath(), 640, 480); break; case PDF: fotoGaleria = BitmapFactory.decodeResource(getResources(), R.drawable.ic_file_extension_pdf); break; case PLANILHA: fotoGaleria = BitmapFactory.decodeResource(getResources(), R.drawable.ic_file_extension_xls); break; case TEXTO: fotoGaleria = BitmapFactory.decodeResource(getResources(), R.drawable.ic_file_extension_txt); break; case DOCUMENTO: fotoGaleria = BitmapFactory.decodeResource(getResources(), R.drawable.ic_file_extension_doc); break; case APRESENTACAO: fotoGaleria = BitmapFactory.decodeResource(getResources(), R.drawable.ic_file_extension_ppt); break; case HTML: fotoGaleria = BitmapFactory.decodeResource(getResources(), R.drawable.ic_file_extension_html); break; case RAR: fotoGaleria = BitmapFactory.decodeResource(getResources(), R.drawable.ic_file_extension_rar); break; case ZIP: fotoGaleria = BitmapFactory.decodeResource(getResources(), R.drawable.ic_file_extension_zip); break; case XML: fotoGaleria = BitmapFactory.decodeResource(getResources(), R.drawable.ic_file_extension_xml); break; default: fotoGaleria = BitmapFactory.decodeResource(getResources(), R.drawable.ic_file_extension_unk); break; } } /** * Cancela edio do anexo */ protected void cancelaEdicaoAnexo() { setResult(NAO_ALTEROU_ANEXO); finish(); } /** * Salva o anexo e finaliza retornando que ALTEROU_ANEXO */ protected void salvarAnexo() { File file = AndroidFileUtils.getFile(this, mUri); if (edDescricao.getText().length() == 0) { new ErrorAlert(this, getResources().getString(R.string.app_name), "O campo DESCRIO deve ser informado.").show(); } else if (imgFoto.getDrawable() == null) { new ErrorAlert(this, getResources().getString(R.string.app_name), "No existe arquivo selecionado.") .show(); } else if (!file.exists()) { new ErrorAlert(this, getResources().getString(R.string.app_name), "O arquivo selecionado no foi encontrado.").show(); } else { salvarDadosAnexo(file); setResult(ALTEROU_ANEXO); finish(); } } private void salvarDadosAnexo(File file) { anexo.setNome(edDescricao.getText().toString()); anexo.setConteudoPath(file.getAbsolutePath()); anexo.setTipoConteudo(getTipoConteudoAnexo(anexo.getConteudoPath())); } /** * Retorna tipo do contedo do anexo * @param caminho Caminho do arquivo * @return Tipo de contedo */ private TipoConteudoAnexo getTipoConteudoAnexo(String caminho) { String extension = FilenameUtils.getExtension(caminho); return TipoConteudoAnexo.getTipoConteudoAnexoPorExtensao(extension); } /** * Abre o anexo pela URI do arquivo anexado para visualizao. * @param mUri */ private void abrirAnexo(Uri mUri) { String extension = FilenameUtils.getExtension(AndroidFileUtils.getPath(AnexoCadastroActivity.this, mUri)); try { Intent intent = new Intent(Intent.ACTION_VIEW); MimeTypeMap mime = MimeTypeMap.getSingleton(); String type = mime.getMimeTypeFromExtension(extension); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(mUri, type); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getApplicationContext().startActivity(intent); } catch (ActivityNotFoundException e) { new ErrorAlert(AnexoCadastroActivity.this, getResources().getString(R.string.app_name), "No foi encontrado nenhum aplicativo nesse aparelho que suporte abrir a extenso '" + extension + "', entre em contato com a equipe de Suporte para resolver esse problema.").show(); } catch (Exception e) { new ErrorAlert(AnexoCadastroActivity.this, getResources().getString(R.string.app_name), "No foi possvel abrir o anexo " + anexo.getId() + ". " + e.getMessage()).show(); e.printStackTrace(); } } /** * Atribui o objeto esttico anexo * @param anexo */ public static void setAnexo(Anexo anexo) { AnexoCadastroActivity.anexo = anexo; } /** * Retorna o objeto esttico anexo * @return Anexo */ public static Anexo getAnexo() { return anexo; } /** * AsynTask para salvar o anexo. */ public class SalvaArquivoAnexo extends AsyncTask<Integer, Void, String> { private ProgressDialog progressDialog; @Override protected void onPreExecute() { progressDialog = ProgressDialog.show(AnexoCadastroActivity.this, getResources().getString(R.string.app_name), "Salvando Anexo..."); progressDialog.setCancelable(false); progressDialog.setCanceledOnTouchOutside(false); imgFoto.setBackgroundDrawable(null); } @Override protected String doInBackground(Integer... params) { try { int requestCode = params[0]; if (requestCode == TIRAR_FOTO) { /** * Redimensiona a imagem para 640x480 */ fotoGaleria = ImageUtils.resizeAndStorageImage(mUri.getEncodedPath(), 640, 480); } else if (requestCode == SELECIONAR_ARQUIVO) { /** * Obtm o arquivo selecionado e salva com novo nome para anexar. */ File sourceFile = AndroidFileUtils.getFile(AnexoCadastroActivity.this, mUri); File destinationFile = new File(filePath, getFileName()); if (!sourceFile.exists()) throw new RuntimeException( "Arquivo de origem no encontrado. Caminho[" + sourceFile.getPath() + "]"); /** * Copia arquivo de origem para o novo arquivo */ FileUtils.copyFile(sourceFile, destinationFile); mUri = Uri.fromFile(destinationFile); /** * Atribui a imagem para a foto galeria para visualizar. */ atribuiImageParaFotoGaleria(destinationFile); } return null; } catch (Exception e) { e.printStackTrace(); return e.getMessage() + ""; } } @Override protected void onPostExecute(String result) { progressDialog.dismiss(); if (result == null) { imgFoto.setImageBitmap(fotoGaleria); imgVisualizar.setEnabled(true); salvarDadosAnexo(AndroidFileUtils.getFile(AnexoCadastroActivity.this, mUri)); } else { imgFoto.setImageDrawable(getResources().getDrawable(R.drawable.ic_arquivo_nao_encontrado)); imgVisualizar.setEnabled(false); new ErrorAlert(AnexoCadastroActivity.this, getResources().getString(R.string.app_name), "Ocorreu um erro ao salvar o anexo: " + result).show(); } } } }