am_dot_com

DDM 2022-11-22

Nov 22nd, 2022 (edited)
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.20 KB | None | 0 0
  1. //AmRandomTools.java
  2. package com.joythis.android.passwordsgenerator;
  3.  
  4. import java.util.Random;
  5.  
  6. public class AmRandomTools {
  7.  
  8. public static int randomInt(int pMin, int pMax){
  9. Random r = new Random();
  10. int iAmplitude = pMax-pMin+1;
  11. int iJump = r.nextInt(iAmplitude);
  12. int iDestination = pMin + iJump;
  13. return iDestination;
  14. }//randomInt
  15.  
  16. public static char randomSmallLetter(){
  17. int iCode_a = (int)'a';
  18. int iCode_z = (int)'z';
  19. int iRandomCode_a_z = randomInt(
  20. iCode_a,
  21. iCode_z
  22. );
  23. return (char)iRandomCode_a_z;
  24. }//randomSmallLetter
  25.  
  26. public static char randomCapitalLetter(){
  27. int iCode_A = (int)'A';
  28. int iCode_Z = (int)'Z';
  29. int iRandomCode_A_Z = randomInt(
  30. iCode_A,
  31. iCode_Z
  32. );
  33. return (char)iRandomCode_A_Z;
  34. }//randomCapitalLetter
  35.  
  36. public static char randomDigit(){
  37. int iCode = randomInt(
  38. (int)'0',
  39. (int)'9'
  40. );
  41. return (char)iCode;
  42. }//randomDigit
  43.  
  44. public static String randomPassword(
  45. int pSize,
  46. boolean pbCL,
  47. boolean pbSL,
  48. boolean pbDigits,
  49. String pSS
  50. ){
  51. String strPassword = "";
  52. boolean bSS = pSS.trim().length()>0;
  53. boolean bCautela = pbCL || pbSL || pbDigits || bSS;
  54. if(bCautela){
  55. while(strPassword.length()<pSize){
  56. int iTipoDeSimbolo = randomInt(1, 4);
  57.  
  58. switch(iTipoDeSimbolo){
  59. case 1: //CL
  60. if(pbCL) strPassword+=randomCapitalLetter();
  61. break;
  62. case 2: //SL
  63. if(pbSL) strPassword+=randomSmallLetter();
  64. break;
  65. case 3: //Digits
  66. if(pbDigits) strPassword+=randomDigit();
  67. break;
  68. case 4: //ss
  69. String[] aSS = pSS.trim().split(" ");
  70. String singleSS =
  71. aSS[randomInt(0, aSS.length-1)];
  72. strPassword+=singleSS;
  73. break;
  74. }//switch
  75. }//while
  76. }//if bCautela
  77.  
  78. return strPassword;
  79. }//randomPassword
  80.  
  81. }
  82. ***********************************************************************
  83.  
  84. //PassGen.java
  85. package com.joythis.android.passwordsgenerator;
  86.  
  87. import androidx.annotation.NonNull;
  88. import androidx.appcompat.app.AppCompatActivity;
  89.  
  90. import android.app.Activity;
  91. import android.content.Context;
  92. import android.content.Intent;
  93. import android.content.SharedPreferences;
  94. import android.os.Bundle;
  95. import android.view.Menu;
  96. import android.view.MenuInflater;
  97. import android.view.MenuItem;
  98. import android.view.View;
  99. import android.widget.ArrayAdapter;
  100. import android.widget.Button;
  101. import android.widget.ListView;
  102. import android.widget.TextView;
  103. import android.widget.Toast;
  104.  
  105. import java.util.ArrayList;
  106. import java.util.HashSet;
  107. import java.util.Set;
  108.  
  109. public class PassGen extends AppCompatActivity {
  110.  
  111. public final static String SETTINGS_DB = "SETTINGS.DB";
  112. public final static String KEY_BCL = "KEY_BCL";
  113. public final static String KEY_BSL = "KEY_BSL";
  114. public final static String KEY_BDigits = "KEY_BD";
  115. public final static String KEY_SS = "KEY_SS";
  116. public final static String KEY_SIZE = "KEY_SIZE";
  117.  
  118. public final static int DEFAULT_SIZE = 16;
  119. public final static boolean DEFAULT_BCL = true;
  120. public final static boolean DEFAULT_BSL = true;
  121. public final static boolean DEFAULT_BDigits = true;
  122. //public final static String DEFAULT_SS = "???";
  123.  
  124. Context mContext;
  125. Activity mSelfActivity;
  126. SharedPreferences mSp;
  127.  
  128. TextView mTvCurrentSettings;
  129.  
  130. Button mBtnGenPass;
  131. ListView mLvPasswords; //visualização
  132. ArrayAdapter<String> mAd; //intermediação
  133. ArrayList<String> mPwds; //dados
  134.  
  135. View.OnClickListener mClickHandler =
  136. new View.OnClickListener() {
  137. @Override
  138. public void onClick(View v) {
  139. String p =
  140. AmRandomTools.randomPassword(
  141. miSize,
  142. mbCL,
  143. mbSL,
  144. mbDigits,
  145. mSpecialSymbols
  146. );
  147. if(p.length()>0) {
  148. mPwds.add(0, p);
  149. mAd.notifyDataSetChanged();
  150. }
  151. else{
  152. Toast t = Toast.makeText(
  153. mSelfActivity,
  154. "Must accept at least 1 type of symbols.",
  155. Toast.LENGTH_LONG
  156. );
  157. t.show();
  158. }
  159. }//onClick
  160. };//OnClickListener
  161.  
  162. @Override
  163. protected void onCreate(Bundle savedInstanceState) {
  164. super.onCreate(savedInstanceState);
  165. //setContentView(R.layout.activity_pass_gen);
  166. setContentView(R.layout.rl_pass_gen_v1);
  167.  
  168. init();
  169. }//onCreate
  170.  
  171. void init(){
  172. //1 - assocs
  173. mSelfActivity = this;
  174. mContext = this;
  175. mTvCurrentSettings = findViewById(R.id.idTvCurrentSettings);
  176.  
  177. mSp = this.getSharedPreferences(
  178. SETTINGS_DB,
  179. MODE_PRIVATE
  180. );
  181. mBtnGenPass = findViewById(
  182. R.id.idBtnGenPass
  183. );
  184. mLvPasswords = findViewById(
  185. R.id.idLvPasswords
  186. );
  187.  
  188. //2 behaviors
  189. if(mBtnGenPass!=null)
  190. mBtnGenPass.setOnClickListener
  191. (mClickHandler);
  192.  
  193. if(mLvPasswords!=null){
  194. mPwds = new ArrayList<String>();
  195. mAd = new ArrayAdapter<String>(
  196. mContext,
  197. android.R.layout.simple_list_item_1,
  198. mPwds
  199. );
  200. mLvPasswords.setAdapter(mAd);
  201. }
  202.  
  203. //3
  204. loadSettingsFromSP();
  205. }//init
  206.  
  207. int miSize;
  208. boolean mbCL, mbSL, mbDigits;
  209. String mSpecialSymbols;
  210. public void loadSettingsFromSP(){
  211. if (mSp!=null){
  212. // leitura
  213. miSize = mSp.getInt(KEY_SIZE, DEFAULT_SIZE);
  214. mbCL = mSp.getBoolean(KEY_BCL, DEFAULT_BCL);
  215. mbSL = mSp.getBoolean(KEY_BSL, DEFAULT_BSL);
  216. mbDigits = mSp.getBoolean(KEY_BDigits, DEFAULT_BDigits);
  217. mSpecialSymbols = mSp.getString(KEY_SS, getString(R.string.strSSDefault));
  218.  
  219. String strDashboard =
  220. String.format(
  221. "size:%d CL:%s SL:%s D:%s SS:%s",
  222. miSize,
  223. mbCL ? "YES" : "NO",
  224. mbSL ? "YES" : "NO",
  225. mbDigits ? "YES" : "NO",
  226. mSpecialSymbols
  227. );
  228. mTvCurrentSettings.setText(strDashboard);
  229. }
  230. }//loadSettingsFromSP
  231.  
  232. @Override
  233. public boolean onCreateOptionsMenu(Menu pMenu) {
  234. MenuInflater minf = this.getMenuInflater();
  235.  
  236. minf.inflate(
  237. R.menu.nav_menu,
  238. pMenu
  239. );
  240.  
  241. return super.onCreateOptionsMenu(pMenu);
  242. }//onCreateOptionsMenu
  243.  
  244. // menu items' behavior
  245. @Override
  246. public boolean onOptionsItemSelected(@NonNull MenuItem item) {
  247. switch(item.getItemId()){
  248. case R.id.idMenuItemGoSettings:
  249. actionGoSettings();
  250. break;
  251. case R.id.idMenuItemQuitApp:
  252. actionQuitApp();
  253. break;
  254. }//switch
  255.  
  256. return super.onOptionsItemSelected(item);
  257. }//onOptionsItemSelected
  258.  
  259. void actionGoSettings(){
  260. Intent goSettings = new Intent(
  261. PassGen.this,
  262. PassSettings.class
  263. );
  264. if(goSettings!=null){
  265. startActivity(goSettings);
  266. }//if
  267. }//actionGoSettings
  268.  
  269. void actionQuitApp(){
  270. Intent quit = new Intent(Intent.ACTION_MAIN);
  271. if (quit!=null){
  272. quit.addCategory(Intent.CATEGORY_HOME);
  273. quit.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  274. startActivity(quit);
  275. this.finish();
  276. }
  277. }//actionQuitApp
  278.  
  279. /*
  280. MANUTENÇÃO DE ESTADO
  281. */
  282.  
  283. /*
  284. O que não quisermos perder
  285. da visualização na interface
  286. deve ser preservado agora
  287. */
  288. public final static String KEY_PWDS = "KEY_PWDS";
  289. @Override
  290. protected void onSaveInstanceState(@NonNull Bundle outState) {
  291. // escrever na Bundle, em chave adequada
  292. // a lista das passwords
  293. if(outState!=null) {
  294. outState.putStringArrayList(
  295. KEY_PWDS,
  296. mPwds
  297. );
  298. }//if
  299. super.onSaveInstanceState(outState);
  300. }//onSaveInstanceState
  301.  
  302. SharedPreferences mSpPwds;
  303. //TODO: inicializar em init
  304. void gravarTodasAsPasswordsEmSP(){
  305. SharedPreferences.Editor ed = mSpPwds.edit();
  306. if (ed!=null){
  307. Set<String> stringSetPwds =
  308. new HashSet<>();
  309. stringSetPwds.addAll(mPwds);
  310. ed.putStringSet(
  311. KEY_PWDS,
  312. stringSetPwds
  313. );
  314. ed.commit();
  315. }
  316. }
  317.  
  318. void recuperarTodasAsPasswordsDeSP(){
  319. if(mSpPwds!=null){
  320. Set<String> stringSetPwds =
  321. mSpPwds.getStringSet(KEY_PWDS, null);
  322. mPwds.clear();
  323. mPwds.addAll(stringSetPwds);
  324. }
  325. }//recuperarTodasAsPasswordsDeSP
  326.  
  327. /*
  328. automaticamente chamado para recuperar
  329. dados preservados pelo sistema nalguma Bundle
  330. */
  331. @Override
  332. protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
  333. if(savedInstanceState!=null){
  334. boolean bKeyPwdsExists =
  335. savedInstanceState.containsKey(KEY_PWDS);
  336. if(bKeyPwdsExists){
  337. ArrayList<String> al =
  338. savedInstanceState.getStringArrayList(
  339. KEY_PWDS
  340. );
  341. //mPwds = al;
  342. if(al!=null && al.size()>0){
  343. mPwds.clear();
  344. mPwds.addAll(al);
  345. /*
  346. for(String p : al){
  347. mPwds.add(p);
  348. }
  349. */
  350. }
  351. mAd.notifyDataSetChanged();
  352. }//if
  353. }
  354. super.onRestoreInstanceState(savedInstanceState);
  355. }
  356. }//PassGen
  357.  
  358.  
  359. **********************************************
  360. //PassSettings.java
  361. package com.joythis.android.passwordsgenerator;
  362.  
  363. import androidx.appcompat.app.AppCompatActivity;
  364.  
  365. import android.app.Activity;
  366. import android.content.Context;
  367. import android.content.Intent;
  368. import android.content.SharedPreferences;
  369. import android.os.Build;
  370. import android.os.Bundle;
  371. import android.view.KeyEvent;
  372. import android.view.View;
  373. import android.widget.Button;
  374. import android.widget.CheckBox;
  375. import android.widget.EditText;
  376. import android.widget.SeekBar;
  377. import android.widget.TextView;
  378.  
  379. public class PassSettings extends AppCompatActivity {
  380. Activity mSelfActivity;
  381. Context mContext;
  382.  
  383. public final static int MIN_PWD_SIZE = 6;
  384.  
  385. TextView mTvDashboard; // feedback quando se utiliza a SeekBar
  386. SeekBar mSbSize; // controla o tamanho das passwords a produzir
  387. CheckBox mCbCapitalLetters, mCbSmallLetters, mCbDigits;
  388. EditText mEtSS; // onde se entram os símbolos "especiais"
  389. Button mBtnConfirmSettings; // quando clicked, fará a escrita das escolhas em SharedPreferences
  390.  
  391. SharedPreferences mSpSettings; // membro de dados para aceder às SP (nesta Activity, escrevê-las)
  392.  
  393. AmUtil mUtil;
  394.  
  395. SeekBar.OnSeekBarChangeListener
  396. mSbChangeHandler = new SeekBar.OnSeekBarChangeListener() {
  397. @Override
  398. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
  399. if(mTvDashboard!=null){
  400. String strMsg =
  401. "Request password size: "+
  402. String.valueOf(mSbSize.getProgress());
  403. mTvDashboard.setText(strMsg);
  404. }
  405. }//onProgressChanged
  406.  
  407. @Override
  408. public void onStartTrackingTouch(SeekBar seekBar) {
  409.  
  410. }
  411.  
  412. @Override
  413. public void onStopTrackingTouch(SeekBar seekBar) {
  414.  
  415. }
  416. }; //
  417.  
  418. View.OnClickListener mClickHandler = new View.OnClickListener() {
  419. @Override
  420. public void onClick(View v) {
  421. switch(v.getId()){
  422. case R.id.idBtnConfirmSettings:
  423. actionConfirmSettings();
  424. break;
  425. }//switch
  426. } // onClick
  427. }; // mClickHandler
  428.  
  429. /*
  430. gravar os settings
  431. *e*
  432. regressar à Activity principal
  433. */
  434. void actionConfirmSettings(){
  435. saveSettingsToSharedPreferences();
  436. //TODO
  437. Intent goPassGen = new Intent(
  438. PassSettings.this,
  439. PassGen.class
  440. );
  441. startActivity(goPassGen);
  442. }//actionConfirmSettings
  443.  
  444. /*
  445. observar as opções assumidas pela UI
  446. e gravá-las em SP
  447. */
  448. void saveSettingsToSharedPreferences(){
  449. int iPassSize = mSbSize.getProgress();
  450. boolean bCL = mCbCapitalLetters.isChecked();
  451. boolean bSL = mCbSmallLetters.isChecked();
  452. boolean bDigits = mCbDigits.isChecked();
  453. String ss = mEtSS.getText().toString().trim();
  454.  
  455. if (mSpSettings !=null){
  456. SharedPreferences.Editor ed =
  457. mSpSettings.edit();
  458. if (ed!=null){
  459. ed.putInt(PassGen.KEY_SIZE, iPassSize);
  460. ed.putBoolean(PassGen.KEY_BCL, bCL);
  461. ed.putBoolean(PassGen.KEY_BSL, bSL);
  462. ed.putBoolean(PassGen.KEY_BDigits, bDigits);
  463. ed.putString(PassGen.KEY_SS, ss);
  464. ed.commit(); // síncrono / bloqueante
  465. //ed.apply(); // assíncrono
  466. mUtil.feedback(
  467. this.getResources().getString(
  468. //"Info: settings written"
  469. R.string.strInfoUpdatedSettings
  470. )
  471. );
  472. }//if
  473.  
  474. }//if
  475. } // saveSettingsToSharedPreferences
  476.  
  477. @Override
  478. protected void onCreate(Bundle savedInstanceState) {
  479. super.onCreate(savedInstanceState);
  480. setContentView(R.layout.activity_pass_settings);
  481.  
  482. init();
  483. }//onCreate
  484.  
  485. void init(){
  486. //1 - assocs
  487. mContext = this;
  488. mSelfActivity = this;
  489.  
  490. mTvDashboard = findViewById(R.id.idTvDashboard);
  491. mSbSize = findViewById(R.id.idSbSize);
  492. if(mSbSize!=null){
  493. if (
  494. Build.VERSION.SDK_INT >=
  495. Build.VERSION_CODES.O)
  496. {
  497. mSbSize.setMin(MIN_PWD_SIZE);
  498. }
  499. }//mSbSize
  500.  
  501. mCbCapitalLetters = findViewById(R.id.idCbCapitalLetters);
  502. mCbSmallLetters = findViewById(R.id.idCbSmallLetters);
  503. mCbDigits = findViewById(R.id.idCbDigits);
  504. mEtSS = findViewById(R.id.idEtSS);
  505. mBtnConfirmSettings = findViewById(R.id.idBtnConfirmSettings);
  506.  
  507. mUtil = new AmUtil(this);
  508.  
  509. mSpSettings = this.getSharedPreferences(
  510. PassGen.SETTINGS_DB, // nome do ficheiro com a DB SP
  511. MODE_PRIVATE
  512. );
  513.  
  514. //2 - behaviors / comportamentos
  515. mBtnConfirmSettings.setOnClickListener(mClickHandler);
  516. mEtSS.setOnKeyListener(mKeyHandler);
  517. mSbSize.setOnSeekBarChangeListener(
  518. mSbChangeHandler
  519. );
  520.  
  521. //3 - recuperar os settings, conforme em SP
  522. loadAndReflectSettingsFromSP();
  523. }//init
  524.  
  525. void loadAndReflectSettingsFromSP(){
  526. /*
  527. 1)
  528. há que ler os valores para settings
  529. conforme escritos em SharedPreferences
  530. em certa base de dados estabelecida
  531. pela constante SETTINGS_DB (da Activity principal)
  532.  
  533. 2)
  534. temos que refletir os valores nos objetos de
  535. interface; isto é, a SeekBar se o tamanho
  536. está em x deve ficar com o progress a x;
  537. ...
  538. se está escolhido que não há deve letras
  539. pequenas, a CheckBox não deverá estar checked
  540. ...
  541. e assim sucessivamente para todos os objetos
  542. de interface
  543. */
  544. if(mSpSettings !=null){
  545. //leituras
  546. //1
  547. int iSize = mSpSettings.getInt(
  548. PassGen.KEY_SIZE,
  549. PassGen.DEFAULT_SIZE
  550. );
  551. mSbSize.setProgress(iSize);
  552.  
  553. //2
  554. boolean bCL = mSpSettings.getBoolean(
  555. PassGen.KEY_BCL,
  556. PassGen.DEFAULT_BCL
  557. );
  558. mCbCapitalLetters.setChecked(bCL);
  559.  
  560. //3
  561. boolean bSL = mSpSettings.getBoolean(
  562. PassGen.KEY_BSL,
  563. PassGen.DEFAULT_BSL
  564. );
  565. mCbSmallLetters.setChecked(bSL);
  566.  
  567. //4
  568. boolean bDigits = mSpSettings.getBoolean(
  569. PassGen.KEY_BDigits,
  570. PassGen.DEFAULT_BDigits
  571. );
  572. mCbDigits.setChecked(bDigits);
  573.  
  574. //5
  575. String strSSDefault =
  576. getString(R.string.strSSDefault);
  577.  
  578. String ss = mSpSettings.getString(
  579. PassGen.KEY_SS,
  580. strSSDefault
  581. );
  582. mEtSS.setText(ss);
  583. }//if
  584. }//loadSettingsFromSP
  585.  
  586. View.OnKeyListener mKeyHandler = new View.OnKeyListener() {
  587. @Override
  588. public boolean onKey(
  589. View v,
  590. int keyCode,
  591. KeyEvent event
  592. )
  593. {
  594. boolean bActionKeyDown =
  595. event.getAction()==KeyEvent.ACTION_DOWN;
  596.  
  597. if (bActionKeyDown){
  598. boolean bWasENTER =
  599. keyCode == KeyEvent.KEYCODE_ENTER;
  600.  
  601. if (bWasENTER){
  602. mUtil.hideSoftKeyboard();
  603. saveSettingsToSharedPreferences();
  604. return true; // evento completamente consumido
  605. }// if
  606. }//if
  607. return false;
  608. } // onKey
  609. }; // mKeyHandler
  610. }
Advertisement
Add Comment
Please, Sign In to add comment