package com.monitorabrasil.participacidadao.views; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.os.Bundle; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Switch; import android.widget.TextView; import android.widget.Toast; import com.monitorabrasil.participacidadao.R; import com.monitorabrasil.participacidadao.actions.ActionsCreator; import com.monitorabrasil.participacidadao.actions.UserActions; import com.monitorabrasil.participacidadao.dispatcher.Dispatcher; import com.monitorabrasil.participacidadao.stores.UserStore; import com.parse.GetDataCallback; import com.parse.ParseException; import com.parse.ParseFile; import com.parse.ParseUser; import com.parse.SaveCallback; import com.squareup.otto.Bus; import com.squareup.otto.Subscribe; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.InputStream; //import com.parse.ParseTwitterUtils; //import com.parse.ParseTwitterUtils; /** * Tela de login */ public class LoginActivity extends AppCompatActivity { private LinearLayout llTwitter; private AutoCompleteTextView mEmailView; private EditText mPasswordView; private EditText mNome; private View mProgressView; private Button btnFazerCadastro; private Button btnLogar; private Button btnLogout; private Button btnSalvar; private Switch mSwitchTwitter; private ImageView foto; private ParseUser currentUser; private ImageButton btnFoto; private Dispatcher dispatcher; private ActionsCreator actionsCreator; private UserStore userStore; private LinearLayout form; private final int PICK_IMAGE=2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); initDependencies(); setupView(); } private void initDependencies() { dispatcher = Dispatcher.get(new Bus()); actionsCreator = ActionsCreator.get(dispatcher); userStore = UserStore.get(dispatcher); } private void setupView() { setupActionBar(); llTwitter = (LinearLayout) findViewById(R.id.llTwitter); form = (LinearLayout) findViewById(R.id.email_login_form); mSwitchTwitter = (Switch) findViewById(R.id.swTwitter); //progressView mProgressView = findViewById(R.id.login_progress); //botoes btnSalvar = (Button) findViewById(R.id.btnSalvar); btnFoto = (ImageButton) findViewById(R.id.btnFoto); btnLogar = (Button) findViewById(R.id.email_sign_in_button); btnLogout = (Button) findViewById(R.id.btnLogout); //usuario atual currentUser = ParseUser.getCurrentUser(); //atualizar usuario btnSalvar.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showProgress(true); atualizaCadastro(); } }); //evento: logar btnLogar.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { showProgress(true); logar(); } }); //evento: logout btnLogout.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showProgress(true); logout(); } }); //Botao para fazer o cadastro btnFazerCadastro = (Button) findViewById(R.id.fazer_cadastro); btnFazerCadastro.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (btnFazerCadastro.getText().toString().equals("Fazer Cadastro")) { mNome.setVisibility(View.VISIBLE); btnLogar.setVisibility(View.GONE); llTwitter.setVisibility(View.GONE); btnFazerCadastro.setText("Cadastrar"); btnFoto.setVisibility(View.VISIBLE); btnFoto.setImageResource(R.mipmap.ic_person); View view = mNome; view.requestFocus(); } else { if (validaCampos()) { realizarCadastro(); } } } }); //evento: Busca foto para colocar no perfil btnFoto.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT); getIntent.setType("image/*"); Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); pickIntent.setType("image/*"); Intent chooserIntent = Intent.createChooser(getIntent, "Selecione uma foto"); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{pickIntent}); startActivityForResult(chooserIntent, PICK_IMAGE); } }); mSwitchTwitter.setVisibility(View.INVISIBLE); // mSwitchTwitter.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { // @Override // public void onCheckedChanged(CompoundButton compoundButton, boolean b) { // final ParseUser user = ParseUser.getCurrentUser(); // if (b) { // if (!ParseTwitterUtils.isLinked(user)) { // ParseTwitterUtils.link(user, getApplicationContext(), new SaveCallback() { // @Override // public void done(ParseException ex) { // if (ParseTwitterUtils.isLinked(user)) { // Snackbar.make(form, "Woohoo!! Conta adicionada!", Snackbar.LENGTH_LONG) // .setAction("Action", null).show(); // } // } // }); // } // } else { // ParseTwitterUtils.unlinkInBackground(user, new SaveCallback() { // @Override // public void done(ParseException ex) { // if (ex == null) { // if (ParseTwitterUtils.isLinked(user)) { // Snackbar.make(form, "Conta do Twitter removida", Snackbar.LENGTH_LONG) // .setAction("Action", null).show(); // } // } // } // }); // } // } // }); //EditTextViews mNome = (EditText) findViewById(R.id.txtNome); mNome.setVisibility(View.GONE); mEmailView = (AutoCompleteTextView) findViewById(R.id.email); mPasswordView = (EditText) findViewById(R.id.password); mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { // if (id == R.id.login || id == EditorInfo.IME_NULL) { // attemptLogin(); // return true; // } return false; } }); //verifica se esta logado if (currentUser != null) { montaFormLogout(); } else { montaFormLogin(); } } /** * Verifica se esta logado */ private void verificaLogin() { if(ParseUser.getCurrentUser()!=null){ montaFormLogout(); }else{ montaFormLogin(); } } /** * Realiza o logout */ private void logout() { actionsCreator.logout(); } /** * Monta o form de login */ private void montaFormLogin() { mEmailView.setVisibility(View.VISIBLE); mPasswordView.setVisibility(View.VISIBLE); btnLogar.setVisibility(View.VISIBLE); btnFazerCadastro.setVisibility(View.VISIBLE); mNome.setVisibility(View.GONE); llTwitter.setVisibility(View.GONE); btnFoto.setVisibility(View.INVISIBLE); btnSalvar.setVisibility(View.GONE); btnLogout.setVisibility(View.GONE); } /** * Monta o form para logout */ private void montaFormLogout() { ParseUser user = ParseUser.getCurrentUser(); mPasswordView.setVisibility(View.GONE); btnLogar.setVisibility(View.GONE); btnFazerCadastro.setVisibility(View.GONE); mEmailView.setVisibility(View.VISIBLE); mEmailView.setText(user.getEmail()); mNome.setVisibility(View.VISIBLE); mNome.setText(user.get("nome").toString()); llTwitter.setVisibility(View.VISIBLE); btnFoto.setVisibility(View.VISIBLE); btnSalvar.setVisibility(View.VISIBLE); btnLogout.setVisibility(View.VISIBLE); showProgress(false); ParseFile foto = (ParseFile)user.get("foto"); if(foto!=null){ foto.getDataInBackground(new GetDataCallback() { public void done(byte[] data, ParseException e) { if (e == null) { Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data.length); bitmap = Bitmap.createScaledBitmap(bitmap, 120, 120, true); btnFoto.setImageBitmap(bitmap); } else { // something went wrong } } }); } } /** * Realiza o login */ private void logar() { if(validaCampos()){ actionsCreator.logar(getInputUsuario(), getInputSenha()); } } private String getInputUsuario() { return mEmailView.getText().toString(); } private String getInputSenha() { return mPasswordView.getText().toString(); } /** * Valida os campos do formulario (login e cadastro) * @return */ private boolean validaCampos() { // Reset errors. mEmailView.setError(null); mPasswordView.setError(null); mNome.setError(null); boolean valido = true; View focusView = null; String email = mEmailView.getText().toString(); String password = mPasswordView.getText().toString(); String nome =mNome.getText().toString(); if (mNome.getVisibility() == View.VISIBLE){ if (TextUtils.isEmpty(nome)) { mNome.setError(getString(R.string.error_field_required)); focusView = mNome; valido = false; } } // Checar senha foi preenchida if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) { mPasswordView.setError(getString(R.string.error_invalid_password)); focusView = mPasswordView; valido = false; } // checar se email eh valido if (TextUtils.isEmpty(email)) { mEmailView.setError(getString(R.string.error_field_required)); focusView = mEmailView; valido = false; } else if (!isEmailValid(email)) { mEmailView.setError(getString(R.string.error_invalid_email)); focusView = mEmailView; valido = false; } if(!valido){ focusView.requestFocus(); } return valido; } private void atualizaCadastro() { //ParseFile final ParseFile mParseFile = new ParseFile("foto.png",buscaFoto()); mParseFile.saveInBackground(new SaveCallback() { public void done(ParseException e) { // If successful add file to user and signUpInBackground if (e == null) { if(mParseFile!= null) currentUser.put("foto", mParseFile); currentUser.saveInBackground(new SaveCallback() { @Override public void done(ParseException e) { currentUser.setEmail(mEmailView.getText().toString()); currentUser.put("nome", mNome.getText().toString()); currentUser.saveInBackground(new SaveCallback() { @Override public void done(ParseException e) { showProgress(false); if (null == e) { Toast.makeText(LoginActivity.this, getString(R.string.cadastro_atualizado), Toast.LENGTH_LONG).show(); } else { try { currentUser.fetch(); mEmailView.setText(currentUser.getEmail()); } catch (ParseException e1) { e1.printStackTrace(); } Toast.makeText(LoginActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); } } }); } }); } else { Toast.makeText(LoginActivity.this,e.getMessage(), Toast.LENGTH_LONG).show(); } } }); } private byte[] buscaFoto(){ Bitmap bitmap = ((BitmapDrawable)btnFoto.getDrawable()).getBitmap(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray(); return byteArray; } /** * Atualiza a UI depois de uma action * @param event */ @Subscribe public void onTodoStoreChange(UserStore.UserStoreChangeEvent event) { switch (userStore.getEvento()) { case UserActions.USER_CADASTRO: if(userStore.getStatus().equals("erro")){ showProgress(false); Snackbar.make(form, "Houve um erro ao fazer seu cadastro", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } break; case UserActions.USER_LOGAR: if(userStore.getStatus().equals("erro")){ showProgress(false); Snackbar.make(form, "Houve um erro ao fazer o login", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } break; } updateUI(); } @Override protected void onResume() { super.onResume(); dispatcher.register(this); dispatcher.register(userStore); } @Override protected void onPause() { super.onPause(); dispatcher.unregister(this); dispatcher.unregister(userStore); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_IMAGE && resultCode == Activity.RESULT_OK) { if (data == null) { //Display an error return; } try { Uri selectedImage = data.getData(); InputStream imageStream = getContentResolver().openInputStream(selectedImage); Bitmap mImage = BitmapFactory.decodeStream(imageStream); btnFoto.setImageBitmap(Bitmap.createScaledBitmap(mImage, 120, 120, false)); } catch (FileNotFoundException e) { e.printStackTrace(); } } } private void showProgress(boolean b) { if(b){ mProgressView.setVisibility(View.VISIBLE); }else{ mProgressView.setVisibility(View.GONE); } } private void realizarCadastro() { String email = mEmailView.getText().toString(); String password = mPasswordView.getText().toString(); String nome =mNome.getText().toString(); //foto Bitmap bitmap = ((BitmapDrawable)btnFoto.getDrawable()).getBitmap(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray(); //ParseFile ParseFile mParseFile = new ParseFile("foto.png",byteArray); showProgress(true); actionsCreator.cadastrar(nome, password, email,mParseFile); } /** * Set up the {@link android.app.ActionBar}, if the API is available. */ // @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void setupActionBar() { Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); // toolbar.setNavigationIcon(R.drawable.ic_good); toolbar.setTitle("Login"); // toolbar.setTitleTextColor(getResources().getColor(R.color.md_white_1000)); // toolbar.setSubtitleTextColor(getResources().getColor(R.color.md_white_1000)); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } /** * Realiza o login */ public void attemptLogin() { showProgress(true); logar(); } /** * Verifica se o email eh valido * @param email * @return */ private boolean isEmailValid(String email) { String ePattern = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$"; java.util.regex.Pattern p = java.util.regex.Pattern.compile(ePattern); java.util.regex.Matcher m = p.matcher(email); return m.matches(); } /** * verifica se a senha eh valida * @param password * @return */ private boolean isPasswordValid(String password) { return password.length() > 4; } /** * Atualiza a UI */ private void updateUI() { showProgress(false); verificaLogin(); } }