package br.gov.serpro.nfc.ui.activity;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter.MalformedMimeTypeException;
import android.nfc.NdefMessage;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
import br.gov.serpro.nfc.R;
import br.gov.serpro.nfc.model.Keynote;
import br.gov.serpro.nfc.model.User;
import br.gov.serpro.nfc.ui.async.CheckinTask;
import br.gov.serpro.nfc.ui.async.CheckoutTask;
import br.gov.serpro.nfc.util.NfcUtils;
/**
* Tela de apresentação de uma palestra.
*
* @author Marlon Silva Carvalho
*/
public class KeynoteActivity extends Activity {
public static final int STATE_CHECKIN = 1;
public static final int STATE_CHECKOUT = 2;
public static final String KEYNOTE_ID = "keynote_id";
private int state = STATE_CHECKIN;
private Keynote keynote;
private TextView txtKeynoteDescription;
private TextView txtKeynoteDate;
private TextView txtKeynoteSpeaker;
private Switch switchState;
private NfcAdapter mNfcAdapter;
private PendingIntent mNfcPendingIntent;
private IntentFilter[] mNdefExchangeFilters;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_keynote);
getFields();
prepareNFC();
getKeynoteFromExtras();
fillFields();
configureActionBar();
}
private void configureActionBar() {
getActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
}
return true;
}
/**
* Preencher os campos com os dados do keynote.
*/
private void fillFields() {
if (keynote != null) {
txtKeynoteDescription.setText(keynote.description);
txtKeynoteDate.setText(keynote.date.toString());
txtKeynoteSpeaker.setText(keynote.speaker);
}
}
/**
* Obter o Keynote a partir do ID passado como parâmetro nos extras.
*/
private void getKeynoteFromExtras() {
Bundle extras = getIntent().getExtras();
if (extras != null) {
String id = (String) extras.get(KEYNOTE_ID);
if (id != null) {
keynote = Keynote.byId(Long.valueOf(id));
}
}
}
@Override
protected void onNewIntent(Intent intent) {
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
NdefMessage[] msgs = NfcUtils.getNdefMessages(intent);
notifyState(msgs[0]);
}
}
@Override
protected void onResume() {
super.onResume();
enableNdefExchangeMode();
}
@Override
protected void onPause() {
super.onPause();
disableNdefExchangeMode();
}
private void notifyState(NdefMessage ndefMessage) {
byte[] payload = ndefMessage.getRecords()[0].getPayload();
String data = new String(payload);
User user = new User(data);
if (state == STATE_CHECKIN) {
new CheckinTask(user, keynote) {
protected void onPreExecute() {
setProgressBarIndeterminateVisibility(true);
}
protected void onPostExecute(Void result) {
setProgressBarIndeterminateVisibility(false);
Toast.makeText(KeynoteActivity.this, "Checkin realizado para o participante " + user.name, Toast.LENGTH_LONG).show();
}
}.execute();
} else if (state == STATE_CHECKOUT) {
new CheckoutTask(user, keynote) {
protected void onPreExecute() {
setProgressBarIndeterminateVisibility(true);
}
protected void onPostExecute(Void result) {
setProgressBarIndeterminateVisibility(false);
Toast.makeText(KeynoteActivity.this, "Checkout realizado para o participante " + user.name, Toast.LENGTH_LONG).show();
}
}.execute();
}
}
private void prepareNFC() {
IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndefDetected.addDataType("application/vnd.serpro.nfcevents");
} catch (MalformedMimeTypeException e) {
}
mNdefExchangeFilters = new IntentFilter[] { ndefDetected };
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
mNfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
}
private void disableNdefExchangeMode() {
mNfcAdapter.disableForegroundDispatch(this);
}
private void enableNdefExchangeMode() {
mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, mNdefExchangeFilters, null);
}
private void getFields() {
switchState = (Switch) findViewById(R.id.switchState);
txtKeynoteDescription = (TextView) findViewById(R.id.keynote_description);
txtKeynoteDate = (TextView) findViewById(R.id.keynote_date);
txtKeynoteSpeaker = (TextView) findViewById(R.id.keynote_speaker);
switchState.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
state = switchState.isChecked() ? STATE_CHECKIN : STATE_CHECKOUT;
}
});
}
}