Oi gente, quando tento abrir a Activity abaixo uma NullPointerException é lançada e ela aponta para as linhas 109 e 136. Alguém sabe a causa dessa exceção??
Agradeço desde já.
package contact.list.aniversario;
import java.lang.reflect.Array;
import java.util.Calendar;
import java.util.List;
import contact.list.ListarContatos;
import contact.list.R;
import contact.list.auxiliares.Contato;
import contact.list.auxiliares.LerGravarExcluirScript;
import contact.list.auxiliares.MetodosAuxiliares;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.Dialog;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
public class ListaAniversario extends Activity {
List<Contato> contatos;
List<Contato> datasDeAniversarioDosContatos;
List<Contato> contatosAniversariantes;
LerGravarExcluirScript acoesBancoDados;
String [] nomes;
String [] dias = new String [] {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10",
"11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
"21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"};
String [] meses = new String [] {"Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set",
"Out", "Nov", "Dez"};
Contato obj;
Contato obj2;
Contato contato;
Contato cont;
ListView listViewNomesEDatas;
ListView listViewAniversariantes;
Spinner names;
Spinner days;
Spinner months;
Spinner spinnerDaysDialog;
Spinner spinnerMonthsDialog;
String nomeEscolhido;
String diaEscolhido;
String mesEscolhido;
Dialog dialogEditarAniversario;
Dialog dialogBotoesParabenizar;
Dialog addAniversarios;
MetodosAuxiliares auxiliar = new MetodosAuxiliares();
boolean processoEnviarSMS = false;
boolean processoEnviarEmail = false;
View linha;
ImageView bolo;
TextView aviso;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lista_aniversario);
listViewNomesEDatas = (ListView) findViewById(R.id.listViewNomesEDatas);
listViewAniversariantes = (ListView) findViewById(R.id.listViewAniversariantes);
linha = (View) findViewById(R.id.linha);
bolo = (ImageView) findViewById(R.id.cakeImage);
aviso = (TextView) findViewById(R.id.avisoTxt);
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
nm.cancel(R.string.app_name);
acoesBancoDados = new LerGravarExcluirScript(this);
contatos = acoesBancoDados.listarContatos();
int tamanho = contatos.size();
nomes = new String[tamanho];
for(int i = 0; i < tamanho; i++) {
obj = contatos.get(i);
String s = obj.getNome();
nomes[i] = s;
}
preencherListViews();
}
private void preencherListViews() {
//Retorna dados da tabela 2(aniversariantes)
datasDeAniversarioDosContatos = acoesBancoDados.listarAniversarios();
/*Agenda um alarme que será executado a cada 24 horas, esse alarme chamará a classe ServicoAniversario,
*que checará se tem alguém aniversariando naquele dia.*/
if(datasDeAniversarioDosContatos.size() == 1){
agendarAlarme();
}
listViewNomesEDatas.setAdapter(new ListaAniversarioAdapter(this, datasDeAniversarioDosContatos));
listViewNomesEDatas.setOnItemClickListener(new EditarAniversarios());
//"auxiliar" é objeto da classe MetodosAuxiliares.
contatosAniversariantes = auxiliar.listaContatosAniversariantes(datasDeAniversarioDosContatos.size(), contato, datasDeAniversarioDosContatos);
listViewAniversariantes.setAdapter(new ListaAniversarioAdapterAniversariantes(this, contatosAniversariantes));
listViewAniversariantes.setOnItemClickListener(new ListViewAniversariantesHandler());
if(datasDeAniversarioDosContatos.size() == 0) {
listViewAniversariantes.setVisibility(ListView.GONE);
listViewNomesEDatas.setVisibility(ListView.GONE);
linha.setVisibility(View.GONE);
bolo.setVisibility(ImageView.VISIBLE);
aviso.setVisibility(TextView.VISIBLE);
}else if(datasDeAniversarioDosContatos.size() >= 1) {
if(contatosAniversariantes.size() >= 1) {
listViewAniversariantes.setVisibility(ListView.VISIBLE);
}
listViewNomesEDatas.setVisibility(ListView.VISIBLE);
linha.setVisibility(View.VISIBLE);
bolo.setVisibility(ImageView.GONE);
aviso.setVisibility(TextView.GONE);
}
}
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_aniversarios, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.gravar:
addAniversarios = new Dialog(this);
addAniversarios.setContentView(R.layout.add_aniversarios);
addAniversarios.setTitle("Add Birthday");
addAniversarios.setCancelable(true);
ArrayAdapter<String> spinnerNomesConteudo = new ArrayAdapter<String>(this,R.layout.list_white_text,R.id.list_content, nomes);
spinnerNomesConteudo.setDropDownViewResource(R.layout.list_black_text);
names = (Spinner) addAniversarios.findViewById(R.id.spinnerNomes);
names.setAdapter(spinnerNomesConteudo);
names.setOnItemSelectedListener(new OnItemSelectedListenerNames());
ArrayAdapter<String> spinnerDiasConteudo = new ArrayAdapter<String>(this,R.layout.list_white_text,R.id.list_content, dias);
spinnerDiasConteudo.setDropDownViewResource(R.layout.list_black_text);
days = (Spinner) addAniversarios.findViewById(R.id.spinnerDias);
days.setAdapter(spinnerDiasConteudo);
days.setOnItemSelectedListener(new OnItemSelectedListenerDays());
ArrayAdapter<String> spinnerMesesConteudo = new ArrayAdapter<String>(this,R.layout.list_white_text,R.id.list_content, meses);
spinnerMesesConteudo.setDropDownViewResource(R.layout.list_black_text);
months = (Spinner) addAniversarios.findViewById(R.id.spinnerMeses);
months.setAdapter(spinnerMesesConteudo);
months.setOnItemSelectedListener(new OnItemSelectedListenerMonths());
Button buttonBuscar = (Button) addAniversarios.findViewById(R.id.gravarBtn);
buttonBuscar.setOnClickListener(new GravarAniversario());
Button buttonCancelar = (Button) addAniversarios.findViewById(R.id.cancelarBtn);
buttonCancelar.setOnClickListener(new BotaoCancelar());
addAniversarios.show();
return true;
case R.id.voltar:
Intent it = new Intent (this, ListarContatos.class);
startActivity(it);
finish();
return true;
case R.id.sair:
finish();
return true;
default:
return false;
}
}
private class GravarAniversario implements OnClickListener {
public void onClick(View v) {
if(nomeEscolhido != null) {
addAniversarios.dismiss();
acoesBancoDados.inserirAniversario(nomeEscolhido, diaEscolhido, mesEscolhido);
preencherListViews();
Toast.makeText(ListaAniversario.this, "Birthday successfully added!", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(ListaAniversario.this, "Please add a contact first.", Toast.LENGTH_LONG).show();
}
}
}
private class BotaoCancelar implements OnClickListener {
public void onClick(View v) {
addAniversarios.dismiss();
}
}
public class OnItemSelectedListenerNames implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
nomeEscolhido = names.getSelectedItem().toString();
}
public void onNothingSelected(AdapterView<?> parent) {}
}
public class OnItemSelectedListenerDays implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
diaEscolhido = days.getSelectedItem().toString();
}
public void onNothingSelected(AdapterView<?> parent) {}
}
public class OnItemSelectedListenerMonths implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
mesEscolhido = months.getSelectedItem().toString();
}
public void onNothingSelected(AdapterView<?> parent) {}
}
private class EditarAniversarios implements OnItemClickListener, OnClickListener {
Button editarButton;
Button sairButton;
public void onItemClick(AdapterView<?> parent, View view, int posicao, long identification) {
cont = (Contato) listViewNomesEDatas.getAdapter().getItem(posicao);
dialogEditarAniversario = new Dialog(ListaAniversario.this);
dialogEditarAniversario.setContentView(R.layout.editar_aniversario_dialog_layout);
dialogEditarAniversario.setTitle("Edit Birthday");
dialogEditarAniversario.setCancelable(true);
TextView nome = (TextView) dialogEditarAniversario.findViewById(R.id.nome);
nome.setText(cont.getNomeTabelaAniversario());
spinnerDaysDialog = (Spinner) dialogEditarAniversario.findViewById(R.id.spinnerDias);
ArrayAdapter<String> spinnerDiasConteudo = new ArrayAdapter<String>(ListaAniversario.this,R.layout.list_black_text,R.id.list_content, dias);
spinnerDiasConteudo.setDropDownViewResource(R.layout.list_black_text);
spinnerDaysDialog.setAdapter(spinnerDiasConteudo);
spinnerDaysDialog.setOnItemSelectedListener(new EditarDiaAniversario());
int ArraySize = Array.getLength(dias); //get the size of the array
for (int i = 0; i < ArraySize; i++) {
if (dias[i].equals(cont.getDiaAniversario())) {
spinnerDaysDialog.setSelection(i, true); //faz com que já fique selecionado o dia atual do aniversário da pessoa
break;
}
}
spinnerMonthsDialog = (Spinner) dialogEditarAniversario.findViewById(R.id.spinnerMeses);
ArrayAdapter<String> spinnerMesesConteudo = new ArrayAdapter<String>(ListaAniversario.this,R.layout.list_black_text,R.id.list_content, meses);
spinnerMesesConteudo.setDropDownViewResource(R.layout.list_black_text);
spinnerMonthsDialog.setAdapter(spinnerMesesConteudo);
spinnerMonthsDialog.setOnItemSelectedListener(new EditarMesAniversario());
int ArraySize2 = Array.getLength(meses); //get the size of the array
for (int i = 0; i < ArraySize2; i++) {
if (meses[i].equals(cont.getMesAniversario())) {
spinnerMonthsDialog.setSelection(i, true); //faz com que já fique selecionado o mês atual do aniversário da pessoa
break;
}
}
editarButton = (Button) dialogEditarAniversario.findViewById(R.id.editarBtn);
editarButton.setOnClickListener(this);
sairButton = (Button) dialogEditarAniversario.findViewById(R.id.cancelBtn);
sairButton.setOnClickListener(this);
dialogEditarAniversario.show();
}
public void onClick(View v) {
if(v == editarButton){
dialogEditarAniversario.dismiss();
cont.setDiaAniversario(diaEscolhido);
cont.setMesAniversario(mesEscolhido);
int numLinhasAfetadas = acoesBancoDados.editarAniversario(cont);
if(numLinhasAfetadas >= 1) {
Toast.makeText(ListaAniversario.this, "Birthday successfully edited!", Toast.LENGTH_LONG).show();
}else if(numLinhasAfetadas == 0) {
Toast.makeText(ListaAniversario.this, "Birthday not found.", Toast.LENGTH_LONG).show();
}
preencherListViews();
}else if(v == sairButton){
dialogEditarAniversario.dismiss();
}
}
}
private class EditarDiaAniversario implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
diaEscolhido = spinnerDaysDialog.getSelectedItem().toString();
}
public void onNothingSelected(AdapterView<?> parent) {}
}
private class EditarMesAniversario implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
mesEscolhido = spinnerMonthsDialog.getSelectedItem().toString();
}
public void onNothingSelected(AdapterView<?> parent) {}
}
private class ListViewAniversariantesHandler implements OnItemClickListener, OnClickListener {
String nomeAniversariante;
String emailAniversariante;
String mobileAniversariante;
String foneCasaAniversariante;
String foneTrabalhoAniversariante;
ImageButton call;
ImageButton sms;
ImageButton email;
Dialog escolherTelefone;
Button fechar;
Contato contato;
public void onItemClick(AdapterView<?> parent, View view, int posicao, long identification) {
//Pega o item do ListView que foi clicado:
cont = (Contato) listViewAniversariantes.getAdapter().getItem(posicao);
nomeAniversariante = cont.getNomeTabelaAniversario();
int tamanho = contatos.size();
//Pega os dados do item do ListView que foi clicado:
for(int i = 0; i < tamanho; i++) {
contato = contatos.get(i);
String s = contato.getNome();
if(s.equals(nomeAniversariante)){
mobileAniversariante = contato.getMobile();
foneCasaAniversariante = contato.getFoneCasa();
foneTrabalhoAniversariante = contato.getFoneTrabalho();
emailAniversariante = contato.getEmail();
break;
}
}
dialogBotoesParabenizar = new Dialog(ListaAniversario.this);
dialogBotoesParabenizar.setContentView(R.layout.botoes_dialog_layout);
dialogBotoesParabenizar.setTitle("Congratulate!");
dialogBotoesParabenizar.setCancelable(true);
call = (ImageButton) dialogBotoesParabenizar.findViewById(R.id.callBtn);
call.setOnClickListener(new CallButton());
sms = (ImageButton) dialogBotoesParabenizar.findViewById(R.id.smsBtn);
sms.setOnClickListener(this);
email = (ImageButton) dialogBotoesParabenizar.findViewById(R.id.emailBtn);
email.setOnClickListener(this);
fechar = (Button) dialogBotoesParabenizar.findViewById(R.id.fecharBtn);
fechar.setOnClickListener(this);
dialogBotoesParabenizar.show();
}
//Lida com o evento de clicar no call button do dialogBotoesParabenizar.
private class CallButton implements OnClickListener {
public void onClick(View v) {
dialogBotoesParabenizar.dismiss();
escolherTelefone = new Dialog(ListaAniversario.this);
escolherTelefone.setContentView(R.layout.escolher_telefone);
escolherTelefone.setTitle("Choose a fone number");
escolherTelefone.setCancelable(true);
Button mobileBtn = (Button) escolherTelefone.findViewById(R.id.mobileBtn);
mobileBtn.setText(mobileAniversariante);
mobileBtn.setOnClickListener(new LigarMobile());
Button foneCasaBtn = (Button) escolherTelefone.findViewById(R.id.foneCasaBtn);
foneCasaBtn.setOnClickListener(new LigarCasa());
foneCasaBtn.setText(foneCasaAniversariante);
Button foneTrabalhoBtn = (Button) escolherTelefone.findViewById(R.id.foneTrabalhoBtn);
foneTrabalhoBtn.setOnClickListener(new LigarTrabalho());
foneTrabalhoBtn.setText(foneTrabalhoAniversariante);
Button cancelar = (Button) escolherTelefone.findViewById(R.id.cancelarBtn);
cancelar.setOnClickListener(new Cancelar());
ImageView casa = (ImageView) escolherTelefone.findViewById(R.id.casa_grande);
ImageView work_place = (ImageView) escolherTelefone.findViewById(R.id.worker_grande);
//Mobile + Casa:
if(!foneCasaAniversariante.equals("") && foneTrabalhoAniversariante.equals("")) {
foneTrabalhoBtn.setVisibility(Button.GONE);
work_place.setVisibility(ImageView.GONE);
escolherTelefone.show();
}
//Mobile + Trabalho:
if(foneCasaAniversariante.equals("") && !foneTrabalhoAniversariante.equals("")) {
foneCasaBtn.setVisibility(Button.GONE);
casa.setVisibility(ImageView.GONE);
escolherTelefone.show();
}
//Mobile + Casa + Trabalho:
if(!foneCasaAniversariante.equals("") && !foneTrabalhoAniversariante.equals("")) {
escolherTelefone.show();
}
//Só Mobile:
if(foneCasaAniversariante.equals("") && foneTrabalhoAniversariante.equals("")) {
Intent intencao = new Intent(Intent.ACTION_DIAL,Uri.parse("tel:000000" + mobileAniversariante));
startActivity(intencao);
}
}
private class LigarMobile implements OnClickListener {
public void onClick(View v) {
Intent intencao = new Intent(Intent.ACTION_DIAL,Uri.parse("tel:000000" + mobileAniversariante));
startActivity(intencao);
escolherTelefone.dismiss();
}
}
private class LigarCasa implements OnClickListener {
public void onClick(View v) {
Intent intencao = new Intent(Intent.ACTION_DIAL,Uri.parse("tel:000000" + foneCasaAniversariante));
startActivity(intencao);
escolherTelefone.dismiss();
}
}
private class LigarTrabalho implements OnClickListener {
public void onClick(View v) {
Intent intencao = new Intent(Intent.ACTION_DIAL,Uri.parse("tel:000000" + foneTrabalhoAniversariante));
startActivity(intencao);
escolherTelefone.dismiss();
}
}
private class Cancelar implements OnClickListener {
public void onClick(View v) {
escolherTelefone.dismiss();
}
}
}
//Lida com o evento de clicar no sms button e no e-mail button do dialogBotoesParabenizar.
//Para enviar SMS e E-mail, usam-se apps já existentes no celular do usuário, nativos ou não.
public void onClick(View v) {
if(v == sms){
dialogBotoesParabenizar.dismiss();
Thread processoParalelo = new Thread(new BotaoSMSAniversariante());
processoEnviarSMS = true;
processoParalelo.start();
}else if(v == email){
dialogBotoesParabenizar.dismiss();
Thread processoParalelo = new Thread(new BotaoEmailAniversariante());
processoEnviarEmail = true;
processoParalelo.start();
}else if(v == fechar){
dialogBotoesParabenizar.dismiss();
}
}
private class BotaoSMSAniversariante implements Runnable {
public void run() {
if (processoEnviarSMS) {
//Intent smsIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + mobileAniversariante));
Intent smsIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + 5556));
startActivity(Intent.createChooser(smsIntent, "Send SMS in:"));
}
}
}
private class BotaoEmailAniversariante implements Runnable {
public void run() {
if (processoEnviarEmail) {
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
//String [] emailTo = new String[]{emailAniversariante};
String [] emailTo = new String[]{"nissi-miranda@bol.com.br"};
//String emailSubject = "Subject";
//String emailBody = "Some HTML goes here.";
emailIntent.setType("text/html");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, emailTo);
//emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,emailSubject);
//emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, Html.fromHtml(emailBody).toString());
startActivity(Intent.createChooser(emailIntent, "Send email in:"));
}
}
}
}
private void agendarAlarme() {
Intent it = new Intent("SERVICO_ANIVERSARIO");
PendingIntent p = PendingIntent.getService(this, 0, it, 0);
int tempoRepetir = 86400 * 1000; //Corresponde a 24 horas
int delay = 10800 * 1000; //Corresponde a 3 horas
AlarmManager alarme = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar c = Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis());
c.add(Calendar.MILLISECOND, delay);
long time = c.getTimeInMillis();
//O primeiro alarme será lançado em 3 horas e depois se repetirá a cada 24 horas
alarme.setRepeating(AlarmManager.RTC_WAKEUP, time, tempoRepetir, p);
}
protected void onDestroy() {
//Fecha o Banco de Dados
acoesBancoDados.fechar();
if(processoEnviarSMS) {
processoEnviarSMS = false;
}
if(processoEnviarEmail) {
processoEnviarEmail = false;
}
super.onDestroy();
}
}