Create a simple Android interface that takes a password and provides feedback as
ID: 3844430 • Letter: C
Question
Create a simple Android interface that takes a password and provides feedback as to its strength (using the provided Classes + Tests ). Your interface needs an input text field, button, and output text and it required to indicate on the form whether the password is strong enough.
Your output should be something like this:
Classes + Tests:
PasswordValidator.java:
import java.util.regex.Pattern;
public class PasswordValidator {
public static int validatePasswordStage1(String password) {
if (password == null || password.isEmpty()) {
return 0;
}
int countMatchingRules = 0;
// check if string is not password
if (!password.equalsIgnoreCase("PASSWORD")) {
countMatchingRules++;
}
// Check if string is at-least 8 character long
if (password.length() >= 8) {
countMatchingRules++;
}
return countMatchingRules;
}
public static int validatePasswordStage2(String password) {
int countMatchingRules = 0;
// Using the first stage to get first 2 matching rules
countMatchingRules += validatePasswordStage1(password);
// check if string contains at-least one special character from !, @, #,
// $, &, *
if (password.indexOf('!') != -1 || password.indexOf('@') != -1
|| password.indexOf('#') != -1 || password.indexOf('&') != -1
|| password.indexOf('*') != -1) {
countMatchingRules++;
}
// Check if string is at-least one digit
if (Pattern.compile("[0-9]").matcher(password).find()) {
System.out.println("Digit for " + password);
countMatchingRules++;
}
// Check if string has both upper and lower case characters
if (Pattern.compile("[a-z]").matcher(password).find() && Pattern.compile("[A-Z]").matcher(password).find() ) {
System.out.println("Upper lower for " + password);
countMatchingRules++;
}
return countMatchingRules;
}
}
PasswordValidatorTest.java:
import static org.junit.Assert.*;
import org.junit.Test;
public class PasswordValidatorTest {
@Test
public void testValidatePasswordStage1() {
// Rules:
// - it is not “password” (case insensitive)
// - it is at least 8 characters long
assertEquals(PasswordValidator.validatePasswordStage1("PASSWOrD"), 1);
assertEquals(PasswordValidator.validatePasswordStage1("ABCD"), 1);
assertEquals(PasswordValidator.validatePasswordStage1("ABCDEFGH"), 2);
assertEquals(PasswordValidator.validatePasswordStage1("ABCDEFGHIJ"), 2);
}
@Test
public void testValidatePasswordStage2() {
// Rules:
// 1 - it is not “password” (case insensitive)
// 2 - it is at least 8 characters long
// 3 - atleast one special character out of !, @, #, $, &, *
// 4 - atleast one digit
// 5 - atleast one upper and lower case character
// rule 1, 5 matching
assertEquals(PasswordValidator.validatePasswordStage2("Abcd"), 2);
// rule 1, 5, 4 matching
assertEquals(PasswordValidator.validatePasswordStage2("Abcd34"), 3);
// rule 1, 5, 4, 2 matching
assertEquals(PasswordValidator.validatePasswordStage2("Abcd34er"), 4);
// rule 1, 4, 2 matching
assertEquals(PasswordValidator.validatePasswordStage2("abcd34er"), 3);
// rule 1, 5, 4, 2 matching
assertEquals(PasswordValidator.validatePasswordStage2("abcd@34er"), 4);
// rule 1, 2, 3, 4, 5 matching
assertEquals(PasswordValidator.validatePasswordStage2("Abcd@34er"), 5);
}
}
Please explin by steps how to connect the button with text field to view the stngrth of the password in Android Studio
password Not thangExplanation / Answer
Ans.
// Material Design view
//Create a layout resource called /res/layout/password.xml.
//Content is below
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fitsSystemWindows="true">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="56dp"
android:paddingLeft="24dp"
android:paddingRight="24dp">
</android.support.design.widget.TextInputLayout>
<!-- Password Label -->
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp">
<EditText android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:hint="Password"/>
</android.support.design.widget.TextInputLayout>
<android.support.v7.widget.AppCompatButton
android:id="@+id/btn_password"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:layout_marginBottom="24dp"
android:padding="12dp"
android:text="Login"/>
</LinearLayout>
</ScrollView>
//EditText input type attribute called textPassword, which masks the password as it is typed into the control
2.)
package com.sourcey.materiallogindemo;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.content.Intent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import butterknife.ButterKnife;
import butterknife.InjectView;
public class PasswordValidator extends AppCompatActivity {
private static final String TAG = "PasswordValidator";
private static final int REQUEST_SIGNUP = 0;
@InjectView(R.id.password) EditText password;
@InjectView(R.id.btn_password) Button _passwordCheckButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ButterKnife.inject(this);
_passwordCheckButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
login();
}
});
_signupLink.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Start the Signup activity
Intent intent = new Intent(getApplicationContext(), SignupActivity.class);
startActivityForResult(intent, REQUEST_SIGNUP);
}
});
}
public void login() {
Log.d(TAG, "Login");
String password = password.getText().toString();
if (!validatePasswordStage1(password)&&!validatePasswordStage2(password)) {
onPasswordMatchFailed();
return;
}
_passwordCheckButton.setEnabled(false);
final ProgressDialog progressDialog = new ProgressDialog(LoginActivity.this,
R.style.AppTheme_Dark_Dialog);
progressDialog.setIndeterminate(true);
progressDialog.setMessage("Authenticating...");
progressDialog.show();
new android.os.Handler().postDelayed(
new Runnable() {
public void run() {
onPasswordSuccess();
// onPasswordMatchFailed();
progressDialog.dismiss();
}
}, 3000);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_SIGNUP) {
if (resultCode == RESULT_OK) {
this.finish();
}
}
}
@Override
public void onBackPressed() {
// disable going back to the MainActivity
moveTaskToBack(true);
}
public void onPasswordSuccess() {
_passwordCheckButton.setEnabled(true);
finish();
}
public void onPasswordMatchFailed() {
Toast.makeText(getBaseContext(), "Not Strong", Toast.LENGTH_LONG).show();
_passwordCheckButton.setEnabled(true);
}
public static int validatePasswordStage1(String password) {
if (password == null || password.isEmpty()) {
return 0;
}
int countMatchingRules = 0;
// check if string is not password
if (!password.equalsIgnoreCase("PASSWORD")) {
countMatchingRules++;
}
// Check if string is at-least 8 character long
if (password.length() >= 8) {
countMatchingRules++;
}
return countMatchingRules;
}
public static int validatePasswordStage2(String password) {
int countMatchingRules = 0;
// Using the first stage to get first 2 matching rules
countMatchingRules += validatePasswordStage1(password);
// check if string contains at-least one special character from !, @, #,
// $, &, *
if (password.indexOf('!') != -1 || password.indexOf('@') != -1
|| password.indexOf('#') != -1 || password.indexOf('&') != -1
|| password.indexOf('*') != -1) {
countMatchingRules++;
}
// Check if string is at-least one digit
if (Pattern.compile("[0-9]").matcher(password).find()) {
System.out.println("Digit for " + password);
countMatchingRules++;
}
// Check if string has both upper and lower case characters
if (Pattern.compile("[a-z]").matcher(password).find() && Pattern.compile("[A-Z]").matcher(password).find() ) {
System.out.println("Upper lower for " + password);
countMatchingRules++;
}
return countMatchingRules;
}
}
3.) Junit Test Case
PasswordValidatorTest.java:
import static org.junit.Assert.*;
import org.junit.Test;
public class PasswordValidatorTest {
@Test
public void testValidatePasswordStage1() {
// Rules:
// - it is not “password” (case insensitive)
// - it is at least 8 characters long
assertEquals(PasswordValidator.validatePasswordStage1("PASSWOrD"), 1);
assertEquals(PasswordValidator.validatePasswordStage1("ABCD"), 1);
assertEquals(PasswordValidator.validatePasswordStage1("ABCDEFGH"), 2);
assertEquals(PasswordValidator.validatePasswordStage1("ABCDEFGHIJ"), 2);
}
@Test
public void testValidatePasswordStage2() {
// Rules:
// 1 - it is not “password” (case insensitive)
// 2 - it is at least 8 characters long
// 3 - atleast one special character out of !, @, #, $, &, *
// 4 - atleast one digit
// 5 - atleast one upper and lower case character
// rule 1, 5 matching
assertEquals(PasswordValidator.validatePasswordStage2("Abcd"), 2);
// rule 1, 5, 4 matching
assertEquals(PasswordValidator.validatePasswordStage2("Abcd34"), 3);
// rule 1, 5, 4, 2 matching
assertEquals(PasswordValidator.validatePasswordStage2("Abcd34er"), 4);
// rule 1, 4, 2 matching
assertEquals(PasswordValidator.validatePasswordStage2("abcd34er"), 3);
// rule 1, 5, 4, 2 matching
assertEquals(PasswordValidator.validatePasswordStage2("abcd@34er"), 4);
// rule 1, 2, 3, 4, 5 matching
assertEquals(PasswordValidator.validatePasswordStage2("Abcd@34er"), 5);
}
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.