diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cf7d92a..42dbe64 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,9 @@ android:theme="@style/Theme.Oplogy" tools:ignore="ExtraText" tools:targetApi="31"> + diff --git a/app/src/main/java/com/example/oplogy/AppDatabase.java b/app/src/main/java/com/example/oplogy/AppDatabase.java index 8d655f3..c52259d 100644 --- a/app/src/main/java/com/example/oplogy/AppDatabase.java +++ b/app/src/main/java/com/example/oplogy/AppDatabase.java @@ -3,7 +3,7 @@ package com.example.oplogy; import androidx.room.Database; import androidx.room.RoomDatabase; -@Database(entities = {SetUpTable.class}, version = 2) +@Database(entities = {SetUpTable.class}, version = 2, exportSchema = false) public abstract class AppDatabase extends RoomDatabase { // データベースにアクセスするためのメソッドを提供する public abstract SetUpTableDao setUpTableDao(); diff --git a/app/src/main/java/com/example/oplogy/MainActivity.java b/app/src/main/java/com/example/oplogy/MainActivity.java index 64dc27a..7513bcf 100644 --- a/app/src/main/java/com/example/oplogy/MainActivity.java +++ b/app/src/main/java/com/example/oplogy/MainActivity.java @@ -15,6 +15,7 @@ import androidx.room.Room; import com.google.firebase.firestore.FirebaseFirestore; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; @@ -112,64 +113,29 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe // ルート作成のクリック処理 if(view == root){ imageRoot.setImageResource(R.drawable.pin); - ExecutorService executor = Executors.newSingleThreadExecutor(); - - CountDownLatch latch = new CountDownLatch(2); - - executor.execute(() -> { - AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "SetUpTable").build(); - SetUpTableDao setUpTableDao = db.setUpTableDao(); - - Log.d("MainActivity", "db" + setUpTableDao.getAll()); - - int totalStudent = setUpTableDao.getTotalStudent(); - int myDataListSize = firestoreReception.getMyDataListSize(); - - runOnUiThread(() -> { - if (totalStudent != myDataListSize) { - showRouteCreationDialog(latch); - } else { - latch.countDown(); - } - }); - }); - - executor.execute(() -> { - List myDataList = firestoreReception.getMyDataList(); - CreateRoot createRoot = new CreateRoot(MainActivity.this); - createRoot.receiveData(myDataList); - latch.countDown(); - }); - - new Thread(() -> { - try { - latch.await(); // Both tasks must call countDown() before this returns - runOnUiThread(() -> { - Intent toRoot = new Intent(MainActivity.this, Maps.class); - startActivity(toRoot); - }); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }).start(); - - executor.shutdown(); + fetchDataAndCreateRoute(); } if(view == imageRoot){ imageRoot.setImageResource(R.drawable.pin); - Intent toRoot = new Intent(MainActivity.this,Maps.class); - startActivity(toRoot); + fetchDataAndCreateRoute(); } // 提出状況のクリック処理 if(view == submission){ - Intent toSubmission = new Intent(MainActivity.this,SubmissionActivity.class); + ArrayList submissionStudents = getSubmissionStudents(); + Intent toSubmission = new Intent(MainActivity.this, SubmissionActivity.class); + toSubmission.putParcelableArrayListExtra("submissionStudents", submissionStudents); startActivity(toSubmission); } if(view == imageSubmission){ - Intent toSubmission = new Intent(MainActivity.this,SubmissionActivity.class); + ArrayList submissionStudents = getSubmissionStudents(); + Intent toSubmission = new Intent(MainActivity.this, SubmissionActivity.class); + toSubmission.putParcelableArrayListExtra("submissionStudents", submissionStudents); startActivity(toSubmission); } } + + + private void showUUIDYesNoDialog() { //ダイアログの表示 AlertDialog.Builder builder = new AlertDialog.Builder(this); @@ -193,7 +159,58 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe }); builder.show(); } - //ルート作成のダイアログ + + //ルート作成のダイアログ+ルート作成の処理の非同期処理実装 + private void fetchDataAndCreateRoute() { + //非同期処理の開始 + ExecutorService executor = Executors.newSingleThreadExecutor(); + + // 2つのタスクの完了をカウントする変数 + CountDownLatch latch = new CountDownLatch(2); + + // タスク1: ローカルDBから生徒数を取得 + executor.execute(() -> { + AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "SetUpTable").build(); + SetUpTableDao setUpTableDao = db.setUpTableDao(); + + Log.d("MainActivity", "db" + setUpTableDao.getAll()); + + int totalStudent = setUpTableDao.getTotalStudent(); + int myDataListSize = firestoreReception.getMyDataListSize(); + + runOnUiThread(() -> { + if (totalStudent != myDataListSize) { + showRouteCreationDialog(latch); + } else { + latch.countDown(); + } + }); + }); + + // タスク2: Firestoreからデータを取得 + executor.execute(() -> { + List myDataList = firestoreReception.getMyDataList(); + CreateRoot createRoot = new CreateRoot(MainActivity.this); + createRoot.receiveData(myDataList); + latch.countDown(); + }); + + new Thread(() -> { + try { + latch.await(); // Both tasks must call countDown() before this returns + runOnUiThread(() -> { + Intent toRoot = new Intent(MainActivity.this, Maps.class); + startActivity(toRoot); + }); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }).start(); + + executor.shutdown(); + } + + //ルート作成する際の警告のダイアログ private void showRouteCreationDialog(CountDownLatch latch) { new AlertDialog.Builder(MainActivity.this) .setTitle("警告") @@ -212,4 +229,46 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe }) .show(); } + //submissionクラスに渡すlistの作成 + private ArrayList getSubmissionStudents() { + ArrayList submissionStudents = new ArrayList<>(); + List myDataList = firestoreReception.getMyDataList(); + + ExecutorService executor = Executors.newSingleThreadExecutor(); + CountDownLatch latch = new CountDownLatch(1); + + executor.execute(() -> { + // 1. Roomデータベースから全生徒数を取得 + AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "SetUpTable").build(); + SetUpTableDao setUpTableDao = db.setUpTableDao(); + int totalStudent = setUpTableDao.getTotalStudent(); + // 2. Firestoreから生徒番号のリストを取得 + ArrayList firestoreStudentNumbers = new ArrayList<>(); + for (MyDataClass myData : myDataList) { + int studentNumber = myData.getStudentNumber(); + firestoreStudentNumbers.add(studentNumber); + } + + // 3. SubmissionStudentオブジェクトのリストを作成 + for (int i = 1; i <= totalStudent; i++) { + boolean submitted = firestoreStudentNumbers.contains(i); + submissionStudents.add(new SubmissionStudent(i, submitted)); + } + + // 4. データベース操作が完了したことを通知 + latch.countDown(); + }); + + try { + // データベース操作が完了するのを待つ + latch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + executor.shutdown(); + + // SubmissionStudentオブジェクトのリストを返す + return submissionStudents; + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/oplogy/SubmissionActivity.java b/app/src/main/java/com/example/oplogy/SubmissionActivity.java index c6e2d7f..3ae33e2 100644 --- a/app/src/main/java/com/example/oplogy/SubmissionActivity.java +++ b/app/src/main/java/com/example/oplogy/SubmissionActivity.java @@ -1,14 +1,55 @@ package com.example.oplogy; import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.os.Bundle; +import android.widget.ImageView; + +import com.example.oplogy.databinding.SubmissionBinding; + +import java.util.ArrayList; +import java.util.List; public class SubmissionActivity extends AppCompatActivity { + private RecyclerView recyclerView; + private SubmissionAdapter submissionAdapter; + private List students = new ArrayList<>(); + ArrayList studentNumbers = new ArrayList<>(); + private int totalStudent = 10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.submission); + + ImageView backButton = findViewById(R.id.BackMain_fromSubmission); + backButton.setOnClickListener(v -> { + finish(); + }); + + + studentNumbers=getIntent().getIntegerArrayListExtra("submissionStudents"); + + recyclerView = findViewById(R.id.recyclerView); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + submissionAdapter = new SubmissionAdapter(students); + recyclerView.setAdapter(submissionAdapter); + + fetchStudents(); } -} \ No newline at end of file + private void fetchStudents() { + // インテントから生徒のリストを取得 + ArrayList submissionStudents = getIntent().getParcelableArrayListExtra("submissionStudents"); + + // 生徒のリストを反復処理し、それをRecyclerViewに表示 + for (SubmissionStudent student : submissionStudents) { + students.add(student); + } + + // データが変更されたことをアダプターに通知 + submissionAdapter.notifyDataSetChanged(); +} +} + diff --git a/app/src/main/java/com/example/oplogy/SubmissionAdapter.java b/app/src/main/java/com/example/oplogy/SubmissionAdapter.java new file mode 100644 index 0000000..da80a5c --- /dev/null +++ b/app/src/main/java/com/example/oplogy/SubmissionAdapter.java @@ -0,0 +1,60 @@ +package com.example.oplogy; + +import android.graphics.Color; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import androidx.recyclerview.widget.RecyclerView; +import java.util.List; + +public class SubmissionAdapter extends RecyclerView.Adapter { + + private List students; + + public static class StudentViewHolder extends RecyclerView.ViewHolder { + public TextView studentNumberTextView; + public TextView statusTextView; + + public StudentViewHolder(View view) { + super(view); + studentNumberTextView = view.findViewById(R.id.studentNumberTextView); + statusTextView = view.findViewById(R.id.statusTextView); + } + } + + public SubmissionAdapter(List students) { + this.students = students; + } + + @Override + public StudentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.row_submission, parent, false); + return new StudentViewHolder(view); + } + + @Override +public void onBindViewHolder(StudentViewHolder holder, int position) { + SubmissionStudent student = students.get(position); + holder.studentNumberTextView.setText(String.valueOf(student.getStudentNumber())); + if (student.isSubmitted()) { + holder.statusTextView.setText("提出済み"); + holder.statusTextView.setBackgroundColor(Color.BLACK); + holder.statusTextView.setTextColor(Color.WHITE); + holder.studentNumberTextView.setBackgroundColor(Color.BLACK); + holder.studentNumberTextView.setTextColor(Color.WHITE); + } else { + holder.statusTextView.setText("未提出"); + holder.statusTextView.setBackgroundColor(Color.RED); + holder.statusTextView.setTextColor(Color.WHITE); + holder.studentNumberTextView.setBackgroundColor(Color.RED); + holder.studentNumberTextView.setTextColor(Color.WHITE); + } +} + + @Override + public int getItemCount() { + return students.size(); + } +} diff --git a/app/src/main/java/com/example/oplogy/SubmissionStudent.java b/app/src/main/java/com/example/oplogy/SubmissionStudent.java new file mode 100644 index 0000000..8ca3f6c --- /dev/null +++ b/app/src/main/java/com/example/oplogy/SubmissionStudent.java @@ -0,0 +1,49 @@ +package com.example.oplogy; +import android.os.Parcel; +import android.os.Parcelable; + +public class SubmissionStudent implements Parcelable { + private int studentNumber; + private boolean submitted; + + public SubmissionStudent(int studentNumber, boolean submitted) { + this.studentNumber = studentNumber; + this.submitted = submitted; + } + + protected SubmissionStudent(Parcel in) { + studentNumber = in.readInt(); + submitted = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public SubmissionStudent createFromParcel(Parcel in) { + return new SubmissionStudent(in); + } + + @Override + public SubmissionStudent[] newArray(int size) { + return new SubmissionStudent[size]; + } + }; + + public int getStudentNumber() { + return studentNumber; + } + + public boolean isSubmitted() { + return submitted; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeInt(studentNumber); + parcel.writeByte((byte) (submitted ? 1 : 0)); + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/row_submission.xml b/app/src/main/res/layout/row_submission.xml new file mode 100644 index 0000000..9298d4f --- /dev/null +++ b/app/src/main/res/layout/row_submission.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/submission.xml b/app/src/main/res/layout/submission.xml index d9cbc15..b65b6f5 100644 --- a/app/src/main/res/layout/submission.xml +++ b/app/src/main/res/layout/submission.xml @@ -1,9 +1,43 @@ - - \ No newline at end of file + + + + + + + + + +