diff --git a/app/src/main/java/com/example/oplogy/CreateUUID.java b/app/src/main/java/com/example/oplogy/CreateUUID.java index 84904b0..08686e6 100644 --- a/app/src/main/java/com/example/oplogy/CreateUUID.java +++ b/app/src/main/java/com/example/oplogy/CreateUUID.java @@ -5,12 +5,12 @@ import java.util.List; public class CreateUUID { - public static int generateUUID(List classIdList ){ - while (true){ - int uuidInt = (int)(Math.random() * 1000000); + public static int generateUUID(List classIdList) { + while (true) { + int uuidInt = (int) (Math.random() * 1000000); boolean isDuplicate = false; - for(int classIdInt : classIdList){ - if(classIdInt==uuidInt){ + for (int classIdInt : classIdList) { + if (classIdInt == uuidInt) { //重複があればフラグを立て、ループを抜ける isDuplicate = true; break; @@ -22,7 +22,7 @@ public class CreateUUID { InsertClassIdforFirebase insertClassIdforFirebase = new InsertClassIdforFirebase(); insertClassIdforFirebase.insertClassId(uuidInt); //テスト用 - uuidInt=100; + uuidInt = 100; return uuidInt; } } diff --git a/app/src/main/java/com/example/oplogy/FirestoreReception.java b/app/src/main/java/com/example/oplogy/FirestoreReception.java index aa0cf68..0d69f20 100644 --- a/app/src/main/java/com/example/oplogy/FirestoreReception.java +++ b/app/src/main/java/com/example/oplogy/FirestoreReception.java @@ -16,19 +16,18 @@ import java.util.Map; public class FirestoreReception { + //firestoreから受け取ったデータを束ねるためのマップ + public List myDataList = new ArrayList<>(); private FirebaseFirestore db; public FirestoreReception() { db = FirebaseFirestore.getInstance(); } - //firestoreから受け取ったデータを束ねるためのマップ - public List myDataList = new ArrayList<>(); - //ClassIdを引数にデータの作成を行う public void getDocumentsByClassId(int classId) { myDataList.clear(); - CollectionReference collectionRef = db.collection("testAddressArray"); + CollectionReference collectionRef = db.collection("testDistinct"); // classIdが引数のものを取得する collectionRef.whereEqualTo("classId", classId).get() diff --git a/app/src/main/java/com/example/oplogy/MainActivity.java b/app/src/main/java/com/example/oplogy/MainActivity.java index f32da49..fa0f5d6 100644 --- a/app/src/main/java/com/example/oplogy/MainActivity.java +++ b/app/src/main/java/com/example/oplogy/MainActivity.java @@ -19,6 +19,7 @@ import com.google.gson.Gson; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -85,7 +86,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe // firestoreの受信関連 db = FirebaseFirestore.getInstance(); firestoreReception = new FirestoreReception(); - Log.d("MainActivity","geocodeAddress"); + Log.d("MainActivity", "geocodeAddress"); ExecutorService executor = Executors.newSingleThreadExecutor(); @@ -105,7 +106,6 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe } - // クリック処理 @Override public void onClick(View view) { @@ -136,51 +136,65 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe // ルート作成のクリック処理 if (view == root) { imageRoot.setImageResource(R.drawable.pin); - fetchDataAndCreateRoute(); - + checkSetupAndCreateRoute(this::fetchDataAndCreateRoute); } if (view == imageRoot) { imageRoot.setImageResource(R.drawable.pin); - fetchDataAndCreateRoute(); + checkSetupAndCreateRoute(this::fetchDataAndCreateRoute); } // 提出状況のクリック処理 if (view == submission) { - ArrayList submissionStudents = getSubmissionStudents(); - Intent toSubmission = new Intent(MainActivity.this, SubmissionActivity.class); - toSubmission.putParcelableArrayListExtra("submissionStudents", submissionStudents); - startActivity(toSubmission); + checkSetupAndCreateRoute(() -> { + ArrayList submissionStudents = getSubmissionStudents(); + Intent toSubmission = new Intent(MainActivity.this, SubmissionActivity.class); + toSubmission.putParcelableArrayListExtra("submissionStudents", submissionStudents); + startActivity(toSubmission); + }); } if (view == imageSubmission) { - ArrayList submissionStudents = getSubmissionStudents(); - Intent toSubmission = new Intent(MainActivity.this, SubmissionActivity.class); - toSubmission.putParcelableArrayListExtra("submissionStudents", submissionStudents); - startActivity(toSubmission); + checkSetupAndCreateRoute(() -> { + ArrayList submissionStudents = getSubmissionStudents(); + Intent toSubmission = new Intent(MainActivity.this, SubmissionActivity.class); + toSubmission.putParcelableArrayListExtra("submissionStudents", submissionStudents); + startActivity(toSubmission); + }); } } - //UUIDを表示するかのダイアログ + //ID作成、表示に関する処理 private void showUUIDYesNoDialog() { firestoreReception_classIdDatabase = new FirestoreReception_classIdDatabase(); List classIdList = firestoreReception_classIdDatabase.getAllDocumentsFromClassIdDatabase(); AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("クラスID"); - builder.setMessage("あなたのクラスIDを表示しますか?"); + builder.setTitle("ID"); + builder.setMessage("あなたのIDを表示/もしくは新規で作成しますか?"); - builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { + //作成処理 + builder.setPositiveButton("作成", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { classId = CreateUUID.generateUUID(classIdList); - Toast.makeText(MainActivity.this, "クラスID: " + classId, Toast.LENGTH_SHORT).show(); - imageUuid.setImageResource(R.drawable.checked_image); + // 生成されたIDを表示するメソッド + showClassIdDialog("生成されたID", classId); } }); - builder.setNegativeButton("No", new DialogInterface.OnClickListener() { + //表示処理 + builder.setNegativeButton("表示", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - Log.d("DialogNO", "DialogでNoが選ばれました"); - imageUuid.setImageResource(R.drawable.checked_image); + //roomを扱うため非同期処理 + ExecutorService executor = Executors.newSingleThreadExecutor(); + executor.execute(() -> { + // 現在のクラスIDを取得 + int currentClassId = getCurrentClassIdFromRoom(); + runOnUiThread(() -> { + // 現在のクラスIDを表示するダイアログ + showClassIdDialog("現在のID", currentClassId); + }); + }); + executor.shutdown(); } }); @@ -189,12 +203,86 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe } + private int getCurrentClassIdFromRoom() { + AppDatabase db = getDatabaseInstance(); + SetUpTableDao setUpTableDao = db.setUpTableDao(); + + // 現在のクラスIDを取得 + return setUpTableDao.getClassId(); + } + + //クラスIDを表示するダイアログ + private void showClassIdDialog(String title, int classId) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(title); + builder.setMessage("ID: " + classId); + builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + AlertDialog dialog = builder.create(); + dialog.show(); + } + + + //ルート作成、提出状況の遷移を行う前のチェックを行う処理 + private void checkSetupAndCreateRoute(Runnable onSetupComplete) { + if (isClassIdSet()) { + isSetupExists(classId).thenAccept(setupExists -> { + if (setupExists) { + runOnUiThread(onSetupComplete); + } else { + runOnUiThread(() -> { + Toast.makeText(this, "先にセットアップを済ませてください", Toast.LENGTH_LONG).show(); + }); + } + }).exceptionally(ex -> { + ex.printStackTrace(); + runOnUiThread(() -> { + Toast.makeText(this, "エラーが発生しました", Toast.LENGTH_LONG).show(); + }); + return null; + }); + } else { + Toast.makeText(this, "先にIDの作成を行ってください", Toast.LENGTH_LONG).show(); + } + } + + // クラスIDが設定されているかどうかを判定 + private boolean isClassIdSet() { + // classIdが0より大きい場合、trueを返す + return classId > 0; + } + + // セットアップが存在するかどうかを判定 + private CompletableFuture isSetupExists(int classId) { + final ExecutorService executorService = Executors.newSingleThreadExecutor(); + return CompletableFuture.supplyAsync(() -> { + AppDatabase db = getDatabaseInstance(); + SetUpTableDao setUpTableDao = db.setUpTableDao(); + //データベースの値を全取得 + List checkData = setUpTableDao.getAll(); + for (SetUpTable setUpTable : checkData) { + //SetUpTableのclassIdと引数のclassIdが一致する場合、trueを返す + if (setUpTable.classId == classId) { + return true; + } + } + return false; + //処理完了時にexecutorServiceをシャットダウン + }, executorService).whenComplete((result, throwable) -> executorService.shutdown()); + } + + //ルート作成の非同期処理 private void fetchDataAndCreateRoute() { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(() -> { - AppDatabase db = getDatabaseInstance(); SetUpTableDao setUpTableDao = db.setUpTableDao(); + AppDatabase db = getDatabaseInstance(); + SetUpTableDao setUpTableDao = db.setUpTableDao(); int totalStudentInt = setUpTableDao.getTotalStudent(); int myDataListSizeInt = firestoreReception.getMyDataListSize(); @@ -245,10 +333,10 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe //final宣言することによって、スレッドセーフになる(ラムダ式内で使えるようにする) final List finalMyDataList = myDataList; CreateSchedule createSchedule = new CreateSchedule(MainActivity.this); - String startPointLatLngString = createSchedule.receiveData(myDataList, getApplicationContext()); + String startPointLatLngString = createSchedule.receiveData(myDataList, getApplicationContext()); runOnUiThread(() -> { - if ( !startPointLatLngString.equals("")) { + if (!startPointLatLngString.equals("")) { Log.d("MainActivity", "スケジュール作成成功"); saveMyDataList(finalMyDataList); Intent toRoot = new Intent(MainActivity.this, Maps.class); @@ -264,6 +352,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe executor.shutdown(); }); } + private void saveMyDataList(List myDataList) { // 共有プリファレンスのインスタンスを取得 SharedPreferences sharedPreferences = getSharedPreferences("MyDataList", MODE_PRIVATE); @@ -307,7 +396,6 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe } - //提出状況の取得 private ArrayList getSubmissionStudents() { ArrayList submissionStudents = new ArrayList<>();