2

So I'm building an app that generates a strong password per the specifications of the user. The spec part of the UI looks like this.

enter image description here

The following is the onCreate from the MainActivity.java class. I tried creating some of the logic, such as if statements when a certain radio button is checked and adding allowed characters to the String variable whenever a checkbox is checked. The View objects are all global btw but I couldn't figure out how to create a random String using at least one of each allowed character, within the character limit set by the user.

Here is the code:

private static int MAX_LENGTH;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        capitalLetter = (CheckBox) findViewById(R.id.capital_letter);
        lowercaseLetter = (CheckBox) findViewById(R.id.lowercase_letter);
        numbers = (CheckBox) findViewById(R.id.numbers);
        symbols = (CheckBox) findViewById(R.id.symbols);

        passGroup = (RadioGroup) findViewById(R.id.passRadioGroup);

        sizeFour = (RadioButton) findViewById(R.id.size_four);
        sizeEight = (RadioButton) findViewById(R.id.size_eight);
        sizeTwelve = (RadioButton) findViewById(R.id.size_twelve);
        sizeSixteen = (RadioButton) findViewById(R.id.size_sixteen);

        passHint = (EditText) findViewById(R.id.passwordHint);

        passShow = (TextView) findViewById(R.id.passwordDisplay);

        passGenerate = (Button) findViewById(R.id.passwordGenerate);
        passClear = (Button) findViewById(R.id.passwordClear);

        String allowedCharacters = "";

        // Determines the types of characters permitted when a check box is checked.
        if (capitalLetter.isChecked()) {allowedCharacters += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";}
        if (lowercaseLetter.isChecked()) {allowedCharacters += "abcdefghijklmnopqrstuvwxyz";}
        if (numbers.isChecked()) {allowedCharacters += "0123456789";}
        if (symbols.isChecked()) {allowedCharacters += "!@#$%^&*()_-+=<>?/{}~|";}

        //Determines the length of the string based on which radio button the user has selected.
        int checkedRadioButtonId = passGroup.getCheckedRadioButtonId();

        if (checkedRadioButtonId == 1) {MAX_LENGTH = 4;}
        if (checkedRadioButtonId == 2) {MAX_LENGTH = 8;}
        if (checkedRadioButtonId == 3) {MAX_LENGTH = 12;}
        if (checkedRadioButtonId == 4) {MAX_LENGTH = 16;}
    }
Rjz Satvara
  • 3,453
  • 2
  • 24
  • 47
Onur Ozbek
  • 21
  • 1
  • 3

3 Answers3

4

Basic Idea about generate random String:

private static final String ALLOWED_CHARACTERS ="0123456789qwertyuiopasdfghjklzxcvbnm";

private static String getRandomString(final int sizeOfPasswordString){
  final Random random=new Random();
  final StringBuilder sb=new StringBuilder(sizeOfPasswordString);
  
  for(int i=0;i<sizeOfRandomString;++i){
      sb.append(ALLOWED_CHARACTERS.charAt(random.nextInt(ALLOWED_CHARACTERS.length())));
    
  }
  return sb.toString();
}
MilapTank
  • 9,782
  • 7
  • 37
  • 53
  • i remember this from another post. The code is not parallel to mine. How would I implement the same logic to what I have? – Onur Ozbek Jan 26 '17 at 06:45
  • Are you looking for some one on SO cook code for you ;) BTW its a logic to generate random string you can cook at own test best of luck :) – MilapTank Jan 26 '17 at 06:51
  • I'm obviously not looking for a chef :) but are you suggesting that I move my code outside the onCreate and create a method? – Onur Ozbek Jan 26 '17 at 06:53
  • yes you can do moduler way so you can use that more efficient and as common util – MilapTank Jan 26 '17 at 06:57
  • That's funny. I like this code and it's extremely easy put into any code pie. As a matter of fact, it almost looks like all other answers here are cooked from it's basic principle. ;) – DevilsHnd Jan 26 '17 at 07:45
  • make return line outside for loop to work proper – Mohammed Ashraf Oct 14 '21 at 11:05
3

Here is what you are looking for. First you have to add required characters according to the checkboxes checked and then you have to fill the lefover length with random characters from the whole string of allowed characters.

private static String generateRandomPassword(int max_length, boolean upperCase, boolean lowerCase, boolean numbers, boolean specialCharacters)
{
    String upperCaseChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String lowerCaseChars = "abcdefghijklmnopqrstuvwxyz";
    String numberChars = "0123456789";
    String specialChars = "!@#$%^&*()_-+=<>?/{}~|";
    String allowedChars = "";

    Random rn = new Random();
    StringBuilder sb = new StringBuilder(max_length);

    //this will fulfill the requirements of atleast one character of a type.
    if(upperCase) {
        allowedChars += upperCaseChars;
        sb.append(upperCaseChars.charAt(rn.nextInt(upperCaseChars.length()-1)));
    }

    if(lowerCase) {
        allowedChars += lowerCaseChars;
        sb.append(lowerCaseChars.charAt(rn.nextInt(lowerCaseChars.length()-1)));
    }

    if(numbers) {
        allowedChars += numberChars;
        sb.append(numberChars.charAt(rn.nextInt(numberChars.length()-1)));
    }

    if(specialCharacters) {
        allowedChars += specialChars;
        sb.append(specialChars.charAt(rn.nextInt(specialChars.length()-1)));
    }


    //fill the allowed length from different chars now.
    for(int i=sb.length();i < max_length;++i){
        sb.append(allowedChars.charAt(rn.nextInt(allowedChars.length())));
    }

    return  sb.toString();
}

Usage : In the implementation of onclick of button for which you are generating password add the following:

String pass = generateRandomPassword(MAX_LENGTH, capitalLetter.isChecked(), lowercaseLetter.isChecked(), numbers.isChecked(),symbols.isChecked());
  • `String pass = generateRandomPassword(MAX_LENGTH, capitalLetter.isChecked(), lowercaseLetter.isChecked(), numbers.isChecked(),symbols.isChecked());` But why does the password get generated when all of them are checked? The password is to be generated based on the requirements by the user. – Onur Ozbek Jan 26 '17 at 10:55
  • capitalLetter.isChecked() returns a boolean (true or false). right? This boolean value is set in the upperCase boolean variable. This variable is checked, if we want to allow uppercase characters or not. Same explanation is for other checkboxes. –  Jan 26 '17 at 12:10
1

Check this answer :

private static final String NUMBERS = "0123456789";
private static final String UPPER_ALPHABETS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String LOWER_ALPHABETS = "abcdefghijklmnopqrstuvwxyz";
private static final String SPECIALCHARACTERS = "@#$%&*";
CheckBox chkCapital, chkSmall, chkNumber, chkSpec;
Button btnSUbmit;
int MAX_CHAR = 0;
private RadioGroup radioGroup;
private RadioButton radiobtnm;

private static String getRandomPasswordCharacters(int pos) {
    Random randomNum = new Random();
    StringBuilder randomChar = new StringBuilder();
    switch (pos) {
        case 0:
            randomChar.append(NUMBERS.charAt(randomNum.nextInt(NUMBERS.length() - 1)));
            break;
        case 1:
            randomChar.append(UPPER_ALPHABETS.charAt(randomNum.nextInt(UPPER_ALPHABETS.length() - 1)));
            break;
        case 2:
            randomChar.append(SPECIALCHARACTERS.charAt(randomNum.nextInt(SPECIALCHARACTERS.length() - 1)));
            break;
        case 3:
            randomChar.append(LOWER_ALPHABETS.charAt(randomNum.nextInt(LOWER_ALPHABETS.length() - 1)));
            break;
    }
    return randomChar.toString();

}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    chkCapital = (CheckBox) findViewById(R.id.checkBox1);
    chkSmall = (CheckBox) findViewById(R.id.checkBox2);
    chkNumber = (CheckBox) findViewById(R.id.checkBox3);
    chkSpec = (CheckBox) findViewById(R.id.checkBox4);


    radioGroup = (RadioGroup) findViewById(R.id.radioGroup);
    btnSUbmit = (Button) findViewById(R.id.btnSUbmit);

    btnSUbmit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            StringBuilder password = new StringBuilder();
            ArrayList<Integer> passSel = new ArrayList<Integer>();
            int selectedId = radioGroup.getCheckedRadioButtonId();

            radiobtnm = (RadioButton) findViewById(selectedId);

            MAX_CHAR = Integer.parseInt(radiobtnm.getText().toString());

            // when  UPPER CASE selected
            if (chkCapital.isChecked())
                passSel.add(1);

            // when  LOWER CASE selected
            if (chkSmall.isChecked())
                passSel.add(3);

            // when  Number  selected
            if (chkNumber.isChecked())
                passSel.add(0);

            // when  Special selected
            if (chkSpec.isChecked())
                passSel.add(2);

            for (int i = 1; i <= MAX_CHAR; ) {

                if (passSel.contains(0) && i <= MAX_CHAR) {
                    password.append(getRandomPasswordCharacters(0));
                    i++;
                }
                if (passSel.contains(1) && i <= MAX_CHAR) {
                    password.append(getRandomPasswordCharacters(1));
                    i++;
                }
                if (passSel.contains(2) && i <= MAX_CHAR) {
                    password.append(getRandomPasswordCharacters(2));
                    i++;
                }
                if (passSel.contains(3) && i <= MAX_CHAR) {
                    password.append(getRandomPasswordCharacters(3));
                    i++;
                }
            }
            Log.e("!_@@:your password is :>--> ", password + "");
        }
    });
}
Rjz Satvara
  • 3,453
  • 2
  • 24
  • 47