diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..7dabbd5 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +MyLoginApp \ No newline at end of file diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..6433066 --- /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 index 5cd135a..4934e1f 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -4,16 +4,16 @@ diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 797acea..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index f3ce9dc..7b26c62 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,2 @@ -# MyLoginApp +pop -Simple Login Design for android app - -Full Video Tutorial is available in Youtube Link : https://youtu.be/sOJRJtM_iu0 - -![LOGIN](https://user-images.githubusercontent.com/68380115/126171145-4212b2e5-db0a-41b3-b18a-5697222f2596.PNG) diff --git a/app/build.gradle b/app/build.gradle index 32bed95..607071f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,6 +26,7 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + namespace 'com.example.metaMergeTasker' } dependencies { diff --git a/app/src/androidTest/java/com/example/myloginapp/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/metaMergeTasker/ExampleInstrumentedTest.java similarity index 95% rename from app/src/androidTest/java/com/example/myloginapp/ExampleInstrumentedTest.java rename to app/src/androidTest/java/com/example/metaMergeTasker/ExampleInstrumentedTest.java index d85622b..4e10fef 100644 --- a/app/src/androidTest/java/com/example/myloginapp/ExampleInstrumentedTest.java +++ b/app/src/androidTest/java/com/example/metaMergeTasker/ExampleInstrumentedTest.java @@ -1,4 +1,4 @@ -package com.example.myloginapp; +package com.example.metaMergeTasker; import android.content.Context; diff --git a/app/src/debug/ic_launcher-playstore.png b/app/src/debug/ic_launcher-playstore.png new file mode 100644 index 0000000..ee5eb5d Binary files /dev/null and b/app/src/debug/ic_launcher-playstore.png differ diff --git a/app/src/debug/res/drawable/ic_launcher_background.xml b/app/src/debug/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..ca3826a --- /dev/null +++ b/app/src/debug/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..c4a603d --- /dev/null +++ b/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..c4a603d --- /dev/null +++ b/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/debug/res/mipmap-hdpi/ic_launcher.png b/app/src/debug/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..9fefa8a Binary files /dev/null and b/app/src/debug/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..6b65db3 Binary files /dev/null and b/app/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/debug/res/mipmap-hdpi/ic_launcher_round.png b/app/src/debug/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..3f2a576 Binary files /dev/null and b/app/src/debug/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/debug/res/mipmap-mdpi/ic_launcher.png b/app/src/debug/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..cdd2ac2 Binary files /dev/null and b/app/src/debug/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..5d1d5b1 Binary files /dev/null and b/app/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/debug/res/mipmap-mdpi/ic_launcher_round.png b/app/src/debug/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..0c9e311 Binary files /dev/null and b/app/src/debug/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/debug/res/mipmap-xhdpi/ic_launcher.png b/app/src/debug/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..f609d38 Binary files /dev/null and b/app/src/debug/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..2334551 Binary files /dev/null and b/app/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/debug/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/debug/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..46fa1ce Binary files /dev/null and b/app/src/debug/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png b/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..433abeb Binary files /dev/null and b/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..2637f15 Binary files /dev/null and b/app/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..5e36489 Binary files /dev/null and b/app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..882d22c Binary files /dev/null and b/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..b1a2c61 Binary files /dev/null and b/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..baccce2 Binary files /dev/null and b/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 48d7ee9..92957ca 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + - + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/metaMergeTasker/expenseEdit.java b/app/src/main/java/com/example/metaMergeTasker/expenseEdit.java new file mode 100644 index 0000000..6a5d3c3 --- /dev/null +++ b/app/src/main/java/com/example/metaMergeTasker/expenseEdit.java @@ -0,0 +1,15 @@ +package com.example.metaMergeTasker; + +import androidx.appcompat.app.AppCompatActivity; + +import android.os.Bundle; + +// Adam: Expense Manager New/Edit Expense Interface +public class expenseEdit extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_expense_edit); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/metaMergeTasker/expenseMain.java b/app/src/main/java/com/example/metaMergeTasker/expenseMain.java new file mode 100644 index 0000000..88f8284 --- /dev/null +++ b/app/src/main/java/com/example/metaMergeTasker/expenseMain.java @@ -0,0 +1,45 @@ +package com.example.metaMergeTasker; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.view.View; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +// Adam: Expense Manager Main Interface +public class expenseMain extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_expense_main); + + TextView expenseTitle = (TextView)findViewById(R.id.expenseTitle); + + // ADAM: Set textview title here in case we want other UI languages in the future + expenseTitle.setText("Expense"); + + SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("com.example.metaMergeTasker", Context.MODE_PRIVATE); + + //ADAM: ArrayList of Sets for storage of our expenses + List> expenses = new ArrayList>(); + /*ADAM: example to add to the set + * ITEMS will need to be added and removed to ensure the correct order.... + * + * expenses.add(new HashSet()); + * expenses.get(X).add("Some Object/String/Int"); // Each run will add an entry to row X + * expenses.get(X).remove("Some Object/String/Int"); // Will delete matching entry + * + */ + + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/metaMergeTasker/expenseManager.java b/app/src/main/java/com/example/metaMergeTasker/expenseManager.java new file mode 100644 index 0000000..ce939ca --- /dev/null +++ b/app/src/main/java/com/example/metaMergeTasker/expenseManager.java @@ -0,0 +1,147 @@ +/* + * ADAM: WE ARE NOT USING THIS FILE + */ + + +package com.example.metaMergeTasker; + +import androidx.appcompat.app.AppCompatActivity; +import android.os.Bundle; +import java.util.Scanner; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class expenseManager extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_expense_manager_screen); + } + + // Adam - Relocated this to top of file.... needs to be declaired before we extended it... + public class expense { + //instance variables + private String expenseName; + private int weeklyCostOfExpense; + private double monthlyCostOfExpense, totalCostOfAllExpenses; + + //constructor + public expense(String expenseName, int weeklyCostOfExpense, double monthlyCostOfExpense, double totalCostOfAllExpenses) { + this.expenseName = expenseName; + this.weeklyCostOfExpense = weeklyCostOfExpense; + this.monthlyCostOfExpense = monthlyCostOfExpense; + this.totalCostOfAllExpenses = totalCostOfAllExpenses; + } + + //accessors + public String getExpenseName() + { + return expenseName; + } + + public int getWeeklyCostOfExpense() + { + return weeklyCostOfExpense; + } + + public double getMonthlyCostOfExpense() + { + return monthlyCostOfExpense; + } + + public double getTotalCostOfAllExpenses() + { + return totalCostOfAllExpenses; + } + + public void printExpenseDetails() { + System.out.printf("\n%-10s%s\n", "Expense Name:", expenseName); + System.out.printf("\n%-10s%s\n", "Weekly Cost of Expense: $", weeklyCostOfExpense); + System.out.printf("\n%-10s%s\n", "Monthly Cost of Expense: $", monthlyCostOfExpense); + } + } + + public class expensemanager extends expense { + + public expense[] personalExpenses = new expense[10]; + int numberOfExpenses = 0; + int total; + Double[] myArray = new Double[]{}; + List myArrayList = new ArrayList(Arrays.asList(myArray)); + + //constructor + public expensemanager(String expenseName, int weeklyCostOfExpense, + double monthlyCostOfExpense, double totalCostOfAllExpenses) { + super(expenseName, weeklyCostOfExpense, monthlyCostOfExpense, + totalCostOfAllExpenses); + } + + public void expenses() { + Scanner sc = new Scanner(System.in); + String expenseName, answer; + int weeklyCostOfExpense; + double monthlyCostOfExpense, totalCostOfAllExpenses; + expense b; + + do { + System.out.println("\nEnter the name of your expense, eg Netflix: "); + expenseName = sc.nextLine(); + + System.out.println("\nEnter the weekly cost of the expense: "); + weeklyCostOfExpense = sc.nextInt(); + + monthlyCostOfExpense = weeklyCostOfExpense * 4; + System.out.println("The total cost of " + expenseName + " per month is " + monthlyCostOfExpense); + double m = monthlyCostOfExpense; + myArrayList.add(m); + + + totalCostOfAllExpenses = monthlyCostOfExpense; + + b = new expense(expenseName, weeklyCostOfExpense, monthlyCostOfExpense, totalCostOfAllExpenses); + + if (numberOfExpenses == personalExpenses.length) { + System.out.println("ERROR, array is full. Unable to add more expenses"); + } else { + personalExpenses[numberOfExpenses] = b; + numberOfExpenses++; + } + + System.out.println("Do you wish to continue (Y/N)? "); + sc.nextLine(); + answer = sc.nextLine(); + + } while (answer.equalsIgnoreCase("Y")); + + for (int i = 0; i < numberOfExpenses; i++) { + personalExpenses[i].printExpenseDetails(); + } + } + + public void printDetails() { + for (int i = 0; i < numberOfExpenses; i++) { + personalExpenses[i].printExpenseDetails(); + } + } + + public void calcTotalMonthlyCost() { + for (int j = 0; j < myArrayList.size(); j++) { + total += myArrayList.get(j); + } + System.out.println("Total monthly expense of all expenses is equal to: $" + total); + } + } // Adam - Missing Brace ;-) + +} + +/* TODO +- Need to change code to use ListView to show expenses as list items +- Create a button to fire up a new activityClass with form for a new expense (Name, Cost, Freq, Etc) +- Long click to delete expense +- Short click to view expense +- new activity class for report? + + + */ diff --git a/app/src/main/java/com/example/metaMergeTasker/expenseReport.java b/app/src/main/java/com/example/metaMergeTasker/expenseReport.java new file mode 100644 index 0000000..3713b0d --- /dev/null +++ b/app/src/main/java/com/example/metaMergeTasker/expenseReport.java @@ -0,0 +1,15 @@ +package com.example.metaMergeTasker; + +import androidx.appcompat.app.AppCompatActivity; + +import android.os.Bundle; + +// Adam: Expense Manager Report Interface +public class expenseReport extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_expense_report); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/metaMergeTasker/extraFunctions.java b/app/src/main/java/com/example/metaMergeTasker/extraFunctions.java new file mode 100644 index 0000000..9a8dbb9 --- /dev/null +++ b/app/src/main/java/com/example/metaMergeTasker/extraFunctions.java @@ -0,0 +1,23 @@ +package com.example.metaMergeTasker; + +import android.content.Context; +import android.text.Html; +import android.view.Gravity; +import android.widget.Toast; + +public class extraFunctions { + public static class ShowToast { + public ShowToast(Context context, Boolean error, String info) { + if (error == true) { + Toast toast = Toast.makeText(context, Html.fromHtml("" + info + ""), Toast.LENGTH_LONG); + toast.setGravity(Gravity.TOP, 0, 0); + toast.show(); + } else { + Toast toast = Toast.makeText(context, Html.fromHtml("" + info + ""), Toast.LENGTH_LONG); + toast.setGravity(Gravity.TOP, 0, 0); + toast.show(); + } + } + } +} + diff --git a/app/src/main/java/com/example/metaMergeTasker/homeScreen.java b/app/src/main/java/com/example/metaMergeTasker/homeScreen.java new file mode 100644 index 0000000..1303c7c --- /dev/null +++ b/app/src/main/java/com/example/metaMergeTasker/homeScreen.java @@ -0,0 +1,70 @@ +package com.example.metaMergeTasker; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.ComponentName; +import android.content.Intent; +import android.view.View; +import android.view.View.OnClickListener; +import android.os.Bundle; +import android.widget.ImageButton; +import android.widget.Toast; +import com.example.metaMergeTasker.extraFunctions; + +import com.google.android.material.button.MaterialButton; + +public class homeScreen extends AppCompatActivity { + + ImageButton imageButton; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_home_screen); + + // Adam: Create button object pointers, so we can use them :D + ImageButton pwGen = (ImageButton) findViewById(R.id.btn_generator); + ImageButton lists = (ImageButton) findViewById(R.id.btn_lists); + ImageButton organiser = (ImageButton) findViewById(R.id.btn_organiser); + ImageButton expMang = (ImageButton) findViewById(R.id.btn_expense); + ImageButton pwMang = (ImageButton) findViewById(R.id.btn_manager); + + // Adam: PWGen Image Button Action + pwGen.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + Intent intent=new Intent(homeScreen.this, passwordGeneratorScreen.class); + startActivity(intent); + } + }); + + // Adam: Note Taker Image Button Action + lists.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + Intent intent=new Intent(homeScreen.this, noteMainActivity.class); + startActivity(intent); + } + }); + + // Adam: Organiser Button Action + organiser.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + new extraFunctions.ShowToast(homeScreen.this, true, "Organiser - Yet to be implemented!"); + } + }); + + // Adam: Expense Manager Button Action + expMang.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + Intent intent=new Intent(homeScreen.this, expenseMain.class); + startActivity(intent); + } + }); + + // Adam: Password Manager Button Action + pwMang.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + new extraFunctions.ShowToast(homeScreen.this, true, "Password Manager - Yet to be implemented!"); + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/metaMergeTasker/loginScreen.java b/app/src/main/java/com/example/metaMergeTasker/loginScreen.java new file mode 100644 index 0000000..fda343a --- /dev/null +++ b/app/src/main/java/com/example/metaMergeTasker/loginScreen.java @@ -0,0 +1,52 @@ +package com.example.metaMergeTasker; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; +import com.google.android.material.button.MaterialButton; +import com.example.metaMergeTasker.extraFunctions; + +public class loginScreen extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login_screen); + + // ADAM: Fixed object types... + EditText username = (EditText) findViewById(R.id.username); + EditText password = (EditText) findViewById(R.id.password); + TextView forgotPass = (TextView) findViewById(R.id.forgotPass); + + MaterialButton loginBtn = (MaterialButton) findViewById(R.id.login_btn); + + forgotPass.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + } + }); + + // HARDCODED CREDENTIALS: admin and admin + loginBtn.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + if (username.getText().toString().equals(getString(R.string.username)) && password.getText().toString().equals(getString(R.string.password))) { + //correct + new extraFunctions.ShowToast(loginScreen.this, false, "Login Successful"); + //Toast.makeText(loginScreen.this, "LOGIN SUCCESSFUL", Toast.LENGTH_SHORT).show(); + + Intent intent = new Intent(loginScreen.this, homeScreen.class); + startActivity(intent); + } else { + //incorrect + new extraFunctions.ShowToast(loginScreen.this, true, "ERROR: Login Failed!");; + } + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/metaMergeTasker/noteEditActivity.java b/app/src/main/java/com/example/metaMergeTasker/noteEditActivity.java new file mode 100644 index 0000000..c85811a --- /dev/null +++ b/app/src/main/java/com/example/metaMergeTasker/noteEditActivity.java @@ -0,0 +1,62 @@ +package com.example.metaMergeTasker; + +import android.os.Bundle; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.widget.EditText; +import androidx.appcompat.app.AppCompatActivity; +import java.util.HashSet; + +public class noteEditActivity extends AppCompatActivity { + int noteId; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_note_edit_activity); + + EditText editText = findViewById(R.id.editText); + + // Fetch data that is passed from MainActivity + Intent intent = getIntent(); + + // Accessing the data using key and value + noteId = intent.getIntExtra("noteId", -1); + if (noteId != -1) { + editText.setText(noteMainActivity.notes.get(noteId)); + } else { + + noteMainActivity.notes.add(""); + noteId = noteMainActivity.notes.size() - 1; + noteMainActivity.arrayAdapter.notifyDataSetChanged(); + + } + + editText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + // add your code here + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + noteMainActivity.notes.set(noteId, String.valueOf(charSequence)); + noteMainActivity.arrayAdapter.notifyDataSetChanged(); + // Creating Object of SharedPreferences to store data in the phone + SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("com.example.metaMergeTasker", Context.MODE_PRIVATE); + HashSet set = new HashSet(noteMainActivity.notes); + sharedPreferences.edit().putStringSet("notes", set).apply(); + } + + @Override + public void afterTextChanged(Editable editable) { + // add your code here + } + }); + } +} diff --git a/app/src/main/java/com/example/metaMergeTasker/noteMainActivity.java b/app/src/main/java/com/example/metaMergeTasker/noteMainActivity.java new file mode 100644 index 0000000..5204a97 --- /dev/null +++ b/app/src/main/java/com/example/metaMergeTasker/noteMainActivity.java @@ -0,0 +1,104 @@ +// Adam: Borrowed code from https://www.geeksforgeeks.org/how-to-build-a-simple-notes-app-in-android/ + +package com.example.metaMergeTasker; + +import static com.example.metaMergeTasker.R.*; + +import android.os.Bundle; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.ListView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; + +import com.google.android.material.button.MaterialButton; + +import java.util.ArrayList; +import java.util.HashSet; + + +public class noteMainActivity extends AppCompatActivity { + + static ArrayList notes = new ArrayList<>(); + static ArrayAdapter arrayAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + + super.onCreate(savedInstanceState); + setContentView(layout.activity_note_main_activity); + Button addNoteBtn = (Button) findViewById(id.addNoteBtn); + ListView listView = findViewById(id.noteListView); + + + + + + SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("com.example.metaMergeTasker", Context.MODE_PRIVATE); + HashSet set = (HashSet) sharedPreferences.getStringSet("notes", null); + + if (set == null) { + notes.add("Example note"); + } else { + notes = new ArrayList(set); + } + + // Using custom listView Provided by Android Studio + arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1, notes); + + listView.setAdapter(arrayAdapter); + + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + // Going from MainActivity to NotesEditorActivity + Intent intent = new Intent(getApplicationContext(), noteEditActivity.class); + intent.putExtra("noteId", i); + startActivity(intent); + + } + }); + + listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) { + + final int itemToDelete = i; + // To delete the data from the App + new AlertDialog.Builder(noteMainActivity.this) + .setIcon(android.R.drawable.ic_dialog_alert) + .setTitle("Are you sure?") + .setMessage("Do you want to delete this note?") + .setPositiveButton("Yes", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + notes.remove(itemToDelete); + arrayAdapter.notifyDataSetChanged(); + SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("com.example.metaMergeTasker", Context.MODE_PRIVATE); + HashSet set = new HashSet(noteMainActivity.notes); + sharedPreferences.edit().putStringSet("notes", set).apply(); + } + }).setNegativeButton("No", null).show(); + return true; + } + }); + + addNoteBtn.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + // Going from MainActivity to NotesEditorActivity + Intent intent = new Intent(getApplicationContext(), noteEditActivity.class); + startActivity(intent); + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/metaMergeTasker/passwordGeneratorScreen.java b/app/src/main/java/com/example/metaMergeTasker/passwordGeneratorScreen.java new file mode 100644 index 0000000..1f3048a --- /dev/null +++ b/app/src/main/java/com/example/metaMergeTasker/passwordGeneratorScreen.java @@ -0,0 +1,62 @@ +package com.example.metaMergeTasker; + +import androidx.appcompat.app.AppCompatActivity; + +import android.os.Bundle; +import android.view.View; +import android.widget.TextView; + +import com.google.android.material.button.MaterialButton; + +import java.util.Random; + +public class passwordGeneratorScreen extends AppCompatActivity +{ + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_password_generator_screen); + + // Adam: Locate and Store field and button objects + // Luca: Added buttons for 8 and 12 character password generation + TextView passwordField = findViewById(R.id.GenPasswordField); + MaterialButton genBTN8 = findViewById(R.id.genBTN); + MaterialButton genBTN12 = findViewById(R.id.gen1BTN); + + // Adam: Run this on load to populate password field + passwordField.setText(getPassword(12)); + + // Adam: genBtn on click function, set text and run function all in one + // Luca: Added buttons for 8 and 12 character password generation and made relevant event handlers for each (setting relevant len value) + genBTN8.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + passwordField.setText(getPassword(8)); + } + }); + + genBTN12.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + passwordField.setText(getPassword(12)); + } + }); + } + + // Adam: here is the getPassword function i was supplied by the team + public String getPassword(int len) { + String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + String lower = "abcdefghijklmnopqrstuvwxyz"; + String num = "0123456789"; + String specialChars = "<>,.?/}]{[+_-)(*&^%$#@!="; + String combination = upper+lower+specialChars+num; + + char[] password = new char[len]; + Random r = new Random(); + for (int i = 0; i - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/icon_gen.png b/app/src/main/res/drawable-v24/icon_gen.png new file mode 100644 index 0000000..03e3a34 Binary files /dev/null and b/app/src/main/res/drawable-v24/icon_gen.png differ diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/logo.png b/app/src/main/res/drawable/logo.png new file mode 100644 index 0000000..f8f87d4 Binary files /dev/null and b/app/src/main/res/drawable/logo.png differ diff --git a/app/src/main/res/layout/activity_expense_edit.xml b/app/src/main/res/layout/activity_expense_edit.xml new file mode 100644 index 0000000..332cc28 --- /dev/null +++ b/app/src/main/res/layout/activity_expense_edit.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_expense_main.xml b/app/src/main/res/layout/activity_expense_main.xml new file mode 100644 index 0000000..1d0317b --- /dev/null +++ b/app/src/main/res/layout/activity_expense_main.xml @@ -0,0 +1,42 @@ + + + + + + + + + +