diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 86843cb..e58179e 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -7,11 +7,11 @@ - + - + \ No newline at end of file diff --git a/app/src/main/java/com/example/nemophila/PostActivity.java b/app/src/main/java/com/example/nemophila/PostActivity.java index 36f7a4b..69db41e 100644 --- a/app/src/main/java/com/example/nemophila/PostActivity.java +++ b/app/src/main/java/com/example/nemophila/PostActivity.java @@ -2,38 +2,33 @@ import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; -import androidx.activity.result.contract.ActivityResultContract; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AppCompatActivity; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; -import android.app.Activity; import android.content.Intent; -import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; -import android.provider.MediaStore; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; import com.example.nemophila.entities.Account; -import com.example.nemophila.entities.Post; import com.example.nemophila.entities.Shop; -import com.example.nemophila.resources.ShopsRest; import com.example.nemophila.viewmodels.PostsViewModel; import com.example.nemophila.viewmodels.ShopsViewModel; import com.google.android.material.snackbar.Snackbar; -import java.io.IOException; -import java.util.Collection; -import java.util.Collections; +import java.nio.charset.StandardCharsets; +import java.util.Base64; import java.util.List; import retrofit2.Retrofit; @@ -48,24 +43,50 @@ private String comment; private String token; private String sid; - private String img1 = null; - private String img2 = null; - private String img3 = null; + private String[] img; private String shopName; + private ImageButton[] deleteButtons; + private ImageView[] postImages; + private List uriLists; private PostsViewModel postsViewModel; private ShopsViewModel shopsViewModel; - private Account account; - private Retrofit retrofit; private Nemophila nemophila; - private ActivityResultLauncher launcher = registerForActivityResult(new ActivityResultContracts.GetContent(), - new ActivityResultCallback() { - @Override - public void onActivityResult(Uri result) { + //画像挿入 + private ActivityResultLauncher launcher = registerForActivityResult(new ActivityResultContracts.OpenMultipleDocuments(), new ActivityResultCallback>() { + @Override + public void onActivityResult(List uriList) { + uriLists = uriList; - } - }); + postImages[0] = findViewById(R.id.imageView1); + postImages[1] = findViewById(R.id.imageView2); + postImages[2] = findViewById(R.id.imageView3); + + System.out.println(uriLists.get(0)); + +// for (int i = 0; i () { @Override public void onChanged(Shop shop) { System.out.println("店舗新規作成完了"); - postsViewModel.createPost(uid, token, shop.getSid(), rate, genre, comment, img1, img2, img3); + postsViewModel.createPost(uid, token, shop.getSid(), rate, genre, comment, img[0], img[1], img[2]); System.out.println("lat" + nemophila.getCurrentLatitude() + "\nlong" + nemophila.getCurrentLongitude()); @@ -220,12 +245,70 @@ selectPictureButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { // 画像選択(3枚) - launcher.launch("image/*"); + launcher.launch(new String[]{"image/*"}); } }); +// 写真の削除ボタン + deleteButtons[0]= (ImageButton) findViewById(R.id.deleteButton1); + deleteButtons[1]= (ImageButton) findViewById(R.id.deleteButton2); + deleteButtons[2]= (ImageButton) findViewById(R.id.deleteButton3); + + deleteButtons[0].setVisibility(View.INVISIBLE); + deleteButtons[1].setVisibility(View.INVISIBLE); + deleteButtons[2].setVisibility(View.INVISIBLE); + + deleteButtons[0].setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + postImages[0].setImageURI(null); + uriLists.set(0, null); +// uriLists.remove(1); + System.out.println("削除ボタン1"); + for (int i = 0; i < postImages.length-1; i++){ + postImages[i].setImageURI(uriLists.get(i+1)); +// postImages[i].setImageURI(uriList.get(i)); + postImages[i+1].setImageURI(null); +// uriLists.remove(i); + uriLists.set(i+1, null); +// postImages[i+1] = null; + System.out.println(uriLists.get(i)); + if (uriLists.get(i) == null){ + deleteButtons[i].setVisibility(View.INVISIBLE); + } + } + } + }); + + deleteButtons[1].setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + postImages[1].setImageURI(null); + uriLists.set(1, null); +// postImages[1] = null; + System.out.println("削除ボタン2"); + for (int i = 1; i < postImages.length-1; i++){ + postImages[i].setImageURI(uriLists.get(i+1)); + postImages[i+1].setImageURI(null); +// postImages[i+1] = null; + if (uriLists.get(i)==null){ + deleteButtons[i].setVisibility(View.INVISIBLE); + } + } + } + }); + + deleteButtons[2].setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + postImages[2].setImageURI(null); + + System.out.println("削除ボタン3"); + deleteButtons[2].setVisibility(View.INVISIBLE); + } + }); //投稿ボタンの処理 Button postButton = (Button)findViewById(R.id.postButton); @@ -246,7 +329,7 @@ if (shop == null) { shopsViewModel.createShop(shopName, nemophila.getCurrentLongitude(), nemophila.getCurrentLatitude()); } else { - postsViewModel.createPost(uid, token, sid, rate, genre, comment, img1, img2, img3); + postsViewModel.createPost(uid, token, sid, rate, genre, comment, img[0], img[1], img[2]); System.out.println("既存店舗に投稿"); System.out.println("lat" + nemophila.getCurrentLatitude() + "\nlong" + nemophila.getCurrentLongitude()); diff --git a/app/src/main/java/com/example/nemophila/RequestingActivity.java b/app/src/main/java/com/example/nemophila/RequestingActivity.java index 763a39b..78a3ec8 100644 --- a/app/src/main/java/com/example/nemophila/RequestingActivity.java +++ b/app/src/main/java/com/example/nemophila/RequestingActivity.java @@ -65,63 +65,64 @@ //フレンド検索ボタン Button requestingButton = (Button)findViewById(R.id.requestingSearchButton); requestingButton.setOnClickListener(new View.OnClickListener(){ + @Override public void onClick(View v){ //入力されたIDを取得 EditText editSearchId = (EditText) findViewById(R.id.inputRequestingId); searchingId = editSearchId.getText().toString(); - - //エラーコードを購読 - friendViewModel.getErrorLiveData().observe(RequestingActivity.this, new Observer() { - @Override - public void onChanged(String error) { - - if (error == ErrorType.ResponseError.getText()) { - new AlertDialog.Builder(RequestingActivity.this) - .setTitle("既にフレンド、申請を受けているなどの理由で申請できません") - .setPositiveButton("OK", null) - .create() - .show(); - } - } - }); - - //取得したIDからアカウントを読み込んでおく + //取得したIDからアカウントを読み込み、検索用LiveDataのonChangeへ accountViewModel.fetchAccount(searchingId); - //検索用LiveDataへの購読 - accountViewModel.getAccountLiveData().observe(RequestingActivity.this, new Observer() { - - //ViewModelからアカウントが返ってくれば(データ変更があれば)実行 - @Override - public void onChanged(Account user) { - - if (user == null) { - new AlertDialog.Builder(RequestingActivity.this) - .setTitle("IDが間違っています") - .setPositiveButton("OK", null) - .create() - .show(); - } else { - requestingName = (user.getName()); - -// //申請を送るダイアログ -//// RequestingDialogFragment dialog = new RequestingDialogFragment(); -// //名前を渡す -// Bundle args = new Bundle(); -// args.putString("message", requestingName); -// dialog.setArguments(args); -// -// //ダイアログの表示 -// dialog.show(getSupportFragmentManager(), "Requesting_dialog"); -// //OK押したら申請するメソッドにuid、requestingId、tokenを渡す - } - } - }); - - } //onClick終わり - + } }); + //検索用LiveDataへの購読 + accountViewModel.getAccountLiveData().observe(RequestingActivity.this, new Observer() { + + //ViewModelから検索結果が返ってくれば(データ変更があれば)実行 + @Override + public void onChanged(Account user) { + + if (user == null) { + new AlertDialog.Builder(RequestingActivity.this) + .setTitle("IDが間違っています") + .setPositiveButton("OK", null) + .create() + .show(); + } else { + requestingName = (user.getName()); + + //申請を送るダイアログ + RequestingDialogFragment dialog = new RequestingDialogFragment(RequestingActivity.this); + //名前を渡す + Bundle args = new Bundle(); + args.putString("message", requestingName); + dialog.setArguments(args); + + //ダイアログの表示 + dialog.show(getSupportFragmentManager(), "Requesting_dialog"); + //OK押したら申請するメソッドにuid、requestingId、tokenを渡す + } + } + }); + + //FriendViewModelの初期化 + friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); + + //エラーコードを購読 + friendViewModel.getErrorLiveData().observe(RequestingActivity.this, new Observer() { + @Override + public void onChanged(String error) { + + if (error == ErrorType.ResponseError.getText()) { + new AlertDialog.Builder(RequestingActivity.this) + .setTitle("既にフレンド、申請を受けているなどの理由で申請できません") + .setPositiveButton("OK", null) + .create() + .show(); + } + } + }); //RecyclerView(表示の設定、直接表示するところはLivedataを購読しているonChanged内に) List requestingDataList = new ArrayList<>(); @@ -172,13 +173,16 @@ requestingDataList.clear(); //受け取ったLivedataの要素分繰り返し、セット for (AccountNameJson user: requestingUsers) { - //dataを宣言 dataに投稿の必要なデータをセットし、それをpostsDatasetに追加してリストを作る + //申請先1人に必要な情報をセットするdataを宣言 RequestingDataModel data = new RequestingDataModel(); + //dataをpostsDatasetに追加してリストを作る data.setName(user.getName()); data.setId(user.getUid()); - //申請先一つの情報がdataに全部セットされたらDatasetに追加 - requestingDataList.add(0, data); + //申請先一つの情報がdataに全部セットされたらDatasetに追加 重複していたら追加しない + if(!(requestingDataList.contains(data))) { + requestingDataList.add(0, data); + } } //onChange内に書くべき表示部分 diff --git a/app/src/main/java/com/example/nemophila/TestActivity.java b/app/src/main/java/com/example/nemophila/TestActivity.java index 3ff993a..c9734de 100644 --- a/app/src/main/java/com/example/nemophila/TestActivity.java +++ b/app/src/main/java/com/example/nemophila/TestActivity.java @@ -3,12 +3,15 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.lifecycle.ViewModelProvider; +import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; +import android.widget.ImageView; import android.widget.Spinner; import com.example.nemophila.viewmodels.AccountViewModel; @@ -16,6 +19,8 @@ import com.example.nemophila.viewmodels.PostsViewModel; import com.example.nemophila.viewmodels.ShopsViewModel; +import java.util.Base64; + public class TestActivity extends AppCompatActivity { int position; @@ -62,7 +67,13 @@ // shopsViewModel.start(500, nemophila); break; case 1: - accountViewModel.getAccountPosts("1111"); + //accountViewModel.getAccountPosts("1111"); + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); + String s = "Y29udGVudDovL2NvbS5hbmRyb2lkLnByb3ZpZGVycy5tZWRpYS5kb2N1bWVudHMvZG9jdW1lbnQvaW1hZ2UlM0EzNA=="; + s = new String(Base64.getDecoder().decode(s)); + Uri uri = Uri.parse(s); + ImageView imageView = findViewById(R.id.imageView4); + imageView.setImageURI(uri); break; case 2: postsViewModel.createPost("1114", "dbfd3740-8dcc-4b9c-b3b0-42c908da1c65", "151347fa-2c90-44d7-ba48-f23f475b910d", 1, diff --git a/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java b/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java index 300fbe7..207f837 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java @@ -7,6 +7,7 @@ import com.example.nemophila.entities.Account; import com.example.nemophila.entities.AccountJson; import com.example.nemophila.entities.AccountNameJson; +import com.example.nemophila.entities.ErrorType; import com.example.nemophila.entities.Post; import com.example.nemophila.entities.PostJson; import com.example.nemophila.resources.AccountsRest; @@ -35,6 +36,7 @@ private final MutableLiveData> accountPostsLiveData; private final MutableLiveData pwErrorLiveData; private final MutableLiveData accountLiveData; + private final MutableLiveData errorLiveData; // コンストラクタ public AccountViewModel() { @@ -48,6 +50,7 @@ this.accountPostsLiveData = new MutableLiveData<>(); this.pwErrorLiveData = new MutableLiveData<>(); this.accountLiveData = new MutableLiveData<>(); + this.errorLiveData = new MutableLiveData<>(); } // ライブデータの取得(ゲッター) @@ -64,6 +67,9 @@ public MutableLiveData getAccountLiveData() { return accountLiveData; } + public MutableLiveData getErrorLiveData() { + return errorLiveData; + } // 対象のアカウント情報の削除 public void deleteAccount(String uid, String token) { @@ -242,4 +248,17 @@ } accountPostsLiveData.setValue(preData); } + + private String parseStatusCode(Integer stats) { + switch (stats) { + case 404: + return ErrorType.ResponseNoyFound.getText(); + case 401: + return ErrorType.InvalidToken.getText(); + case 400: + return ErrorType.ResponseError.getText(); + default: + return ErrorType.UnknownError.getText(); + } + } } diff --git a/app/src/main/java/com/example/nemophila/viewmodels/FriendViewModel.java b/app/src/main/java/com/example/nemophila/viewmodels/FriendViewModel.java index 6a5f9f7..8f3dc95 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/FriendViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/FriendViewModel.java @@ -238,7 +238,7 @@ preData.add(anj); } preData.add(createAccountNameJson(uid, name)); - requestedLiveData.setValue(preData); + requestingLiveData.setValue(preData); } private void removeFriendLiveData(String id) { diff --git a/app/src/main/java/com/example/nemophila/viewmodels/PostsViewModel.java b/app/src/main/java/com/example/nemophila/viewmodels/PostsViewModel.java index 2985f6a..9229454 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/PostsViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/PostsViewModel.java @@ -4,6 +4,7 @@ import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; +import com.example.nemophila.entities.ErrorType; import com.example.nemophila.entities.Post; import com.example.nemophila.entities.PostJson; import com.example.nemophila.resources.PostsRest; @@ -26,6 +27,7 @@ //LiveData final private MutableLiveData> accountPostsLiveData; final private MutableLiveData> shopPostsLiveData; + private final MutableLiveData errorLiveData; //コンストラクタ public PostsViewModel() { @@ -36,6 +38,7 @@ .addConverterFactory(JacksonConverterFactory.create()) .build(); this.postsRest = retrofit.create(PostsRest.class); + this.errorLiveData = new MutableLiveData<>(); } //getter @@ -45,6 +48,9 @@ public LiveData> getShopPostLiveData() { return this.shopPostsLiveData; } + public MutableLiveData getErrorLiveData() { + return errorLiveData; + } //AccountのpostJsonを取得 @@ -57,12 +63,14 @@ setAccountPostLiveData(response.body()); } else { System.out.println("AccountPosts ResponseError"); + errorLiveData.setValue(parseStatusCode(response.code())); } } @Override public void onFailure(Call> call, Throwable t) { System.out.println("AccountPosts NetWorkError: " + t); + errorLiveData.setValue(ErrorType.NetworkError.getText()); } }); } @@ -88,12 +96,14 @@ setShopPostLiveData(postJson); } else { System.out.println("ShopPosts ResponseError"); + errorLiveData.setValue(parseStatusCode(response.code())); } } @Override public void onFailure(Call> call, Throwable t) { System.out.println("ShopPosts NetWorkError: " + t); + errorLiveData.setValue(ErrorType.NetworkError.getText()); } }); } @@ -120,12 +130,14 @@ System.out.println("Success CreatePost" + response.body()); } else { System.out.println("CreatePosts ResponseError"); + errorLiveData.setValue(parseStatusCode(response.code())); } } @Override public void onFailure(Call call, Throwable t) { System.out.println("CreatePosts NetWorkError: " + t); + errorLiveData.setValue(ErrorType.NetworkError.getText()); } }); } @@ -137,4 +149,17 @@ } return ids; } + + private String parseStatusCode(Integer stats) { + switch (stats) { + case 404: + return ErrorType.ResponseNoyFound.getText(); + case 401: + return ErrorType.InvalidToken.getText(); + case 400: + return ErrorType.ResponseError.getText(); + default: + return ErrorType.UnknownError.getText(); + } + } } diff --git a/app/src/main/java/com/example/nemophila/viewmodels/ShopsViewModel.java b/app/src/main/java/com/example/nemophila/viewmodels/ShopsViewModel.java index c31459d..da09614 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/ShopsViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/ShopsViewModel.java @@ -4,6 +4,7 @@ import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; +import com.example.nemophila.entities.ErrorType; import com.example.nemophila.entities.Shop; import com.example.nemophila.resources.ShopsRest; import com.google.android.gms.maps.model.Marker; @@ -37,6 +38,7 @@ final private MutableLiveData> shopsLiveData; final private MutableLiveData> nearShopsLiveData; final private MutableLiveData currentShopLiveData; + private final MutableLiveData errorLiveData; // コンストラクタ public ShopsViewModel() { @@ -49,6 +51,7 @@ .build(); this.shopsRest = retrofit.create(ShopsRest.class); this.ShopToMarker = new HashMap<>(); + this.errorLiveData = new MutableLiveData<>(); } // ライブデータを返す @@ -59,6 +62,9 @@ public LiveData getCurrentLiveData() { return this.currentShopLiveData; } + public MutableLiveData getErrorLiveData() { + return errorLiveData; + } // ShopToMarkerに新しく店と地図上のピンを紐づける public void setShopAndMarker(Shop shop, Marker marker) { @@ -173,4 +179,17 @@ } }); } + + private String parseStatusCode(Integer stats) { + switch (stats) { + case 404: + return ErrorType.ResponseNoyFound.getText(); + case 401: + return ErrorType.InvalidToken.getText(); + case 400: + return ErrorType.ResponseError.getText(); + default: + return ErrorType.UnknownError.getText(); + } + } } diff --git a/app/src/main/res/layout/activity_post.xml b/app/src/main/res/layout/activity_post.xml index 5bf628c..2e6fd2c 100644 --- a/app/src/main/res/layout/activity_post.xml +++ b/app/src/main/res/layout/activity_post.xml @@ -6,6 +6,7 @@ android:layout_height="match_parent" tools:context=".PostActivity"> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_test.xml b/app/src/main/res/layout/activity_test.xml index 6dc8dde..c119366 100644 --- a/app/src/main/res/layout/activity_test.xml +++ b/app/src/main/res/layout/activity_test.xml @@ -26,4 +26,14 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.149" /> + + \ No newline at end of file