Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //AmRandomTools.java
- package com.joythis.android.passwordsgenerator;
- import java.util.Random;
- public class AmRandomTools {
- public static int randomInt(int pMin, int pMax){
- Random r = new Random();
- int iAmplitude = pMax-pMin+1;
- int iJump = r.nextInt(iAmplitude);
- int iDestination = pMin + iJump;
- return iDestination;
- }//randomInt
- public static char randomSmallLetter(){
- int iCode_a = (int)'a';
- int iCode_z = (int)'z';
- int iRandomCode_a_z = randomInt(
- iCode_a,
- iCode_z
- );
- return (char)iRandomCode_a_z;
- }//randomSmallLetter
- public static char randomCapitalLetter(){
- int iCode_A = (int)'A';
- int iCode_Z = (int)'Z';
- int iRandomCode_A_Z = randomInt(
- iCode_A,
- iCode_Z
- );
- return (char)iRandomCode_A_Z;
- }//randomCapitalLetter
- public static char randomDigit(){
- int iCode = randomInt(
- (int)'0',
- (int)'9'
- );
- return (char)iCode;
- }//randomDigit
- public static String randomPassword(
- int pSize,
- boolean pbCL,
- boolean pbSL,
- boolean pbDigits,
- String pSS
- ){
- String strPassword = "";
- boolean bSS = pSS.trim().length()>0;
- boolean bCautela = pbCL || pbSL || pbDigits || bSS;
- if(bCautela){
- while(strPassword.length()<pSize){
- int iTipoDeSimbolo = randomInt(1, 4);
- switch(iTipoDeSimbolo){
- case 1: //CL
- if(pbCL) strPassword+=randomCapitalLetter();
- break;
- case 2: //SL
- if(pbSL) strPassword+=randomSmallLetter();
- break;
- case 3: //Digits
- if(pbDigits) strPassword+=randomDigit();
- break;
- case 4: //ss
- String[] aSS = pSS.trim().split(" ");
- String singleSS =
- aSS[randomInt(0, aSS.length-1)];
- strPassword+=singleSS;
- break;
- }//switch
- }//while
- }//if bCautela
- return strPassword;
- }//randomPassword
- }
- ***********************************************************************
- //PassGen.java
- package com.joythis.android.passwordsgenerator;
- import androidx.annotation.NonNull;
- import androidx.appcompat.app.AppCompatActivity;
- import android.app.Activity;
- import android.content.Context;
- import android.content.Intent;
- import android.content.SharedPreferences;
- import android.os.Bundle;
- import android.view.Menu;
- import android.view.MenuInflater;
- import android.view.MenuItem;
- import android.view.View;
- import android.widget.ArrayAdapter;
- import android.widget.Button;
- import android.widget.ListView;
- import android.widget.TextView;
- import android.widget.Toast;
- import java.util.ArrayList;
- import java.util.HashSet;
- import java.util.Set;
- public class PassGen extends AppCompatActivity {
- public final static String SETTINGS_DB = "SETTINGS.DB";
- public final static String KEY_BCL = "KEY_BCL";
- public final static String KEY_BSL = "KEY_BSL";
- public final static String KEY_BDigits = "KEY_BD";
- public final static String KEY_SS = "KEY_SS";
- public final static String KEY_SIZE = "KEY_SIZE";
- public final static int DEFAULT_SIZE = 16;
- public final static boolean DEFAULT_BCL = true;
- public final static boolean DEFAULT_BSL = true;
- public final static boolean DEFAULT_BDigits = true;
- //public final static String DEFAULT_SS = "???";
- Context mContext;
- Activity mSelfActivity;
- SharedPreferences mSp;
- TextView mTvCurrentSettings;
- Button mBtnGenPass;
- ListView mLvPasswords; //visualização
- ArrayAdapter<String> mAd; //intermediação
- ArrayList<String> mPwds; //dados
- View.OnClickListener mClickHandler =
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- String p =
- AmRandomTools.randomPassword(
- miSize,
- mbCL,
- mbSL,
- mbDigits,
- mSpecialSymbols
- );
- if(p.length()>0) {
- mPwds.add(0, p);
- mAd.notifyDataSetChanged();
- }
- else{
- Toast t = Toast.makeText(
- mSelfActivity,
- "Must accept at least 1 type of symbols.",
- Toast.LENGTH_LONG
- );
- t.show();
- }
- }//onClick
- };//OnClickListener
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- //setContentView(R.layout.activity_pass_gen);
- setContentView(R.layout.rl_pass_gen_v1);
- init();
- }//onCreate
- void init(){
- //1 - assocs
- mSelfActivity = this;
- mContext = this;
- mTvCurrentSettings = findViewById(R.id.idTvCurrentSettings);
- mSp = this.getSharedPreferences(
- SETTINGS_DB,
- MODE_PRIVATE
- );
- mBtnGenPass = findViewById(
- R.id.idBtnGenPass
- );
- mLvPasswords = findViewById(
- R.id.idLvPasswords
- );
- //2 behaviors
- if(mBtnGenPass!=null)
- mBtnGenPass.setOnClickListener
- (mClickHandler);
- if(mLvPasswords!=null){
- mPwds = new ArrayList<String>();
- mAd = new ArrayAdapter<String>(
- mContext,
- android.R.layout.simple_list_item_1,
- mPwds
- );
- mLvPasswords.setAdapter(mAd);
- }
- //3
- loadSettingsFromSP();
- }//init
- int miSize;
- boolean mbCL, mbSL, mbDigits;
- String mSpecialSymbols;
- public void loadSettingsFromSP(){
- if (mSp!=null){
- // leitura
- miSize = mSp.getInt(KEY_SIZE, DEFAULT_SIZE);
- mbCL = mSp.getBoolean(KEY_BCL, DEFAULT_BCL);
- mbSL = mSp.getBoolean(KEY_BSL, DEFAULT_BSL);
- mbDigits = mSp.getBoolean(KEY_BDigits, DEFAULT_BDigits);
- mSpecialSymbols = mSp.getString(KEY_SS, getString(R.string.strSSDefault));
- String strDashboard =
- String.format(
- "size:%d CL:%s SL:%s D:%s SS:%s",
- miSize,
- mbCL ? "YES" : "NO",
- mbSL ? "YES" : "NO",
- mbDigits ? "YES" : "NO",
- mSpecialSymbols
- );
- mTvCurrentSettings.setText(strDashboard);
- }
- }//loadSettingsFromSP
- @Override
- public boolean onCreateOptionsMenu(Menu pMenu) {
- MenuInflater minf = this.getMenuInflater();
- minf.inflate(
- R.menu.nav_menu,
- pMenu
- );
- return super.onCreateOptionsMenu(pMenu);
- }//onCreateOptionsMenu
- // menu items' behavior
- @Override
- public boolean onOptionsItemSelected(@NonNull MenuItem item) {
- switch(item.getItemId()){
- case R.id.idMenuItemGoSettings:
- actionGoSettings();
- break;
- case R.id.idMenuItemQuitApp:
- actionQuitApp();
- break;
- }//switch
- return super.onOptionsItemSelected(item);
- }//onOptionsItemSelected
- void actionGoSettings(){
- Intent goSettings = new Intent(
- PassGen.this,
- PassSettings.class
- );
- if(goSettings!=null){
- startActivity(goSettings);
- }//if
- }//actionGoSettings
- void actionQuitApp(){
- Intent quit = new Intent(Intent.ACTION_MAIN);
- if (quit!=null){
- quit.addCategory(Intent.CATEGORY_HOME);
- quit.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(quit);
- this.finish();
- }
- }//actionQuitApp
- /*
- MANUTENÇÃO DE ESTADO
- */
- /*
- O que não quisermos perder
- da visualização na interface
- deve ser preservado agora
- */
- public final static String KEY_PWDS = "KEY_PWDS";
- @Override
- protected void onSaveInstanceState(@NonNull Bundle outState) {
- // escrever na Bundle, em chave adequada
- // a lista das passwords
- if(outState!=null) {
- outState.putStringArrayList(
- KEY_PWDS,
- mPwds
- );
- }//if
- super.onSaveInstanceState(outState);
- }//onSaveInstanceState
- SharedPreferences mSpPwds;
- //TODO: inicializar em init
- void gravarTodasAsPasswordsEmSP(){
- SharedPreferences.Editor ed = mSpPwds.edit();
- if (ed!=null){
- Set<String> stringSetPwds =
- new HashSet<>();
- stringSetPwds.addAll(mPwds);
- ed.putStringSet(
- KEY_PWDS,
- stringSetPwds
- );
- ed.commit();
- }
- }
- void recuperarTodasAsPasswordsDeSP(){
- if(mSpPwds!=null){
- Set<String> stringSetPwds =
- mSpPwds.getStringSet(KEY_PWDS, null);
- mPwds.clear();
- mPwds.addAll(stringSetPwds);
- }
- }//recuperarTodasAsPasswordsDeSP
- /*
- automaticamente chamado para recuperar
- dados preservados pelo sistema nalguma Bundle
- */
- @Override
- protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
- if(savedInstanceState!=null){
- boolean bKeyPwdsExists =
- savedInstanceState.containsKey(KEY_PWDS);
- if(bKeyPwdsExists){
- ArrayList<String> al =
- savedInstanceState.getStringArrayList(
- KEY_PWDS
- );
- //mPwds = al;
- if(al!=null && al.size()>0){
- mPwds.clear();
- mPwds.addAll(al);
- /*
- for(String p : al){
- mPwds.add(p);
- }
- */
- }
- mAd.notifyDataSetChanged();
- }//if
- }
- super.onRestoreInstanceState(savedInstanceState);
- }
- }//PassGen
- **********************************************
- //PassSettings.java
- package com.joythis.android.passwordsgenerator;
- import androidx.appcompat.app.AppCompatActivity;
- import android.app.Activity;
- import android.content.Context;
- import android.content.Intent;
- import android.content.SharedPreferences;
- import android.os.Build;
- import android.os.Bundle;
- import android.view.KeyEvent;
- import android.view.View;
- import android.widget.Button;
- import android.widget.CheckBox;
- import android.widget.EditText;
- import android.widget.SeekBar;
- import android.widget.TextView;
- public class PassSettings extends AppCompatActivity {
- Activity mSelfActivity;
- Context mContext;
- public final static int MIN_PWD_SIZE = 6;
- TextView mTvDashboard; // feedback quando se utiliza a SeekBar
- SeekBar mSbSize; // controla o tamanho das passwords a produzir
- CheckBox mCbCapitalLetters, mCbSmallLetters, mCbDigits;
- EditText mEtSS; // onde se entram os símbolos "especiais"
- Button mBtnConfirmSettings; // quando clicked, fará a escrita das escolhas em SharedPreferences
- SharedPreferences mSpSettings; // membro de dados para aceder às SP (nesta Activity, escrevê-las)
- AmUtil mUtil;
- SeekBar.OnSeekBarChangeListener
- mSbChangeHandler = new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- if(mTvDashboard!=null){
- String strMsg =
- "Request password size: "+
- String.valueOf(mSbSize.getProgress());
- mTvDashboard.setText(strMsg);
- }
- }//onProgressChanged
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- }
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- }
- }; //
- View.OnClickListener mClickHandler = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- switch(v.getId()){
- case R.id.idBtnConfirmSettings:
- actionConfirmSettings();
- break;
- }//switch
- } // onClick
- }; // mClickHandler
- /*
- gravar os settings
- *e*
- regressar à Activity principal
- */
- void actionConfirmSettings(){
- saveSettingsToSharedPreferences();
- //TODO
- Intent goPassGen = new Intent(
- PassSettings.this,
- PassGen.class
- );
- startActivity(goPassGen);
- }//actionConfirmSettings
- /*
- observar as opções assumidas pela UI
- e gravá-las em SP
- */
- void saveSettingsToSharedPreferences(){
- int iPassSize = mSbSize.getProgress();
- boolean bCL = mCbCapitalLetters.isChecked();
- boolean bSL = mCbSmallLetters.isChecked();
- boolean bDigits = mCbDigits.isChecked();
- String ss = mEtSS.getText().toString().trim();
- if (mSpSettings !=null){
- SharedPreferences.Editor ed =
- mSpSettings.edit();
- if (ed!=null){
- ed.putInt(PassGen.KEY_SIZE, iPassSize);
- ed.putBoolean(PassGen.KEY_BCL, bCL);
- ed.putBoolean(PassGen.KEY_BSL, bSL);
- ed.putBoolean(PassGen.KEY_BDigits, bDigits);
- ed.putString(PassGen.KEY_SS, ss);
- ed.commit(); // síncrono / bloqueante
- //ed.apply(); // assíncrono
- mUtil.feedback(
- this.getResources().getString(
- //"Info: settings written"
- R.string.strInfoUpdatedSettings
- )
- );
- }//if
- }//if
- } // saveSettingsToSharedPreferences
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_pass_settings);
- init();
- }//onCreate
- void init(){
- //1 - assocs
- mContext = this;
- mSelfActivity = this;
- mTvDashboard = findViewById(R.id.idTvDashboard);
- mSbSize = findViewById(R.id.idSbSize);
- if(mSbSize!=null){
- if (
- Build.VERSION.SDK_INT >=
- Build.VERSION_CODES.O)
- {
- mSbSize.setMin(MIN_PWD_SIZE);
- }
- }//mSbSize
- mCbCapitalLetters = findViewById(R.id.idCbCapitalLetters);
- mCbSmallLetters = findViewById(R.id.idCbSmallLetters);
- mCbDigits = findViewById(R.id.idCbDigits);
- mEtSS = findViewById(R.id.idEtSS);
- mBtnConfirmSettings = findViewById(R.id.idBtnConfirmSettings);
- mUtil = new AmUtil(this);
- mSpSettings = this.getSharedPreferences(
- PassGen.SETTINGS_DB, // nome do ficheiro com a DB SP
- MODE_PRIVATE
- );
- //2 - behaviors / comportamentos
- mBtnConfirmSettings.setOnClickListener(mClickHandler);
- mEtSS.setOnKeyListener(mKeyHandler);
- mSbSize.setOnSeekBarChangeListener(
- mSbChangeHandler
- );
- //3 - recuperar os settings, conforme em SP
- loadAndReflectSettingsFromSP();
- }//init
- void loadAndReflectSettingsFromSP(){
- /*
- 1)
- há que ler os valores para settings
- conforme escritos em SharedPreferences
- em certa base de dados estabelecida
- pela constante SETTINGS_DB (da Activity principal)
- 2)
- temos que refletir os valores nos objetos de
- interface; isto é, a SeekBar se o tamanho
- está em x deve ficar com o progress a x;
- ...
- se está escolhido que não há deve letras
- pequenas, a CheckBox não deverá estar checked
- ...
- e assim sucessivamente para todos os objetos
- de interface
- */
- if(mSpSettings !=null){
- //leituras
- //1
- int iSize = mSpSettings.getInt(
- PassGen.KEY_SIZE,
- PassGen.DEFAULT_SIZE
- );
- mSbSize.setProgress(iSize);
- //2
- boolean bCL = mSpSettings.getBoolean(
- PassGen.KEY_BCL,
- PassGen.DEFAULT_BCL
- );
- mCbCapitalLetters.setChecked(bCL);
- //3
- boolean bSL = mSpSettings.getBoolean(
- PassGen.KEY_BSL,
- PassGen.DEFAULT_BSL
- );
- mCbSmallLetters.setChecked(bSL);
- //4
- boolean bDigits = mSpSettings.getBoolean(
- PassGen.KEY_BDigits,
- PassGen.DEFAULT_BDigits
- );
- mCbDigits.setChecked(bDigits);
- //5
- String strSSDefault =
- getString(R.string.strSSDefault);
- String ss = mSpSettings.getString(
- PassGen.KEY_SS,
- strSSDefault
- );
- mEtSS.setText(ss);
- }//if
- }//loadSettingsFromSP
- View.OnKeyListener mKeyHandler = new View.OnKeyListener() {
- @Override
- public boolean onKey(
- View v,
- int keyCode,
- KeyEvent event
- )
- {
- boolean bActionKeyDown =
- event.getAction()==KeyEvent.ACTION_DOWN;
- if (bActionKeyDown){
- boolean bWasENTER =
- keyCode == KeyEvent.KEYCODE_ENTER;
- if (bWasENTER){
- mUtil.hideSoftKeyboard();
- saveSettingsToSharedPreferences();
- return true; // evento completamente consumido
- }// if
- }//if
- return false;
- } // onKey
- }; // mKeyHandler
- }
Advertisement
Add Comment
Please, Sign In to add comment