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.nfc.NfcAdapter; import android.nfc.Tag; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.Window; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import br.gov.serpro.nfc.R; import br.gov.serpro.nfc.model.User; import br.gov.serpro.nfc.ui.async.FindUserByEmailTask; import br.gov.serpro.nfc.ui.async.RegisterUserTask; import br.gov.serpro.nfc.util.NfcUtils; import br.gov.serpro.nfc.util.Strings; /** * Atividade responsável em apresentar o formulário de registr de um usuário. * * @author Marlon Silva Carvalho */ public class UserActivity extends Activity { private IntentFilter[] mWriteTagFilters; private NfcAdapter mNfcAdapter; private PendingIntent mNfcPendingIntent; private TextView info; private EditText name; private EditText email; private EditText phone; private MenuItem menuItemRegister; private MenuItem menuItemCancel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.activity_user); prepareNFC(); getFields(); configureActionBar(); } private void configureActionBar() { getActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.user, menu); menuItemCancel = menu.findItem(R.id.action_cancel); menuItemRegister = menu.findItem(R.id.action_register); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { boolean result = false; if (item.getItemId() == R.id.action_register) { registerUser(); } else if (item.getItemId() == R.id.action_cancel) { cancelRegister(); } else if (item.getItemId() == android.R.id.home) { goBack(); } return result; } /** * Sair desta tela. */ private void goBack() { disableTagWriteMode(); finish(); } /** * Cancelar o registro do usuário. */ private void cancelRegister() { menuItemCancel.setVisible(false); menuItemRegister.setVisible(true); info.setText(R.string.text_info_add_user); enableFields(); } /** * Registrar um usuário no serviço e gravar a tag NFC. */ private void registerUser() { new FindUserByEmailTask(this) { protected void onPostExecute(User user) { super.onPostExecute(user); if (state == FAIL) { showToast(R.string.add_user_server_fail); } else { if (user == null) { if (!Strings.isEmpty(getName()) && !Strings.isEmpty(getPhone())) { user = getUserFromFields(); new RegisterUserTask(UserActivity.this) { protected void onPostExecute(User user) { super.onPostExecute(user); enableNFC(user); } }.execute(user); } else { showToast(R.string.message_user_not_registered); } } else { enableNFC(user); } } } }.execute(getEmail()); } /** * Criar um usuário a partir dos dados dos campos. * * @return Usuário criado. */ private User getUserFromFields() { User user = new User(); user.email = getEmail(); user.name = getName(); user.phone = getPhone(); return user; } /** * Habilitar a gravação de tags e apresentar na tela os dados do usuário. * * @param user * Usuário. */ private void enableNFC(User user) { setName(user.name); setPhone(user.phone); disableFields(); info.setText(R.string.text_info_add_user_nfc); menuItemCancel.setVisible(true); menuItemRegister.setVisible(false); enableTagWriteMode(); } /** * Desabilitar todos os campos da tela. */ private void disableFields() { email.setEnabled(false); name.setEnabled(false); phone.setEnabled(false); } /** * Habilitar todos os campos da tela. */ private void enableFields() { email.setEnabled(true); name.setEnabled(true); phone.setEnabled(true); } /** * Exibir uma mensagem em Toast. * * @param id * Identificador do recurso que contém a string. */ private void showToast(int id) { Toast.makeText(this, id, Toast.LENGTH_LONG).show(); } /** * Obter os campos da tela. */ private void getFields() { info = (TextView) findViewById(R.id.txtview_info_add_user); name = (EditText) findViewById(R.id.edit_user_name); email = (EditText) findViewById(R.id.edit_user_email); phone = (EditText) findViewById(R.id.edit_user_phone); } /** * Preparar o NFC para ser usado nesta tela. */ private void prepareNFC() { mNfcAdapter = NfcAdapter.getDefaultAdapter(this); mNfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); } /** * Desabilitar a opção de escrita de tags. Quando uma tag se aproximar, não * acontecerá algo. */ private void disableTagWriteMode() { mNfcAdapter.disableForegroundDispatch(this); } @Override protected void onNewIntent(Intent intent) { if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) { writeTag(intent); } } private void writeTag(Intent intent) { Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); if (NfcUtils.writeTag(NfcUtils.getAsNdef(getEmail() + "|" + getName() + "|" + getPhone()), detectedTag)) { Toast.makeText(this, R.string.nfc_write_success, Toast.LENGTH_LONG).show(); cancelRegister(); clearFields(); } else { Toast.makeText(this, R.string.nfc_write_fail, Toast.LENGTH_LONG).show(); } } private void clearFields() { email.setText(""); name.setText(""); phone.setText(""); } @Override protected void onPause() { super.onPause(); disableTagWriteMode(); } /** * Habilitar a escrita de tags para detectar tags próximas. */ private void enableTagWriteMode() { IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); mWriteTagFilters = new IntentFilter[] { tagDetected }; mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, mWriteTagFilters, null); } public String getEmail() { return email.getText().toString(); } public String getName() { return name.getText().toString(); } public String getPhone() { return phone.getText().toString(); } public void setEmail(String email) { this.email.setText(email); } public void setPhone(String phone) { this.phone.setText(phone); } public void setName(String name) { this.name.setText(name); } }