diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index ae388c2..cb865f6 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -4,8 +4,6 @@
+
diff --git a/app/src/main/java/com/example/oplogy/MainActivity.java b/app/src/main/java/com/example/oplogy/MainActivity.java
index fea01fa..26ed954 100644
--- a/app/src/main/java/com/example/oplogy/MainActivity.java
+++ b/app/src/main/java/com/example/oplogy/MainActivity.java
@@ -15,12 +15,16 @@ 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;
import java.util.concurrent.Executors;
-public class MainActivity extends AppCompatActivity implements View.OnClickListener {
+public class MainActivity extends AppCompatActivity implements View.OnClickListener{
+
+ // ダイアログの宣言
+ private AlertDialog alertDialog;
// ID作成のTextViewとImageView
private TextView creatUUID;
@@ -81,126 +85,67 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
}
- // クリック処理
+// クリック処理
@Override
public void onClick(View view) {
// ID作成のクリック処理
- if (view == creatUUID) {
+ if(view == creatUUID){
imageUuid.setImageResource(R.drawable.ischecked_uuid);
showUUIDYesNoDialog();//UUIDを表示するかのダイアログ
- finish(); // 画面遷移後元の状態に戻す
}
- if (view == imageUuid) {
+ if(view == imageUuid){
imageUuid.setImageResource(R.drawable.ischecked_uuid);
showUUIDYesNoDialog();//UUIDを表示するかのダイアログ
- finish();
}
// セットアップのクリック処理
- if (view == setUp) {
+ if(view == setUp){
imageSetup.setImageResource(R.drawable.ischecked_uuid);
- Intent toSetup = new Intent(MainActivity.this, SetUpActivity.class);
+ Intent toSetup = new Intent(MainActivity.this,SetUpActivity.class);
startActivity(toSetup);
finish(); // 画面遷移後元の状態に戻す
}
- if (view == imageSetup) {
+ if (view == imageSetup){
imageSetup.setImageResource(R.drawable.ischecked_uuid);
- Intent toSetup = new Intent(MainActivity.this, SetUpActivity.class);
+ Intent toSetup = new Intent(MainActivity.this,SetUpActivity.class);
startActivity(toSetup);
finish(); // 画面遷移後元の状態に戻す
}
// ルート作成のクリック処理
- if (view == root) {
+ if(view == root){
imageRoot.setImageResource(R.drawable.pin);
- ExecutorService executor = Executors.newSingleThreadExecutor();
+ fetchDataAndCreateRoute();
- 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 = null;
- while (myDataList == null) {
- myDataList = firestoreReception.getMyDataList();
- try {
- Thread.sleep(3000);
- Log.d("MainActivity","myDataList"+ myDataList.size());
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
- Log.d("MainActivity","myDataList"+ myDataList.size());
- CreateRoot createRoot = new CreateRoot(MainActivity.this);
- Boolean notDuplicates=createRoot.receiveData(myDataList);
- latch.countDown();
-
- if(notDuplicates){
- Log.d("MainActivity","スケジュール作成成功");
- }else{
- showErrorDialog(latch);
- }
- });
-
- 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();
}
- if (view == imageRoot) {
+ if(view == imageRoot){
imageRoot.setImageResource(R.drawable.pin);
- Intent toRoot = new Intent(MainActivity.this, Maps.class);
- startActivity(toRoot);
+ fetchDataAndCreateRoute();
}
// 提出状況のクリック処理
- if (view == submission) {
+ if(view == submission){
+ ArrayList submissionStudents = getSubmissionStudents();
Intent toSubmission = new Intent(MainActivity.this, SubmissionActivity.class);
+ toSubmission.putParcelableArrayListExtra("submissionStudents", submissionStudents);
startActivity(toSubmission);
}
- if (view == imageSubmission) {
+ if(view == imageSubmission){
+ ArrayList submissionStudents = getSubmissionStudents();
Intent toSubmission = new Intent(MainActivity.this, SubmissionActivity.class);
+ toSubmission.putParcelableArrayListExtra("submissionStudents", submissionStudents);
startActivity(toSubmission);
}
}
-
+ //UUIDを表示するかのダイアログ
private void showUUIDYesNoDialog() {
- //ダイアログの表示
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ AlertDialog.Builder builder = new AlertDialog.Builder(this); // この 'this' が問題でないか確認
builder.setTitle("クラスID");
builder.setMessage("あなたのクラスIDを表示しますか?");
- //YESのときは初回はUUIDを生成、表示
- //二回目以降は保存されたUUIDを表示
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- String classId = CreateUUID.generateUUID();//classIDにuuidが入ってる
- Toast.makeText(MainActivity.this, "クラスID: " + classId, Toast.LENGTH_SHORT).show();//テスト用
+ String classId = CreateUUID.generateUUID();
+ Toast.makeText(MainActivity.this, "クラスID: " + classId, Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
@@ -209,9 +154,59 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
Log.d("DialogNO", "DialogでNoが選ばれました");
}
});
- builder.show();
- }
+ alertDialog = builder.create();
+ alertDialog.show();
+
+ }
+ //ルート作成の非同期処理
+ private void fetchDataAndCreateRoute() {
+ //非同期処理の開始
+ ExecutorService executor = Executors.newSingleThreadExecutor();
+
+ 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)
@@ -222,7 +217,6 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
public void onClick(DialogInterface dialog, int which) {
latch.countDown();
}
-
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
@@ -233,23 +227,56 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
.show();
}
- public void showErrorDialog(CountDownLatch latch) {
- new AlertDialog.Builder(MainActivity.this)
- .setTitle("警告")
- .setMessage("保護者の重複が重大でルート作成ができません。調整してください")
- .setPositiveButton("OK", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- latch.countDown();
- }
- })
- .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- }
- })
- .show();
+ //Main
+ 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;
}
-}
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (alertDialog != null && alertDialog.isShowing()) {
+ alertDialog.dismiss();
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/oplogy/SetUpActivity.java b/app/src/main/java/com/example/oplogy/SetUpActivity.java
index 5af3244..2dd4bdb 100644
--- a/app/src/main/java/com/example/oplogy/SetUpActivity.java
+++ b/app/src/main/java/com/example/oplogy/SetUpActivity.java
@@ -127,7 +127,6 @@ public class SetUpActivity extends FragmentActivity
AppDatabase.class,
"SetUpTable"
)
- .fallbackToDestructiveMigration()
.build();
SetUpTableDao setUpTableDao = db.setUpTableDao();
// Roomの操作を行う
diff --git a/app/src/main/java/com/example/oplogy/SubmissionActivity.java b/app/src/main/java/com/example/oplogy/SubmissionActivity.java
index c6e2d7f..089c81a 100644
--- a/app/src/main/java/com/example/oplogy/SubmissionActivity.java
+++ b/app/src/main/java/com/example/oplogy/SubmissionActivity.java
@@ -1,14 +1,58 @@
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..dd121b6
--- /dev/null
+++ b/app/src/main/java/com/example/oplogy/SubmissionAdapter.java
@@ -0,0 +1,62 @@
+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);
+ // レイアウトファイルのTextViewを取得
+ 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
+
+
+
+
+
+
+
+
+
+