diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml deleted file mode 100644 index 65aebe9..0000000 --- a/.idea/deploymentTargetDropDown.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 1d225cc..cb3f61e 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -10,7 +10,7 @@ diff --git a/app/build.gradle b/app/build.gradle index fd0f767..caa9c32 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { defaultConfig { applicationId "xyz.r0r5chach.cpsAssist" - minSdk 24 + minSdk 29 targetSdk 33 versionCode 1 versionName "1.0" @@ -26,6 +26,9 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + buildFeatures { + viewBinding true + } } dependencies { @@ -33,6 +36,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' + implementation 'androidx.navigation:navigation-fragment:2.5.3' + implementation 'androidx.navigation:navigation-ui:2.5.3' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 338e00b..92a7ab2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ - + + diff --git a/app/src/main/java/xyz/r0r5chach/cpsAssist/BtnID.java b/app/src/main/java/xyz/r0r5chach/cpsAssist/BtnID.java new file mode 100644 index 0000000..5d0c588 --- /dev/null +++ b/app/src/main/java/xyz/r0r5chach/cpsAssist/BtnID.java @@ -0,0 +1,9 @@ +package xyz.r0r5chach.cpsAssist; + +public enum BtnID { + ADD_BUTTON, + EDIT_BUTTON, + DELETE_BUTTON, + NOTES_BUTTON, + QUIZ_BUTTON +} diff --git a/app/src/main/java/xyz/r0r5chach/cpsAssist/home/HomeActivity.java b/app/src/main/java/xyz/r0r5chach/cpsAssist/home/HomeActivity.java deleted file mode 100644 index ead86fb..0000000 --- a/app/src/main/java/xyz/r0r5chach/cpsAssist/home/HomeActivity.java +++ /dev/null @@ -1,4 +0,0 @@ -package xyz.r0r5chach.cpsAssist.home; - -public class HomeActivity { -} diff --git a/app/src/main/java/xyz/r0r5chach/cpsAssist/login/OnClickListener.java b/app/src/main/java/xyz/r0r5chach/cpsAssist/login/BtnOnClickListener.java similarity index 90% rename from app/src/main/java/xyz/r0r5chach/cpsAssist/login/OnClickListener.java rename to app/src/main/java/xyz/r0r5chach/cpsAssist/login/BtnOnClickListener.java index 4910576..b8343dc 100644 --- a/app/src/main/java/xyz/r0r5chach/cpsAssist/login/OnClickListener.java +++ b/app/src/main/java/xyz/r0r5chach/cpsAssist/login/BtnOnClickListener.java @@ -7,12 +7,13 @@ import android.widget.EditText; import android.widget.Toast; import xyz.r0r5chach.cpsAssist.ArrayTools; +import xyz.r0r5chach.cpsAssist.main.MainActivity; import xyz.r0r5chach.cpsAssist.notes.NotesActivity; /** * This Class defines the definition of the OnCLickListener for the LoginActivity * @author r0r5chach */ -public class OnClickListener implements View.OnClickListener{ +public class BtnOnClickListener implements View.OnClickListener{ /** * This attribute stores the amount of attempts the user has currently taken */ @@ -34,7 +35,7 @@ public class OnClickListener implements View.OnClickListener{ * @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, String users) { + public BtnOnClickListener(EditText usernameField, EditText passwordField, String users) { initUsers(users); this.currentAttempts = 0; this.usernameField = usernameField; @@ -53,10 +54,11 @@ public class OnClickListener implements View.OnClickListener{ } if (isUser(inputs)) { - Intent home = new Intent(view.getContext(), NotesActivity.class); + Intent home = new Intent(view.getContext(), MainActivity.class); home.putExtra("username", inputs[0]); view.getContext().startActivity(home); - ((Activity)view.getContext()).finish(); + Activity login = (Activity) view.getContext(); + login.finish(); } else { currentAttempts += 1; @@ -110,7 +112,7 @@ public class OnClickListener implements View.OnClickListener{ */ private boolean isUser(String[] inputs) { for (String[] user: users) { - if (inputs[0].equals(user[0]) || inputs[1].equals(user[1])) { + if (inputs[0].equals(user[0]) && inputs[1].equals(user[1])) { return true; } } diff --git a/app/src/main/java/xyz/r0r5chach/cpsAssist/login/LoginActivity.java b/app/src/main/java/xyz/r0r5chach/cpsAssist/login/LoginActivity.java index be8fd37..9ba6ef4 100644 --- a/app/src/main/java/xyz/r0r5chach/cpsAssist/login/LoginActivity.java +++ b/app/src/main/java/xyz/r0r5chach/cpsAssist/login/LoginActivity.java @@ -6,12 +6,20 @@ import android.os.Bundle; import xyz.r0r5chach.cpsAssist.R; +/** + * This Class defines the processes to run for the login activity for the application + */ public class LoginActivity extends AppCompatActivity { - + /** + * This method defines what to do when the activity is created + * @param savedInstanceState If the activity is being re-initialized after + * previously being shut down then this Bundle contains the data it most + * recently supplied in {@link #onSaveInstanceState}. Note: Otherwise it is null. + */ @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), getString(R.string.users))); + findViewById(R.id.loginButton).setOnClickListener(new BtnOnClickListener(findViewById(R.id.userNameField), findViewById(R.id.passwordField), getString(R.string.users))); } } \ No newline at end of file diff --git a/app/src/main/java/xyz/r0r5chach/cpsAssist/main/BtnOnClickListener.java b/app/src/main/java/xyz/r0r5chach/cpsAssist/main/BtnOnClickListener.java new file mode 100644 index 0000000..ff86637 --- /dev/null +++ b/app/src/main/java/xyz/r0r5chach/cpsAssist/main/BtnOnClickListener.java @@ -0,0 +1,32 @@ +package xyz.r0r5chach.cpsAssist.main; + +import android.app.Activity; +import android.content.Intent; +import android.view.View; + +import java.util.Locale; + +import xyz.r0r5chach.cpsAssist.BtnID; +import xyz.r0r5chach.cpsAssist.quiz.QuizActivity; +import xyz.r0r5chach.cpsAssist.notes.NotesActivity; + +public class BtnOnClickListener implements View.OnClickListener{ + @Override + public void onClick(View v) { + String id = v.getResources().getResourceName(v.getId()).split("/")[1]; + Intent intent = null; + switch(BtnID.valueOf(id.toUpperCase(Locale.ROOT))) { + case NOTES_BUTTON: + intent = new Intent(v.getContext(), NotesActivity.class); + break; + case QUIZ_BUTTON: + intent = new Intent(v.getContext(), QuizActivity.class); + break; + } + Activity main = (Activity) v.getContext(); + if (intent != null) { + intent.putExtra("username", main.getIntent().getStringExtra("username")); + main.startActivity(intent); + } + } +} diff --git a/app/src/main/java/xyz/r0r5chach/cpsAssist/main/MainActivity.java b/app/src/main/java/xyz/r0r5chach/cpsAssist/main/MainActivity.java new file mode 100644 index 0000000..0d761fe --- /dev/null +++ b/app/src/main/java/xyz/r0r5chach/cpsAssist/main/MainActivity.java @@ -0,0 +1,23 @@ +package xyz.r0r5chach.cpsAssist.main; + +import android.os.Bundle; + +import androidx.appcompat.app.AppCompatActivity; + +import xyz.r0r5chach.cpsAssist.R; +import xyz.r0r5chach.cpsAssist.main.BtnOnClickListener; + +public class MainActivity extends AppCompatActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + setTitle("Home- " + getIntent().getStringExtra("username")); + findViewById(R.id.notes_button).setOnClickListener(new BtnOnClickListener()); + } + + @Override + public void onBackPressed() { + finish(); + } +} diff --git a/app/src/main/java/xyz/r0r5chach/cpsAssist/notes/Adapter.java b/app/src/main/java/xyz/r0r5chach/cpsAssist/notes/Adapter.java new file mode 100644 index 0000000..eb42c35 --- /dev/null +++ b/app/src/main/java/xyz/r0r5chach/cpsAssist/notes/Adapter.java @@ -0,0 +1,76 @@ +package xyz.r0r5chach.cpsAssist.notes; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.io.File; + +import xyz.r0r5chach.cpsAssist.R; + +public class Adapter extends RecyclerView.Adapter { + + private final Notes notes; + + public Adapter(File path, String username) { + notes = getStoredNotes(path, username); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.notes_item, parent, false); + return new ViewHolder(v, this); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int index) { + File note = notes.getNote(index); + holder.getFileName().setText(note.getName()); + } + + @Override + public int getItemCount() { + return notes.getAmount(); + } + + public Notes getNotes() { + return notes; + } + + private Notes getStoredNotes(File path, String username) { + return new Notes(path, username); + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + private final TextView fileName; + private final Button editButton; + private final Button deleteButton; + public ViewHolder(View v, Adapter adapter) { + super(v); + fileName = v.findViewById(R.id.fileNameField); + editButton = v.findViewById(R.id.edit_Button); + deleteButton = v.findViewById(R.id.delete_Button); + editButton.setOnClickListener(new BtnOnClickListener(adapter)); + deleteButton.setOnClickListener(new BtnOnClickListener(adapter)); + } + + public TextView getFileName() { + return fileName; + } + + public Button getEditButton() { + return editButton; + } + + public Button getDeleteButton() { + return deleteButton; + } + } + +} diff --git a/app/src/main/java/xyz/r0r5chach/cpsAssist/notes/BtnOnClickListener.java b/app/src/main/java/xyz/r0r5chach/cpsAssist/notes/BtnOnClickListener.java new file mode 100644 index 0000000..d80dd51 --- /dev/null +++ b/app/src/main/java/xyz/r0r5chach/cpsAssist/notes/BtnOnClickListener.java @@ -0,0 +1,98 @@ +package xyz.r0r5chach.cpsAssist.notes; + +import android.app.AlertDialog; +import android.text.InputType; +import android.view.View; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + + +import java.io.File; +import java.util.Locale; +import java.util.Scanner; + +import xyz.r0r5chach.cpsAssist.BtnID; +import xyz.r0r5chach.cpsAssist.R; + + +public class BtnOnClickListener implements View.OnClickListener { + private final Adapter adapter; + + public BtnOnClickListener(Adapter adapter) { + this.adapter = adapter; + } + + + @Override + public void onClick(View view) { + String path; + String id = view.getResources().getResourceName(view.getId()).split("/")[1]; + switch(BtnID.valueOf(id.toUpperCase(Locale.ROOT))) { + case ADD_BUTTON: + onAddClick(); + Toast.makeText(view.getContext(), "File Created", Toast.LENGTH_LONG).show(); + break; + case EDIT_BUTTON: + path = getPath(view); + onEditClick(path, view); + break; + case DELETE_BUTTON: + path = getPath(view); + onDeleteClick(path); + Toast.makeText(view.getContext(), "File Deleted" , Toast.LENGTH_LONG).show(); + break; + } + } + + private void onAddClick() { + adapter.getNotes().createNote(); + adapter.notifyItemInserted(adapter.getNotes().getAmount()); + } + + private void onEditClick(String path, View v) { + File tmp = new File(v.getContext().getExternalFilesDir(null) + "/" + path); //load file into var + EditText editField = new EditText(v.getContext()); + editField.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE); + AlertDialog dialog = editDialog(v, tmp, editField); + initNoteText(editField, tmp); + dialog.show(); + } + + private void onDeleteClick(String path) { + adapter.notifyItemRemoved(adapter.getNotes().deleteNote(path)); + } + + private String getPath(View v) { + LinearLayout row = (LinearLayout) v.getParent(); + TextView name = row.findViewById(R.id.fileNameField); + return name.getText().toString(); + } + + private AlertDialog editDialog(View v, File note, TextView editField) { + AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext()); + builder.setTitle("Edit Note"); + builder.setView(editField); + builder.setPositiveButton("Save", new DialogOnClickListener(adapter, note, editField)); + builder.setNegativeButton("Cancel", new DialogOnClickListener()); + return builder.create(); + } + + private void initNoteText(TextView editField, File note) { + try { + Scanner r = new Scanner(note); + StringBuilder text = new StringBuilder(); + while (r.hasNextLine()) { + text.append(r.nextLine()); + } + editField.setText(text.toString()); + r.close(); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/xyz/r0r5chach/cpsAssist/notes/DialogOnClickListener.java b/app/src/main/java/xyz/r0r5chach/cpsAssist/notes/DialogOnClickListener.java new file mode 100644 index 0000000..ca2c392 --- /dev/null +++ b/app/src/main/java/xyz/r0r5chach/cpsAssist/notes/DialogOnClickListener.java @@ -0,0 +1,36 @@ +package xyz.r0r5chach.cpsAssist.notes; + +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.widget.TextView; + +import java.io.File; + +import xyz.r0r5chach.cpsAssist.R; + +public class DialogOnClickListener implements DialogInterface.OnClickListener { + private Adapter adapter; + private File note; + private TextView editField; + + + public DialogOnClickListener() { + + } + + public DialogOnClickListener(Adapter adapter, File note, TextView editField) { + this.adapter = adapter; + this.note = note; + this.editField = editField; + } + + @Override + public void onClick(DialogInterface dialog, int which) { + AlertDialog d = (AlertDialog) dialog; + if (which == DialogInterface.BUTTON_POSITIVE) { + adapter.getNotes().updateNote(note, editField.getText().toString()); + adapter.notifyItemChanged(adapter.getNotes().getNoteIndex(note)); + } + d.dismiss(); + } +} diff --git a/app/src/main/java/xyz/r0r5chach/cpsAssist/notes/Notes.java b/app/src/main/java/xyz/r0r5chach/cpsAssist/notes/Notes.java new file mode 100644 index 0000000..ae74885 --- /dev/null +++ b/app/src/main/java/xyz/r0r5chach/cpsAssist/notes/Notes.java @@ -0,0 +1,84 @@ +package xyz.r0r5chach.cpsAssist.notes; + + +import java.io.File; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.nio.file.Files; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +public class Notes { + private final List notes; + private final File rootDir; + private final String username; + + public Notes(File rootDir, String username) { + this.rootDir = rootDir; + this.username = username; + notes = new ArrayList<>(); + getStoredNotes(); + } + + private void getStoredNotes() { + for (File note: Objects.requireNonNull(rootDir.listFiles())) { + if (note.getName().contains(username)) { + notes.add(note); + } + } + } + + public void createNote() { + String fileName = LocalDateTime.now().toString() + "-" + username; + //Get current username + File note = new File(rootDir, fileName); + notes.add(note); + try { + writeFile(note, ""); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + public int deleteNote(String path) { + File tmp = new File(rootDir.getAbsolutePath() + "/" + path); + int index = getNoteIndex(tmp); + notes.remove(index); + if (tmp.delete()) { + return index; + } + return -1; + } + + public void updateNote(File note, String content) { + try { + writeFile(note, content); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + public File getNote(int index) { + return notes.get(index); + } + + public int getNoteIndex(File note) { + return notes.indexOf(note); + } + + public int getAmount() { + return notes.size(); + } + + private void writeFile(File file, String content) throws IOException { + OutputStreamWriter fileWriter = new OutputStreamWriter(Files.newOutputStream(file.toPath())); + fileWriter.write(content); + fileWriter.flush(); + fileWriter.close(); + } +} diff --git a/app/src/main/java/xyz/r0r5chach/cpsAssist/notes/NotesActivity.java b/app/src/main/java/xyz/r0r5chach/cpsAssist/notes/NotesActivity.java new file mode 100644 index 0000000..d4a73b2 --- /dev/null +++ b/app/src/main/java/xyz/r0r5chach/cpsAssist/notes/NotesActivity.java @@ -0,0 +1,31 @@ +package xyz.r0r5chach.cpsAssist.notes; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.os.Bundle; +import android.widget.TextView; + +import xyz.r0r5chach.cpsAssist.R; + +public class NotesActivity extends AppCompatActivity { + private Adapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_notes); + initRecycler(); + setTitle("Notes- " + getIntent().getStringExtra("username")); + findViewById(R.id.add_Button).setOnClickListener(new BtnOnClickListener(adapter)); + } + + private void initRecycler() { + RecyclerView list = findViewById(R.id.notesList); + adapter = new Adapter(getExternalFilesDir(null), getIntent().getStringExtra("username")); + list.setAdapter(adapter); + list.setLayoutManager(new LinearLayoutManager(this)); + adapter.notifyItemRangeChanged(0, adapter.getItemCount()); + } +} \ No newline at end of file diff --git a/app/src/main/java/xyz/r0r5chach/cpsAssist/quiz/QuizActivity.java b/app/src/main/java/xyz/r0r5chach/cpsAssist/quiz/QuizActivity.java new file mode 100644 index 0000000..34e25af --- /dev/null +++ b/app/src/main/java/xyz/r0r5chach/cpsAssist/quiz/QuizActivity.java @@ -0,0 +1,4 @@ +package xyz.r0r5chach.cpsAssist.quiz; + +public class QuizActivity { +} diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index d746ecb..6d16f45 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -1,5 +1,6 @@ @@ -15,7 +16,8 @@ android:ems="10" android:hint="@string/usernameFieldHint" android:inputType="textPersonName" - android:minHeight="48dp" /> + android:minHeight="48dp" + tools:ignore="VisualLintTextFieldSize" /> + android:minHeight="48dp" + tools:ignore="VisualLintTextFieldSize" />