From bf033932a12399b4ed2944aa93ae8274b56a4522 Mon Sep 17 00:00:00 2001 From: Bradley Bickford Date: Mon, 3 Mar 2025 18:30:24 -0500 Subject: [PATCH] Adding a way to see what's been logged, back button on FirstActivity still isn't right... --- .idea/vcs.xml | 6 ++ .../Constants.java | 8 +++ .../FirstActivity.java | 30 ++++++++- .../InterActivityState.java | 5 +- .../MainActivity.java | 52 +++++++++++++-- .../SecondActivity.java | 2 +- .../StoredDataRecyclerViewAdapter.java | 65 +++++++++++++++++++ .../Utilities.java | 27 ++++++++ app/src/main/res/layout/activity_main.xml | 11 ++++ .../layout/stored_data_recycler_view_item.xml | 50 ++++++++++++++ 10 files changed, 245 insertions(+), 11 deletions(-) create mode 100644 .idea/vcs.xml create mode 100644 app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/Constants.java create mode 100644 app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/StoredDataRecyclerViewAdapter.java create mode 100644 app/src/main/res/layout/stored_data_recycler_view_item.xml 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/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/Constants.java b/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/Constants.java new file mode 100644 index 0000000..2ea1677 --- /dev/null +++ b/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/Constants.java @@ -0,0 +1,8 @@ +package com.coldlightalchemist.interactivitystatesharingexample; + +public class Constants { + public static final String kInterActivityStateKey = "Inter Activity State"; + public static final String kFileName = "MyFile.csv"; + + public static final String[] kCSVHeaders = {"First Activity String", "Second Activity Int"}; +} diff --git a/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/FirstActivity.java b/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/FirstActivity.java index d263edd..f45cdd1 100644 --- a/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/FirstActivity.java +++ b/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/FirstActivity.java @@ -1,5 +1,7 @@ package com.coldlightalchemist.interactivitystatesharingexample; +import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.text.Editable; @@ -8,6 +10,8 @@ import android.widget.Button; import android.widget.EditText; import androidx.activity.EdgeToEdge; +import androidx.activity.OnBackPressedCallback; +import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; @@ -32,7 +36,29 @@ public class FirstActivity extends AppCompatActivity { return insets; }); - InterActivityState state = (InterActivityState) Objects.requireNonNull(getIntent().getExtras()).get(MainActivity.kInterActivityStateKey); + Context context = getApplicationContext(); + InterActivityState state = (InterActivityState) Objects.requireNonNull(getIntent().getExtras()).get(Constants.kInterActivityStateKey); + + this.getOnBackPressedDispatcher().addCallback(new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context); + DialogInterface.OnClickListener listener = (d, w) -> { + switch(w) { + case DialogInterface.BUTTON_POSITIVE: + finish(); + break; + case DialogInterface.BUTTON_NEGATIVE: + break; + } + }; + + alertBuilder.setMessage("Are you sure you want to back out, the data you've entered so far will be lost!") + .setPositiveButton("Yes", listener) + .setNegativeButton("No", listener) + .show(); + } + }); enterStringField = (EditText) findViewById(R.id.enterStringField); enterStringField.addTextChangedListener(new TextWatcher() { @@ -56,7 +82,7 @@ public class FirstActivity extends AppCompatActivity { moveToSecondActivity = (Button) findViewById(R.id.moveToSecondActivity); moveToSecondActivity.setOnClickListener((v) -> { Intent secondActivityIntent = new Intent(v.getContext(), SecondActivity.class); - secondActivityIntent.putExtra(MainActivity.kInterActivityStateKey, state); + secondActivityIntent.putExtra(Constants.kInterActivityStateKey, state); startActivity(secondActivityIntent); }); diff --git a/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/InterActivityState.java b/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/InterActivityState.java index 549a1ce..b757242 100644 --- a/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/InterActivityState.java +++ b/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/InterActivityState.java @@ -9,9 +9,6 @@ import java.io.Serializable; import java.nio.file.Files; public class InterActivityState implements Serializable { - - private static final String[] kCSVHeaders = {"First Activity String", "Second Activity Int"}; - private File writeFile; private String firstActivityString; private int secondActivityInt; @@ -44,7 +41,7 @@ public class InterActivityState implements Serializable { PrintWriter writer = new PrintWriter(new FileWriter(writeFile, true)); if (!fileExists) { - writer.println(Utilities.makeCSVString(kCSVHeaders)); + writer.println(Utilities.makeCSVString(Constants.kCSVHeaders)); } writer.println(Utilities.makeCSVString(firstActivityString, Integer.toString(secondActivityInt))); diff --git a/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/MainActivity.java b/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/MainActivity.java index 460debe..6710886 100644 --- a/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/MainActivity.java +++ b/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/MainActivity.java @@ -1,8 +1,13 @@ package com.coldlightalchemist.interactivitystatesharingexample; +import static android.view.View.INVISIBLE; +import static android.view.View.VISIBLE; + import android.content.Intent; import android.os.Bundle; +import android.util.Log; import android.widget.Button; +import android.widget.TextView; import android.widget.Toast; import androidx.activity.EdgeToEdge; @@ -11,17 +16,27 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import org.w3c.dom.Text; import java.io.File; +import java.io.IOException; import java.nio.file.Paths; +import java.util.List; +import java.util.Map; public class MainActivity extends AppCompatActivity { private InterActivityState interActivityState; private Button startDataEntry; - public static final String kInterActivityStateKey = "Inter Activity State"; - public static final String kFileName = "MyFile.csv"; + private TextView nothingInFile; + + private RecyclerView dataInFile; + + private File dataFile; @Override protected void onCreate(Bundle savedInstanceState) { @@ -34,12 +49,41 @@ public class MainActivity extends AppCompatActivity { return insets; }); + dataFile = new File(getFilesDir(), Constants.kFileName); + startDataEntry = (Button) findViewById(R.id.startDataEntry); startDataEntry.setOnClickListener((v) -> { - interActivityState = new InterActivityState(new File(v.getContext().getFilesDir(), kFileName)); + interActivityState = new InterActivityState(dataFile); Intent firstActivityIntent = new Intent(v.getContext(), FirstActivity.class); - firstActivityIntent.putExtra(kInterActivityStateKey, interActivityState); + firstActivityIntent.putExtra(Constants.kInterActivityStateKey, interActivityState); startActivity(firstActivityIntent); }); + + nothingInFile = (TextView) findViewById(R.id.nothingInFile); + + dataInFile = (RecyclerView) findViewById(R.id.dataInFile); + dataInFile.setLayoutManager(new LinearLayoutManager(this)); + + try { + List> currentFileData = Utilities.readFormattedCSV(dataFile); + + if (currentFileData == null || currentFileData.isEmpty()) { + nothingInFile.setVisibility(VISIBLE); + dataInFile.setVisibility(INVISIBLE); + } else { + nothingInFile.setVisibility(INVISIBLE); + dataInFile.setVisibility(VISIBLE); + + Log.d("RECYCLER DATA", "Recycler Data Size: " + currentFileData.size()); + + StoredDataRecyclerViewAdapter adapter = new StoredDataRecyclerViewAdapter(currentFileData); + dataInFile.setAdapter(adapter); + } + } catch (IOException e) { + nothingInFile.setVisibility(VISIBLE); + dataInFile.setVisibility(INVISIBLE); + Log.d("FILE READ", "Failed to read the data file for some reason", e); + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/SecondActivity.java b/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/SecondActivity.java index 7672e8a..c075d58 100644 --- a/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/SecondActivity.java +++ b/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/SecondActivity.java @@ -35,7 +35,7 @@ public class SecondActivity extends AppCompatActivity { return insets; }); - InterActivityState state = (InterActivityState) Objects.requireNonNull(getIntent().getExtras()).get(MainActivity.kInterActivityStateKey); + InterActivityState state = (InterActivityState) Objects.requireNonNull(getIntent().getExtras()).get(Constants.kInterActivityStateKey); editNumber = (EditText) findViewById(R.id.editNumber); editNumber.addTextChangedListener(new TextWatcher() { diff --git a/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/StoredDataRecyclerViewAdapter.java b/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/StoredDataRecyclerViewAdapter.java new file mode 100644 index 0000000..b0483c0 --- /dev/null +++ b/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/StoredDataRecyclerViewAdapter.java @@ -0,0 +1,65 @@ +package com.coldlightalchemist.interactivitystatesharingexample; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; +import java.util.Map; + +public class StoredDataRecyclerViewAdapter extends RecyclerView.Adapter { + private final List> data; + + public static class StoredDataRecyclerViewHolder extends RecyclerView.ViewHolder { + private final TextView rvFirstActivityString; + private final TextView rvSecondActivityInt; + + public StoredDataRecyclerViewHolder(View itemView) { + super(itemView); + + rvFirstActivityString = itemView.findViewById(R.id.rvFirstActivityString); + rvSecondActivityInt = itemView.findViewById(R.id.rvSecondActivityInt); + } + + public TextView getFirstActivityStringTextView() { + return rvFirstActivityString; + } + + public TextView getSecondActivityIntTextView() { + return rvSecondActivityInt; + } + } + + public StoredDataRecyclerViewAdapter(List> data) { + this.data = data; + } + + @NonNull + @Override + public StoredDataRecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.stored_data_recycler_view_item, parent, false); + + return new StoredDataRecyclerViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull StoredDataRecyclerViewHolder holder, int position) { + holder.getFirstActivityStringTextView().setText( + data.get(position).get(Constants.kCSVHeaders[0]) + ); + holder.getSecondActivityIntTextView().setText( + data.get(position).get(Constants.kCSVHeaders[1]) + ); + } + + @Override + public int getItemCount() { + return data.size(); + } + +} diff --git a/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/Utilities.java b/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/Utilities.java index 28eae2d..4d794d8 100644 --- a/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/Utilities.java +++ b/app/src/main/java/com/coldlightalchemist/interactivitystatesharingexample/Utilities.java @@ -1,6 +1,12 @@ package com.coldlightalchemist.interactivitystatesharingexample; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; import java.util.Arrays; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; public class Utilities { @@ -9,4 +15,25 @@ public class Utilities { .map((s) -> "\"" + s + "\"") .collect(Collectors.joining(",")); } + + public static List> readFormattedCSV(File toRead) throws IOException { + if (!toRead.exists()) { + return null; + } + + BufferedReader reader = new BufferedReader(new FileReader(toRead)); + + return reader.lines() + .filter((s) -> !s.equals(makeCSVString(Constants.kCSVHeaders))) + .map((s) -> { + String[] spliteration = s.split("\",\""); + + // TODO: If you were to add columns, this would need to be more dynamic then it is + return Map.of( + Constants.kCSVHeaders[0], spliteration[0].replace("\"", ""), + Constants.kCSVHeaders[1], spliteration[1].replace("\"", "") + ); + }) + .collect(Collectors.toList()); + } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 38c30dc..1f35828 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -29,6 +29,17 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Start Data Entry" /> + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/stored_data_recycler_view_item.xml b/app/src/main/res/layout/stored_data_recycler_view_item.xml new file mode 100644 index 0000000..3cff5ce --- /dev/null +++ b/app/src/main/res/layout/stored_data_recycler_view_item.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file