package monnethic.mobile.settings; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import com.example.monnthic.monnethicmobile.R; import android.os.Bundle; import android.view.View; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Spinner; import android.widget.Switch; import android.widget.Toast; import java.util.ArrayList; import java.util.List; import monnethic.mobile.homepage.InputController; import monnethic.mobile.restApi.SessionApiHandler; import monnethic.mobile.restApi.SettingsApiHandler; import monnethic.mobile.restApi.WalletApiHandler; import monnethic.mobile.wallet.Wallet; public class SettingsActivity extends AppCompatActivity { private Context context = SettingsActivity.this; private ArrayList userWallets; private String user_hash; private String user_email; private String user_password; private String session_id; private EditText currentPassword; private EditText newPassword; private EditText confirmedNewPassword; private Button buttonConfirm; private Button buttonCancel; private Switch enableDeleteWallet; private Switch enableChangePassword; private Spinner walletToDelete; private Spinner walletToTransfer; private EditText confirmWalletToDelete; private LinearLayout l1; private LinearLayout l2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); Intent intent = getIntent(); user_hash = intent.getStringExtra("USER_HASH"); user_email = intent.getStringExtra("USER_EMAIL"); user_password = intent.getStringExtra("USER_PWD"); session_id = intent.getStringExtra("SESSION_ID"); try{ userWallets = (ArrayList) intent.getSerializableExtra("data"); }catch (Exception e){ e.printStackTrace(); userWallets=null; } initView(); } private void initView(){ l1 = (LinearLayout) findViewById(R.id.l1); l2 = (LinearLayout) findViewById(R.id.l2); currentPassword = findViewById(R.id.currentPwd); newPassword = findViewById(R.id.newPwd1); confirmedNewPassword = findViewById(R.id.newPwd2); currentPassword.setEnabled(false); newPassword.setEnabled(false); confirmedNewPassword.setEnabled(false); walletToDelete = findViewById(R.id.spinnerWalletToDelete); walletToTransfer = findViewById(R.id.spinnerWalletToMoveFund); confirmWalletToDelete = findViewById(R.id.editTextConfirmDeleteWallet); walletToTransfer.setEnabled(false); confirmWalletToDelete.setEnabled(false); walletToDelete.setEnabled(false); enableChangePassword = findViewById(R.id.switchChangePassword); enableChangePassword.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if(enableChangePassword.isChecked()){ l1.setBackgroundResource(R.color.zxing_transparent); currentPassword.setEnabled(true); newPassword.setEnabled(true); confirmedNewPassword.setEnabled(true); }else{ l1.setBackgroundResource(R.color.darker_gray); currentPassword.setEnabled(false); newPassword.setEnabled(false); confirmedNewPassword.setEnabled(false); } } }); if(!userWallets.isEmpty()){ List listOptions = new ArrayList<>(); for(Wallet w : userWallets){ listOptions.add(w.getType()); } ArrayAdapter adapterOptions = new ArrayAdapter<>(SettingsActivity.this,android.R.layout.simple_spinner_dropdown_item,listOptions); adapterOptions.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); walletToDelete.setAdapter(adapterOptions); walletToTransfer.setAdapter(adapterOptions); if(userWallets.size()>1 && walletToDelete.getSelectedItemId()==walletToTransfer.getSelectedItemId()){ walletToTransfer.setSelection((int) walletToDelete.getSelectedItemId()+1); } } walletToDelete.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView adapterView, View view, int i, long l) { if(userWallets.size()>1 && walletToTransfer.getSelectedItemId()==(int)l){ if(walletToTransfer.getSelectedItemId()+1==userWallets.size()){ walletToTransfer.setSelection(0); }else{ walletToTransfer.setSelection((int) walletToDelete.getSelectedItemId()+1); } } } @Override public void onNothingSelected(AdapterView adapterView) { } }); enableDeleteWallet = findViewById(R.id.switchDeleteWallet); enableDeleteWallet.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if(userWallets.size()<=1){ Toast.makeText(SettingsActivity.this,"You can't delete a wallet with one or less wallet",Toast.LENGTH_LONG).show(); enableDeleteWallet.setChecked(false); }else{ if(enableDeleteWallet.isChecked()){ l2.setBackgroundResource(R.color.zxing_transparent); walletToTransfer.setEnabled(true); confirmWalletToDelete.setEnabled(true); walletToDelete.setEnabled(true); }else{ l2.setBackgroundResource(R.color.darker_gray); walletToTransfer.setEnabled(false); confirmWalletToDelete.setEnabled(false); walletToDelete.setEnabled(false); } } } }); buttonConfirm = findViewById(R.id.buttonConfirmSettings); buttonConfirm.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(!enableDeleteWallet.isChecked() && !enableChangePassword.isChecked()){ Intent intent = new Intent(); intent.putExtra("new_password",user_password); setResult(1,intent); finish(); } else if (!enableDeleteWallet.isChecked() && enableChangePassword.isChecked()){ InputMethodManager inputMethodManager = (InputMethodManager) SettingsActivity.this.getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(SettingsActivity.this.getCurrentFocus().getWindowToken(),0); changePwd(); } else if (enableDeleteWallet.isChecked() && !enableChangePassword.isChecked()){ InputMethodManager inputMethodManager = (InputMethodManager) SettingsActivity.this.getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(SettingsActivity.this.getCurrentFocus().getWindowToken(),0); deleteWallet(); } else { InputMethodManager inputMethodManager = (InputMethodManager) SettingsActivity.this.getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(SettingsActivity.this.getCurrentFocus().getWindowToken(),0); changePwdAndDeleteWallet(); } } }); buttonCancel = findViewById(R.id.buttonCancelSettings); buttonCancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent3 = new Intent(); intent3.putExtra("new_password",user_password); setResult(1,intent3); finish(); } }); } private void changePwd(){ if(checkInputEmptyPassword()){ if(currentPassword.getText().toString().equals(user_password)){ String[] p = {user_email,user_password,newPassword.getText().toString()}; new changeUserPasswordTask().execute(p); }else{ Toast.makeText(SettingsActivity.this,"Current password don't match actual password",Toast.LENGTH_SHORT).show(); } } } private void deleteWallet(){ if(checkInputEmptyWallet()){ String[] p = {user_email,user_hash,user_password, userWallets.get((int) walletToDelete.getSelectedItemId()).getWallet_hash(), userWallets.get((int) walletToTransfer.getSelectedItemId()).getWallet_hash()}; new deleteWalletTask().execute(p); } } private void changePwdAndDeleteWallet(){ if(checkInputEmptyPassword()){ if(!currentPassword.getText().toString().equals(user_password)){ Toast.makeText(SettingsActivity.this,"Current password don't match actual password",Toast.LENGTH_SHORT).show(); }else{ if(checkInputEmptyWallet()){ String[] p = {user_email,user_password,newPassword.getText().toString(),user_hash, userWallets.get((int) walletToDelete.getSelectedItemId()).getWallet_hash(), userWallets.get((int) walletToTransfer.getSelectedItemId()).getWallet_hash()}; new updatePwdAndDeleteWalletTask().execute(p); } } } } private boolean checkInputEmptyPassword(){ if(InputController.isEmptyEdit(currentPassword)){ Toast.makeText(this, "You didn't enter current password", Toast.LENGTH_SHORT).show(); return false; } else if(InputController.isEmptyEdit(newPassword)){ Toast.makeText(this, "You didn't enter new password", Toast.LENGTH_SHORT).show(); return false; } else if(InputController.isEmptyEdit(confirmedNewPassword)){ Toast.makeText(this, "You didn't enter confirmation password", Toast.LENGTH_SHORT).show(); return false; } else { if(!InputController.passwordValidator(newPassword.getText().toString())){ Toast.makeText(this, "Password must contains 6 to 20 characters, one lowercase, one uppercase and one digit", Toast.LENGTH_LONG).show(); return false; } else if (!(newPassword.getText().toString().equals(confirmedNewPassword.getText().toString()))) { Toast.makeText(this, "New Password don't match Confirmation Password", Toast.LENGTH_SHORT).show(); return false; } else{ return true; } } } private boolean checkInputEmptyWallet(){ if(InputController.isEmptyEdit(confirmWalletToDelete)){ Toast.makeText(this, "You didn't confirm wallet deletion", Toast.LENGTH_SHORT).show(); return false; }else{ if(!confirmWalletToDelete.getText().toString().equals(userWallets.get((int) walletToDelete.getSelectedItemId()).getType())){ Toast.makeText(this, "Confirmation wallet don't match wallet to delete", Toast.LENGTH_SHORT).show(); return false; } else if(walletToDelete.getSelectedItemId()==walletToTransfer.getSelectedItemId()) { Toast.makeText(this, "Delete wallet and Wallet to transfer fund can't be the same", Toast.LENGTH_SHORT).show(); return false; } else { return true; } } } //AsyncTask to change userPassword private class changeUserPasswordTask extends AsyncTask { RelativeLayout progress = findViewById(R.id.progressLayout); @Override protected void onPreExecute() { super.onPreExecute(); currentPassword.setEnabled(false); newPassword.setEnabled(false); confirmedNewPassword.setEnabled(false); walletToTransfer.setEnabled(false); confirmWalletToDelete.setEnabled(false); walletToDelete.setEnabled(false); buttonCancel.setEnabled(false); buttonConfirm.setEnabled(false); enableChangePassword.setEnabled(false); enableDeleteWallet.setEnabled(false); getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); progress.setVisibility(View.VISIBLE); } @Override protected String doInBackground(String... params) { try{ SettingsApiHandler settingsApiHandler = new SettingsApiHandler(); return settingsApiHandler.updatePassword(params); }catch (Exception e){ e.printStackTrace(); return null; } } @Override protected void onPostExecute(String v) { if(Boolean.parseBoolean(v)){ Toast.makeText(SettingsActivity.this,"Password updated",Toast.LENGTH_SHORT).show(); Intent intent = new Intent(); intent.putExtra("new_password",newPassword.getText().toString()); setResult(1,intent); finish(); }else{ Toast.makeText(SettingsActivity.this,"An error occured",Toast.LENGTH_SHORT).show(); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); progress.setVisibility(View.GONE); currentPassword.setEnabled(true); newPassword.setEnabled(true); confirmedNewPassword.setEnabled(true); buttonCancel.setEnabled(true); buttonConfirm.setEnabled(true); enableChangePassword.setEnabled(true); enableChangePassword.setChecked(false); } } } private class deleteWalletTask extends AsyncTask { RelativeLayout progress = findViewById(R.id.progressLayout); @Override protected void onPreExecute() { super.onPreExecute(); currentPassword.setEnabled(false); newPassword.setEnabled(false); confirmedNewPassword.setEnabled(false); walletToTransfer.setEnabled(false); confirmWalletToDelete.setEnabled(false); walletToDelete.setEnabled(false); buttonCancel.setEnabled(false); buttonConfirm.setEnabled(false); enableChangePassword.setEnabled(false); enableDeleteWallet.setEnabled(false); getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); progress.setVisibility(View.VISIBLE); } @Override protected String doInBackground(String... params) { try{ WalletApiHandler walletApiHandler = new WalletApiHandler(); return walletApiHandler.deleteWallet(params); }catch (Exception e){ e.printStackTrace(); return null; } } @Override protected void onPostExecute(String v) { if(Boolean.parseBoolean(v)){ Toast.makeText(SettingsActivity.this,"Wallet has been deleted",Toast.LENGTH_SHORT).show(); Intent intent = new Intent(); intent.putExtra("new_password",user_password); setResult(1,intent); finish(); }else{ Toast.makeText(SettingsActivity.this,"An error occured",Toast.LENGTH_SHORT).show(); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); progress.setVisibility(View.GONE); walletToDelete.setEnabled(true); walletToTransfer.setEnabled(true); confirmWalletToDelete.setEnabled(true); buttonCancel.setEnabled(true); buttonConfirm.setEnabled(true); enableDeleteWallet.setEnabled(true); enableDeleteWallet.setChecked(false); } } } private class updatePwdAndDeleteWalletTask extends AsyncTask{ RelativeLayout progress = findViewById(R.id.progressLayout); @Override protected void onPreExecute() { super.onPreExecute(); currentPassword.setEnabled(false); newPassword.setEnabled(false); confirmedNewPassword.setEnabled(false); walletToTransfer.setEnabled(false); confirmWalletToDelete.setEnabled(false); walletToDelete.setEnabled(false); buttonCancel.setEnabled(false); buttonConfirm.setEnabled(false); enableChangePassword.setEnabled(false); enableDeleteWallet.setEnabled(false); getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); progress.setVisibility(View.VISIBLE); } @Override protected String doInBackground(String... params) { try{ SettingsApiHandler settingsApiHandler = new SettingsApiHandler(); WalletApiHandler walletApiHandler = new WalletApiHandler(); if(Boolean.parseBoolean(settingsApiHandler.updatePassword(new String[]{params[0],params[1],params[2]}))){ if(Boolean.parseBoolean(walletApiHandler.deleteWallet(new String[]{params[0],params[3],params[2],params[4],params[5]}))){ return "true"; } } }catch (Exception e){ e.printStackTrace(); return null; } return "false"; } @Override protected void onPostExecute(String v) { if(Boolean.parseBoolean(v)){ Toast.makeText(SettingsActivity.this,"Password updated & Wallet deleted",Toast.LENGTH_SHORT).show(); Intent intent = new Intent(); intent.putExtra("new_password",newPassword.getText().toString()); setResult(1,intent); finish(); }else{ Toast.makeText(SettingsActivity.this,"An error occured",Toast.LENGTH_SHORT).show(); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); progress.setVisibility(View.GONE); currentPassword.setEnabled(true); newPassword.setEnabled(true); confirmedNewPassword.setEnabled(true); buttonCancel.setEnabled(true); buttonConfirm.setEnabled(true); enableChangePassword.setEnabled(true); enableChangePassword.setChecked(false); walletToDelete.setEnabled(true); walletToTransfer.setEnabled(true); confirmWalletToDelete.setEnabled(true); buttonCancel.setEnabled(true); buttonConfirm.setEnabled(true); enableDeleteWallet.setEnabled(true); enableDeleteWallet.setChecked(false); } } } @Override public void onBackPressed() { Intent intent = new Intent(); intent.putExtra("new_password",user_password); setResult(1,intent); super.onBackPressed(); } @Override protected void onStop() { super.onStop(); // Always call the superclass method first new EndSessionTask().execute(session_id); } private class EndSessionTask extends AsyncTask { @Override protected Void doInBackground(String... strings) { try{ SessionApiHandler sessionApiHandler = new SessionApiHandler(); sessionApiHandler.endSession(strings[0]); }catch (Exception e){ e.printStackTrace(); } return null; } } }