From 4b78cb5f3795e643d3e1734c10298f307bd516d4 Mon Sep 17 00:00:00 2001 From: r0r-5chach Date: Sat, 18 Mar 2023 17:16:41 +0000 Subject: [PATCH] Initial commit --- .gitignore | 15 ++ .idea/.gitignore | 3 + .idea/compiler.xml | 6 + .idea/deploymentTargetDropDown.xml | 17 ++ .idea/gradle.xml | 19 ++ .idea/misc.xml | 17 ++ app/.gitignore | 1 + app/build.gradle | 39 ++++ app/proguard-rules.pro | 21 ++ .../cpsAssist/ExampleInstrumentedTest.java | 26 +++ app/src/main/AndroidManifest.xml | 25 +++ .../xyz/r0r5chach/cpsAssist/ArrayTools.java | 30 +++ .../cpsAssist/home/HomeActivity.java | 4 + .../cpsAssist/login/LoginActivity.java | 19 ++ .../cpsAssist/login/OnClickListener.java | 145 ++++++++++++++ .../drawable-v24/ic_launcher_foreground.xml | 30 +++ .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++++++ app/src/main/res/layout/activity_login.xml | 39 ++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../res/mipmap-anydpi-v33/ic_launcher.xml | 6 + app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes app/src/main/res/values-night/themes.xml | 16 ++ app/src/main/res/values/colors.xml | 10 + app/src/main/res/values/properties_login.xml | 5 + app/src/main/res/values/strings.xml | 6 + app/src/main/res/values/themes.xml | 16 ++ app/src/main/res/xml/backup_rules.xml | 13 ++ .../main/res/xml/data_extraction_rules.xml | 19 ++ .../r0r5chach/cpsAssist/ExampleUnitTest.java | 17 ++ build.gradle | 5 + gradle.properties | 21 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++++++++++++++++++ gradlew.bat | 89 +++++++++ settings.gradle | 16 ++ 46 files changed, 1066 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/deploymentTargetDropDown.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/xyz/r0r5chach/cpsAssist/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/xyz/r0r5chach/cpsAssist/ArrayTools.java create mode 100644 app/src/main/java/xyz/r0r5chach/cpsAssist/home/HomeActivity.java create mode 100644 app/src/main/java/xyz/r0r5chach/cpsAssist/login/LoginActivity.java create mode 100644 app/src/main/java/xyz/r0r5chach/cpsAssist/login/OnClickListener.java create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-anydpi-v33/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/properties_login.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/test/java/xyz/r0r5chach/cpsAssist/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..e0a0db2 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..7394c74 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..1d225cc --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..fd0f767 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,39 @@ +plugins { + id 'com.android.application' +} + +android { + namespace 'xyz.r0r5chach.cpsAssist' + compileSdk 33 + + defaultConfig { + applicationId "xyz.r0r5chach.cpsAssist" + minSdk 24 + targetSdk 33 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.8.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/xyz/r0r5chach/cpsAssist/ExampleInstrumentedTest.java b/app/src/androidTest/java/xyz/r0r5chach/cpsAssist/ExampleInstrumentedTest.java new file mode 100644 index 0000000..9f6d9b6 --- /dev/null +++ b/app/src/androidTest/java/xyz/r0r5chach/cpsAssist/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package xyz.r0r5chach.cpsAssist; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("xyz.r0r5chach.cpsAssist", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..338e00b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/xyz/r0r5chach/cpsAssist/ArrayTools.java b/app/src/main/java/xyz/r0r5chach/cpsAssist/ArrayTools.java new file mode 100644 index 0000000..03e87aa --- /dev/null +++ b/app/src/main/java/xyz/r0r5chach/cpsAssist/ArrayTools.java @@ -0,0 +1,30 @@ +package xyz.r0r5chach.cpsAssist; + +public class ArrayTools { + /** + * This method checks if any of the Strings stored in an array are empty + * @param details The array to be checker + * @return true if containing an empty String; false otherwise + */ + public static boolean isEmpty(String[] details) { + for (String detail: details) { + if (detail.isEmpty()) { + return true; + } + } + return false; + } + /** + * This method checks the Strings stored in an array to see if any of them contain the characters # or % + * @param details The array to be checked + * @return true if any String contains # or %; false otherwise + */ + public static boolean hasInvalidChars(String[] details) { + for (String detail: details) { + if (detail.contains("#") || detail.contains("%")) { + return true; + } + } + return false; + } +} diff --git a/app/src/main/java/xyz/r0r5chach/cpsAssist/home/HomeActivity.java b/app/src/main/java/xyz/r0r5chach/cpsAssist/home/HomeActivity.java new file mode 100644 index 0000000..ead86fb --- /dev/null +++ b/app/src/main/java/xyz/r0r5chach/cpsAssist/home/HomeActivity.java @@ -0,0 +1,4 @@ +package xyz.r0r5chach.cpsAssist.home; + +public class HomeActivity { +} diff --git a/app/src/main/java/xyz/r0r5chach/cpsAssist/login/LoginActivity.java b/app/src/main/java/xyz/r0r5chach/cpsAssist/login/LoginActivity.java new file mode 100644 index 0000000..85dbafa --- /dev/null +++ b/app/src/main/java/xyz/r0r5chach/cpsAssist/login/LoginActivity.java @@ -0,0 +1,19 @@ +package xyz.r0r5chach.cpsAssist.login; + +import androidx.appcompat.app.AppCompatActivity; + +import android.os.Bundle; +import android.widget.Button; +import android.widget.EditText; + +import xyz.r0r5chach.cpsAssist.R; + +public class LoginActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login); + findViewById(R.id.loginButton).setOnClickListener(new OnClickListener(findViewById(R.id.userNameField), findViewById(R.id.passwordField))); + } +} \ No newline at end of file diff --git a/app/src/main/java/xyz/r0r5chach/cpsAssist/login/OnClickListener.java b/app/src/main/java/xyz/r0r5chach/cpsAssist/login/OnClickListener.java new file mode 100644 index 0000000..229ea68 --- /dev/null +++ b/app/src/main/java/xyz/r0r5chach/cpsAssist/login/OnClickListener.java @@ -0,0 +1,145 @@ +package xyz.r0r5chach.cpsAssist.login; + +import android.app.Activity; +import android.content.Intent; +import android.os.Build; +import android.view.View; +import android.widget.EditText; +import android.widget.Toast; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Objects; +import java.util.Properties; + +import xyz.r0r5chach.cpsAssist.ArrayTools; +import xyz.r0r5chach.cpsAssist.home.HomeActivity; +/** + * This Class defines the definition of the OnCLickListener for the LoginActivity + * @author r0r5chach + */ +public class OnClickListener implements View.OnClickListener{ + /** + * This attribute stores the amount of attempts the user has currently taken + */ + private int currentAttempts; + /** + * This attribute stores the View for the username field of the UI + */ + private final EditText usernameField; + /** + * This attribute stores the View for the password field of the UI + */ + private final EditText passwordField; + /** + * This attribute stores the properties for the activity + */ + private Properties props; + /** + * This attribute stores a list of users' usernames and password + */ + private String[][] users; + /** + * This Constructor initialises the attributes for the Listener + * @param usernameField the View for the username field of the UI + * @param passwordField the View for the password field of the UI + */ + public OnClickListener(EditText usernameField, EditText passwordField) { + loadProperties(); + initUsers(); + this.currentAttempts = 0; + this.usernameField = usernameField; + this.passwordField = passwordField; + } + /** + * This method defines what happens when Object this Listener is assigned to is clicked + * @param view The Activity the Object is from + */ + @Override + public void onClick(View view) { + String[] inputs = new String[]{usernameField.getText().toString(), passwordField.getText().toString()}; + String valid = isValid(inputs); + if (!valid.equals("true")) { + Toast.makeText(view.getContext(), valid, Toast.LENGTH_LONG).show(); + } + + if (isUser(inputs)) { + Intent home = new Intent(view.getContext(), HomeActivity.class); + home.putExtra("username", inputs[0]); + view.getContext().startActivity(home); + ((Activity)view.getContext()).finish(); + } + else { + currentAttempts += 1; + Toast.makeText(view.getContext(), "Incorrect Username/Password!", Toast.LENGTH_LONG).show(); + } + } + /** + * This method loads the properties for the activity from resources + */ + private void loadProperties() { + props = new Properties(); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + props.loadFromXML(Files.newInputStream(Paths.get(Objects.requireNonNull(LoginActivity.class.getResource("values/properties_login.xml")).getPath()))); + } + } + catch (IOException e) { + e.printStackTrace(); + } + } + /** + * This method initializes the users array from the activity properties + */ + private void initUsers() { + String[] users = props.getProperty("users").split("%"); + this.users = new String[users.length][2]; + for (int i = 0; i < users.length; i++) { + String[] details = users[i].split("#"); + this.users[i][0] = details[0]; + this.users[i][1] = details[1]; + } + } + /** + * This method checks to see if the user has no attempts left + * @param attempts the current attempts the user has had + * @return true if the attempts is less than MAX_ATTEMPTS; false otherwise + */ + private boolean hasNoAttempts(int attempts) { + int MAX_ATTEMPTS = 3; + return attempts >= MAX_ATTEMPTS; + } + + /** + * This method checks to see if the details the user has inputted are valid + * @param inputs The details to be checked + * @return "true" if the details are valid; A String containing the error message otherwise + */ + private String isValid(String[] inputs) { + String errorMsg = "Username and/or Password Fields "; + if (ArrayTools.isEmpty(inputs)) { + return errorMsg + "are empty!"; + } + else if (ArrayTools.hasInvalidChars(inputs)) { + return errorMsg + "have invalid characters!"; + } + else if (hasNoAttempts(currentAttempts)) { + return "No more Login Attempts!"; + } + return "true"; + } + /** + * This method checks to see if the details the user has inputted match with any existing user + * @param inputs The details to be checked + * @return true if the user exists; false otherwise + */ + private boolean isUser(String[] inputs) { + for (String[] user: users) { + if (inputs[0].equals(user[0]) || inputs[1].equals(user[1])) { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..d746ecb --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,39 @@ + + + + + + + +