diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index e69de29..e58179e 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index c94d993..31863cb 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -17,8 +17,9 @@ - + + diff --git a/app/src/main/java/com/example/nemophila/FriendActivity.java b/app/src/main/java/com/example/nemophila/FriendActivity.java index 22a0002..0c9f2bb 100644 --- a/app/src/main/java/com/example/nemophila/FriendActivity.java +++ b/app/src/main/java/com/example/nemophila/FriendActivity.java @@ -2,6 +2,7 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; +import androidx.constraintlayout.widget.ConstraintLayout; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.DividerItemDecoration; @@ -38,299 +39,216 @@ public class FriendActivity extends AppCompatActivity { private Nemophila nemophila; + FriendViewModel friendViewModel; + String uid; + String token; + String requestingId; + String requestingName; + String searchingId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_friend); -// // 初期化 -// List friendsDataset = new ArrayList<>(); // 1行分の情報を持つDataModelを格納するリスト -// RecyclerView rv = findViewById(R.id.friendsList); // recyclerViewを取得 -// FriendViewModel friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); // ViewModelを取得 -// nemophila = (Nemophila) this.getApplication(); -// -// -// //一行ずつを縦に(LinearLayout)表示するLayoutManagerを宣言 -// LinearLayoutManager llm = new LinearLayoutManager(this); -// -// // データ1つ1つの区切りが分かるように線を引く -// RecyclerView.ItemDecoration itemDecoration = -// new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); -// rv.addItemDecoration(itemDecoration); -// rv.setHasFixedSize(true); -// rv.setLayoutManager(llm); -// -// String myUid = nemophila.getUid(); // 自身のidを取得 -// String myToken = nemophila.getToken(); // 自身のtokenを取得 -// // getFriendsの通信が呼び出されて、フレンドの一覧をfriendsDatasetに格納し、Adapterにセットする -// FriendActivityAdapter adapter = new FriendActivityAdapter(friendsDataset) { -// @Override -// void onDeleteClick(View view, int position, FriendDataModel friend) { -// new AlertDialog.Builder(FriendActivity.this) -// .setTitle("フレンドから" + friend.getName() + "を削除しますか?") -// .setPositiveButton("OK", new DialogInterface.OnClickListener() { -// @Override -// public void onClick(DialogInterface dialog, int which) { -// friendViewModel.deleteFriend(myUid, friend.getId(), myToken); -// } -// }) -// .setNegativeButton("キャンセル", null) -// .create() -// .show(); -// } -// -// @Override -// void onFavoriteClick(View view, int position, FriendDataModel friend, ImageView favorite) { -// if (favorite.getVisibility() == View.INVISIBLE) { -// favorite.setVisibility(View.VISIBLE); -// nemophila.setFavoriteFriends(friend.getId()); -// } else { -// favorite.setVisibility(View.INVISIBLE); -// nemophila.removeFavoriteFriends(friend.getId()); -// System.out.println(nemophila.getFavoriteFriends()); -// } -// } -// }; -// friendViewModel.getFriends(myUid); // 自身のフレンドの一覧を取得するメソッドを呼び出す -// -// friendViewModel.getFriendsLiveData().observe(this, new Observer>() { -// @Override -// public void onChanged(Collection friends) { -// // 以前のデータが残っていると不都合なので、空にしておく -// friendsDataset.clear(); -// -// for (AccountNameJson friend : friends) { -// FriendDataModel data = new FriendDataModel(); -// data.setName(friend.getName()); -// data.setId(friend.getUid()); -// friendsDataset.add(data); -// } -// -// adapter.setList(friendsDataset); -// rv.setAdapter(adapter); -// } -// }); + Button showFriend = findViewById(R.id.showFriend); + Button showRequesting = findViewById(R.id.showRequesting); + RecyclerView friendRecyclerView = findViewById(R.id.friendsList); + ConstraintLayout requestingConstraintLayout = findViewById(R.id.requestingLayout); - Button showDialog = findViewById(R.id.showDialog); - showDialog.setOnClickListener(v -> { - // 任意の大きさでダイアログを生成 - Dialog dialog = new Dialog(this); - dialog.setContentView(R.layout.layout_friend_dialog); - dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); - - // 初期化 - List friendsDataset = new ArrayList<>(); // 1行分の情報を持つDataModelを格納するリスト - RecyclerView rv = dialog.findViewById(R.id.friendsList); // recyclerViewを取得 - FriendViewModel friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); // ViewModelを取得 - nemophila = (Nemophila) this.getApplication(); - - - //一行ずつを縦に(LinearLayout)表示するLayoutManagerを宣言 - LinearLayoutManager llm = new LinearLayoutManager(this); - - // データ1つ1つの区切りが分かるように線を引く - RecyclerView.ItemDecoration itemDecoration = - new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); - rv.addItemDecoration(itemDecoration); - rv.setHasFixedSize(true); - rv.setLayoutManager(llm); - - String myUid = nemophila.getUid(); // 自身のidを取得 - String myToken = nemophila.getToken(); // 自身のtokenを取得 - // getFriendsの通信が呼び出されて、フレンドの一覧をfriendsDatasetに格納し、Adapterにセットする - FriendActivityAdapter adapter = new FriendActivityAdapter(friendsDataset) { - @Override - void onDeleteClick(View view, int position, FriendDataModel friend) { - new AlertDialog.Builder(FriendActivity.this) - .setTitle("フレンドから" + friend.getName() + "を削除しますか?") - .setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - friendViewModel.deleteFriend(myUid, friend.getId(), myToken); - } - }) - .setNegativeButton("キャンセル", null) - .create() - .show(); - } - - @Override - void onFavoriteClick(View view, int position, FriendDataModel friend, ImageView favorite) { - if (favorite.getVisibility() == View.INVISIBLE) { - favorite.setVisibility(View.VISIBLE); - nemophila.setFavoriteFriends(friend.getId()); - } else { - favorite.setVisibility(View.INVISIBLE); - nemophila.removeFavoriteFriends(friend.getId()); - System.out.println(nemophila.getFavoriteFriends()); - } - } - }; - friendViewModel.getFriends(myUid); // 自身のフレンドの一覧を取得するメソッドを呼び出す - - friendViewModel.getFriendsLiveData().observe(this, new Observer>() { - @Override - public void onChanged(Collection friends) { - // 以前のデータが残っていると不都合なので、空にしておく - friendsDataset.clear(); - - for (AccountNameJson friend : friends) { - FriendDataModel data = new FriendDataModel(); - data.setName(friend.getName()); - data.setId(friend.getUid()); - friendsDataset.add(data); - } - - adapter.setList(friendsDataset); - rv.setAdapter(adapter); - } - }); - -// //idからアカウント名を検索するためのAccountViewModelを宣言しておく -// AccountViewModel accountViewModel = new ViewModelProvider(this).get(AccountViewModel.class); -// -// //フレンド検索ボタン -// 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(); -// -// //IDが存在しなければ落ちるのでその処理を書く -// //取得したIDからアカウントを読み込んでおく -// 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(RequestingActivity.this); -// //名前を渡す -// Bundle args = new Bundle(); -// args.putString("message", requestingName); -// dialog.setArguments(args); -// -// //ダイアログの表示 -// dialog.show(getSupportFragmentManager(), "Requesting_dialog"); -// //OK押したら申請するメソッドにuid、requestingId、tokenを渡す -// } -// } -// }); -// } -// -// -// }); -// -// -// //RecyclerView(表示の設定、直接表示するところはLivedataを購読しているonChanged内に) -// List requestingDataList = new ArrayList<>(); -// -// //xmlからrvにRecyclerViewを取得 -// RecyclerView rv = (RecyclerView) findViewById(R.id.requestingList); -// -// //アダプターを宣言し、削除ボタンを押したときの処理をオーバーライド -// RequestingActivity.RequestingAdapter adapter = new RequestingActivity.RequestingAdapter(requestingDataList){ -// @Override -// void onDeleteClick(View view, int position, RequestingActivity.RequestingDataModel user) { -// new AlertDialog.Builder(RequestingActivity.this) -// .setTitle(user.getName() + "さんへの申請を削除しますか?") -// .setPositiveButton("OK", new DialogInterface.OnClickListener() { -// @Override -// public void onClick(DialogInterface dialog, int which) { -// Toast.makeText(RequestingActivity.this, user.getName(), Toast.LENGTH_SHORT).show(); -// friendViewModel.deleteRequesting(uid, user.getId(), token); -// } -// }) -// .setNegativeButton("キャンセル", null) -// .create() -// .show(); -// } -// }; -// -// //一行ずつを縦に(LinearLayout)表示するLayoutManagerを宣言 -// LinearLayoutManager llm = new LinearLayoutManager(this); -// //データごとの区切り線を入れる -// RecyclerView.ItemDecoration itemDecoration = -// new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); -// rv.addItemDecoration(itemDecoration); -// -// rv.setHasFixedSize(true); -// rv.setLayoutManager(llm); -// -// //FriendViewModelを初期化し、申請先のデータをロードしておく -// friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); -// friendViewModel.getRequesting(uid); -// -// //申請先の一覧のLiveDataへの購読 -// friendViewModel.getRequestingLiveData().observe(this, new Observer>() { -// //データに変更があった時実行 -// @Override -// public void onChanged(Collection requestingUsers) { -// -// //表示用のDataListを一旦クリアし、LiveDataから受け取ったデータを一つずつセット(重複しないように) -// requestingDataList.clear(); -// //受け取ったLivedataの要素分繰り返し、セット -// for (AccountNameJson user: requestingUsers) { -// //dataを宣言 dataに投稿の必要なデータをセットし、それをpostsDatasetに追加してリストを作る -// RequestingActivity.RequestingDataModel data = new RequestingActivity.RequestingDataModel(); -// data.setName(user.getName()); -// data.setId(user.getUid()); -// -// //投稿一つの情報がdataに全部セットされたらDatasetに追加 -// requestingDataList.add(data); -// } -// -// //onChange内に書くべき表示部分 -// adapter.setList(requestingDataList); -// rv.setAdapter(adapter); -// } -// }); - - Button friendBtn = dialog.findViewById(R.id.showFriend); - friendBtn.setOnClickListener(fv -> { - - }); - - // ダイアログを閉じる - Button closeBtn = dialog.findViewById(R.id.close); - closeBtn.setOnClickListener(d -> dialog.dismiss()); - - // 生成したダイアログを表示 - dialog.show(); - -// WindowManager.LayoutParams lp = dialog.getWindow().getAttributes(); -// DisplayMetrics metrics = getResources().getDisplayMetrics(); -// -// // 画面サイズの0.8倍の大きさ -// int dialogWidth = (int) (metrics.widthPixels * 0.8); -// int dialogHeight = (int) (metrics.heightPixels * 0.8); -// lp.width = dialogWidth; -// lp.height = dialogHeight; -// dialog.getWindow().setAttributes(lp); - -// dialog.show(getSupportFragmentManager(), "friend_dialog"); + showFriend.setOnClickListener(v2 -> { + friendRecyclerView.setVisibility(View.VISIBLE); + requestingConstraintLayout.setVisibility(View.INVISIBLE); }); - // マイページ画面に画面遷移する - Button backButton = findViewById(R.id.backMyPage); - backButton.setOnClickListener(v -> { - Intent intent = new Intent(getApplication(), MyPageActivity.class); - startActivity(intent); + showRequesting.setOnClickListener(v3 -> { + friendRecyclerView.setVisibility(View.INVISIBLE); + requestingConstraintLayout.setVisibility(View.VISIBLE); }); - + + // 初期化 + List friendsDataset = new ArrayList<>(); // 1行分の情報を持つDataModelを格納するリスト + RecyclerView rv = findViewById(R.id.friendsList); // recyclerViewを取得 + friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); // ViewModelを取得 + nemophila = (Nemophila) this.getApplication(); + + + //一行ずつを縦に(LinearLayout)表示するLayoutManagerを宣言 + LinearLayoutManager llm = new LinearLayoutManager(this); + + // データ1つ1つの区切りが分かるように線を引く + RecyclerView.ItemDecoration itemDecoration = + new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); + rv.addItemDecoration(itemDecoration); + rv.setHasFixedSize(true); + rv.setLayoutManager(llm); + + uid = nemophila.getUid(); // 自身のidを取得 + token = nemophila.getToken(); // 自身のtokenを取得 + // getFriendsの通信が呼び出されて、フレンドの一覧をfriendsDatasetに格納し、Adapterにセットする + FriendActivityAdapter adapter = new FriendActivityAdapter(friendsDataset) { + @Override + void onDeleteClick(View view, int position, FriendDataModel friend) { + new AlertDialog.Builder(FriendActivity.this) + .setTitle("フレンドから" + friend.getName() + "を削除しますか?") + .setPositiveButton("OK", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + friendViewModel.deleteFriend(uid, friend.getId(), token); + } + }) + .setNegativeButton("キャンセル", null) + .create() + .show(); + } + + @Override + void onFavoriteClick(View view, int position, FriendDataModel friend, ImageView favorite) { + if (favorite.getVisibility() == View.INVISIBLE) { + favorite.setVisibility(View.VISIBLE); + nemophila.setFavoriteFriends(friend.getId()); + } else { + favorite.setVisibility(View.INVISIBLE); + nemophila.removeFavoriteFriends(friend.getId()); + System.out.println(nemophila.getFavoriteFriends()); + } + } + }; + friendViewModel.getFriends(uid); // 自身のフレンドの一覧を取得するメソッドを呼び出す + + friendViewModel.getFriendsLiveData().observe(this, new Observer>() { + @Override + public void onChanged(Collection friends) { + // 以前のデータが残っていると不都合なので、空にしておく + friendsDataset.clear(); + + for (AccountNameJson friend : friends) { + FriendDataModel data = new FriendDataModel(); + data.setName(friend.getName()); + data.setId(friend.getUid()); + friendsDataset.add(data); + } + + adapter.setList(friendsDataset); + rv.setAdapter(adapter); + } + }); + + //idからアカウント名を検索するためのAccountViewModelを宣言しておく + AccountViewModel accountViewModel = new ViewModelProvider(this).get(AccountViewModel.class); + + //フレンド検索ボタン + Button requestingButton = findViewById(R.id.requestingSearchButton); + requestingButton.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick(View v){ + //入力されたIDを取得 + EditText editSearchId = findViewById(R.id.inputRequestingId); + String searchingId = editSearchId.getText().toString(); + + //IDが存在しなければ落ちるのでその処理を書く + //取得したIDからアカウントを読み込んでおく + accountViewModel.fetchAccount(searchingId); + //検索用LiveDataへの購読 + accountViewModel.getAccountLiveData().observe(FriendActivity.this, new Observer() { + + //ViewModelからアカウントが返ってくれば(データ変更があれば)実行 + @Override + public void onChanged(Account user) { + if(user == null){ + new AlertDialog.Builder(FriendActivity.this) + .setTitle("IDが間違っています") + .setPositiveButton("OK", null) + .create() + .show(); + }else { + requestingName = (user.getName()); + + //申請を送るダイアログ + RequestingDialogFragment dialog = new RequestingDialogFragment(FriendActivity.this); + //名前を渡す + Bundle args = new Bundle(); + args.putString("message", requestingName); + dialog.setArguments(args); + + //ダイアログの表示 + dialog.show(getSupportFragmentManager(), "Requesting_dialog"); + //OK押したら申請するメソッドにuid、requestingId、tokenを渡す + } + } + }); + } + + + }); + + + //RecyclerView(表示の設定、直接表示するところはLivedataを購読しているonChanged内に) + List requestingDataList = new ArrayList<>(); + + //xmlからrvにRecyclerViewを取得 + RecyclerView rv_r = (RecyclerView) findViewById(R.id.requestingList); + + //アダプターを宣言し、削除ボタンを押したときの処理をオーバーライド + FriendActivity.RequestingAdapter adapter_r = new FriendActivity.RequestingAdapter(requestingDataList){ + @Override + void onDeleteClick_r(View view, int position, FriendActivity.RequestingDataModel user) { + new AlertDialog.Builder(FriendActivity.this) + .setTitle(user.getName() + "さんへの申請を削除しますか?") + .setPositiveButton("OK", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Toast.makeText(FriendActivity.this, user.getName(), Toast.LENGTH_SHORT).show(); + friendViewModel.deleteRequesting(uid, user.getId(), token); + } + }) + .setNegativeButton("キャンセル", null) + .create() + .show(); + } + }; + + //一行ずつを縦に(LinearLayout)表示するLayoutManagerを宣言 + LinearLayoutManager llm_r = new LinearLayoutManager(this); + //データごとの区切り線を入れる + RecyclerView.ItemDecoration itemDecoration_r = + new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); + rv_r.addItemDecoration(itemDecoration_r); + + rv_r.setHasFixedSize(true); + rv_r.setLayoutManager(llm_r); + + //FriendViewModelを初期化し、申請先のデータをロードしておく + friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); + friendViewModel.getRequesting(uid); + + //申請先の一覧のLiveDataへの購読 + friendViewModel.getRequestingLiveData().observe(this, new Observer>() { + //データに変更があった時実行 + @Override + public void onChanged(Collection requestingUsers) { + + //表示用のDataListを一旦クリアし、LiveDataから受け取ったデータを一つずつセット(重複しないように) + requestingDataList.clear(); + //受け取ったLivedataの要素分繰り返し、セット + for (AccountNameJson user: requestingUsers) { + //dataを宣言 dataに投稿の必要なデータをセットし、それをpostsDatasetに追加してリストを作る + RequestingActivity.RequestingDataModel data = new RequestingActivity.RequestingDataModel(); + data.setName(user.getName()); + data.setId(user.getUid()); + + //投稿一つの情報がdataに全部セットされたらDatasetに追加 + requestingDataList.add(data); + } + + //onChange内に書くべき表示部分 + adapter_r.setList(requestingDataList); + rv_r.setAdapter(adapter_r); + } + }); + + // ダイアログを閉じる + Button closeBtn = findViewById(R.id.close); + closeBtn.setOnClickListener(d -> finish()); } // ----------- FriendのRecyclerView用の内部クラス ------------// @@ -373,7 +291,6 @@ onFavoriteClick(v, position, friendData.get(position), vh.favorite); } }); - return vh; } @@ -390,7 +307,6 @@ public int getItemCount() { return friendData.size(); } - abstract void onDeleteClick(View view, int position, FriendDataModel friend); abstract void onFavoriteClick(View view, int position, FriendDataModel friend, ImageView favorite); } @@ -458,7 +374,7 @@ public void onClick(View v) { int position = vh.getBindingAdapterPosition(); // 処理はonDeleteClickに - onDeleteClick(v, position, list.get(position)); + onDeleteClick_r(v, position, list.get(position)); } }); @@ -475,7 +391,7 @@ return list.size(); } - void onDeleteClick(View view, int position, FriendActivity.RequestingDataModel requesting) { + void onDeleteClick_r(View view, int position, FriendActivity.RequestingDataModel requesting) { // このメソッドをActivity内でオーバーライドして、クリックイベントの処理を設定する } } @@ -512,6 +428,11 @@ public void setId(String id){ this.id = id; } + } + //ダイアログでOKを押した時に呼び出される フレンド申請を送るメソッド + public void putRequesting(){ + requestingId = searchingId; + friendViewModel.putRequesting(uid, requestingId, requestingName, token); } } \ No newline at end of file diff --git a/app/src/main/java/com/example/nemophila/MapsDialogFragment.java b/app/src/main/java/com/example/nemophila/MapsDialogFragment.java index f2028a4..caad4ba 100644 --- a/app/src/main/java/com/example/nemophila/MapsDialogFragment.java +++ b/app/src/main/java/com/example/nemophila/MapsDialogFragment.java @@ -45,8 +45,8 @@ } AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setTitle("投稿したいお店はこの中にありますか?") - .setPositiveButton("該当する店がありません(新規作成)", new DialogInterface.OnClickListener() { + builder.setTitle("周囲の店舗情報") + .setPositiveButton("新規作成", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { //このボタンを押した時の処理を書きます。 //新規投稿画面へ遷移 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 94df1eb..69f77ad 100644 --- a/app/src/main/java/com/example/nemophila/RequestingActivity.java +++ b/app/src/main/java/com/example/nemophila/RequestingActivity.java @@ -23,6 +23,7 @@ import com.example.nemophila.entities.Account; import com.example.nemophila.entities.AccountNameJson; +import com.example.nemophila.entities.ErrorType; import com.example.nemophila.entities.Post; import com.example.nemophila.viewmodels.AccountViewModel; import com.example.nemophila.viewmodels.FriendViewModel; @@ -64,48 +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(); - - //IDが存在しなければ落ちるのでその処理を書く - //取得した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(RequestingActivity.this); - //名前を渡す - Bundle args = new Bundle(); - args.putString("message", requestingName); - dialog.setArguments(args); - - //ダイアログの表示 - dialog.show(getSupportFragmentManager(), "Requesting_dialog"); - //OK押したら申請するメソッドにuid、requestingId、tokenを渡す - } - } - }); } - - }); + //検索用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<>(); @@ -156,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(data); + //申請先一つの情報がdataに全部セットされたらDatasetに追加 重複していたら追加しない + if(!(requestingDataList.contains(data))) { + requestingDataList.add(0, data); + } } //onChange内に書くべき表示部分 diff --git a/app/src/main/java/com/example/nemophila/RequestingDialogFragment.java b/app/src/main/java/com/example/nemophila/RequestingDialogFragment.java index 22a3c07..9fb66ed 100644 --- a/app/src/main/java/com/example/nemophila/RequestingDialogFragment.java +++ b/app/src/main/java/com/example/nemophila/RequestingDialogFragment.java @@ -10,10 +10,10 @@ import androidx.fragment.app.DialogFragment; public class RequestingDialogFragment extends DialogFragment { - private RequestingActivity requestingActivity; + private FriendActivity friendActivity; - public RequestingDialogFragment(RequestingActivity requestingActivity) { - this.requestingActivity = requestingActivity; + public RequestingDialogFragment(FriendActivity friendActivity) { + this.friendActivity = friendActivity; } @NonNull @@ -28,7 +28,7 @@ .setPositiveButton("申請を送る", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // ボタンを押した時にフレンド申請を送る - requestingActivity.putRequesting(); + friendActivity.putRequesting(); } }) .setNegativeButton("キャンセル", null); diff --git a/app/src/main/java/com/example/nemophila/ShopActivity.java b/app/src/main/java/com/example/nemophila/ShopActivity.java index 0c88111..d02d414 100644 --- a/app/src/main/java/com/example/nemophila/ShopActivity.java +++ b/app/src/main/java/com/example/nemophila/ShopActivity.java @@ -30,7 +30,6 @@ import java.util.List; public class ShopActivity extends AppCompatActivity { - Nemophila nemophila; private ShopAcAdapter adapter = null; @Override @@ -41,6 +40,7 @@ Shop shop; String shopName; String sid; + String myUid = ((Nemophila)getApplication()).getUid(); //NemophilaからcurrentShopを取得、店名の表示 shop = ((Nemophila)getApplication()).getCurrentShop(); @@ -78,7 +78,7 @@ RecyclerView rv = (RecyclerView) findViewById(R.id.postsList); adapter = new ShopAcAdapter(postsDataset); - //一行ずつを縦に(LinearLayout)表示するLayoutManagerを宣言 + //一行ずつを縦に(LinearLayout)表示するLayoutManagerを宣言 第三引数のtrueで降順に表示 LinearLayoutManager llm = new LinearLayoutManager(this); // RecyclerView.ItemDecoration itemDecoration = @@ -114,7 +114,7 @@ //postsDatasetを一旦クリアし、LiveDataから受け取ったデータを一つずつセット(重複しないように) postsDataset.clear(); - int friendFrag; + int postViewFrag; for (Post post: ShopPosts){ //dataを宣言 dataに投稿の必要なデータをセットし、それをpostsDatasetに追加してリストを作る @@ -124,16 +124,20 @@ String uid = post.getUid(); String name = post.getName(); - //投稿がフレンドのものかチェック - friendFrag = 0; - for(AccountNameJson friendNJ: friends){ - if(uid.equals(friendNJ.getUid())){ - friendFrag = 1; + //投稿が自分もしくはフレンドのものかチェック + postViewFrag = 0; + if(uid.equals(myUid)) { + postViewFrag = 1; + }else { + for (AccountNameJson friendNJ : friends) { + if (uid.equals(friendNJ.getUid())) { + postViewFrag = 1; + } } } - //フレンドの投稿のみdataにセット - if(friendFrag == 1) { + //表示する投稿のみdataにセット + if(postViewFrag == 1) { // if(friends.contains(uid)){ //選択が何もない場合は全ての投稿を、選択がある場合は一致する投稿をdataにセット if (selectingGenre.isEmpty() || selectingGenre.contains(genre)) { @@ -155,7 +159,7 @@ data.setComment(post.getComment()); //投稿一つの情報がdataに全部セットされたらDatasetに追加 - postsDataset.add(data); + postsDataset.add(0, data); } } } 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/entities/ErrorType.java b/app/src/main/java/com/example/nemophila/entities/ErrorType.java new file mode 100644 index 0000000..4ab24d7 --- /dev/null +++ b/app/src/main/java/com/example/nemophila/entities/ErrorType.java @@ -0,0 +1,19 @@ +package com.example.nemophila.entities; + +public enum ErrorType { + ResponseError("レスポンスエラー"), + NetworkError("ネットワークエラー"), + InvalidToken("トークンが不一致"), + UnknownError("不明なエラー"), + ResponseNoyFound("リソースが見つかりません"); + + private final String text; + + ErrorType(String text) { + this.text = text; + } + + public String getText() { + return text; + } +} diff --git a/app/src/main/java/com/example/nemophila/entities/Shop.java b/app/src/main/java/com/example/nemophila/entities/Shop.java index 13522f2..be24255 100644 --- a/app/src/main/java/com/example/nemophila/entities/Shop.java +++ b/app/src/main/java/com/example/nemophila/entities/Shop.java @@ -7,6 +7,8 @@ private String name; private double longitude; private double latitude; + private ArrayList genreSet; + private ArrayList userIdSet; //Getter public String getSid() { @@ -21,6 +23,12 @@ public double getLatitude() { return latitude; } + public ArrayList getGenreSet() { + return genreSet; + } + public ArrayList getUserIdSet() { + return userIdSet; + } //Setter public void setSid(String id) { @@ -35,6 +43,12 @@ public void setLatitude(double latitude) { this.latitude = latitude; } + public void setGenreSet(ArrayList genreSet) { + this.genreSet = genreSet; + } + public void setUserIdSet(ArrayList userIdSet) { + this.userIdSet = userIdSet; + } @Override public boolean equals(Object other) { 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 83c6596..8f3dc95 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/FriendViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/FriendViewModel.java @@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel; 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; @@ -26,6 +27,7 @@ private final MutableLiveData> friendsLiveData; private final MutableLiveData> requestedLiveData; private final MutableLiveData> requestingLiveData; + private final MutableLiveData errorLiveData; // コンストラクタ public FriendViewModel() { @@ -37,6 +39,7 @@ this.friendsLiveData = new MutableLiveData<>(); this.requestedLiveData = new MutableLiveData<>(); this.requestingLiveData = new MutableLiveData<>(); + this.errorLiveData = new MutableLiveData<>(); } // ライブデータの取得(ゲッター) @@ -47,6 +50,9 @@ return requestedLiveData; } public MutableLiveData> getRequestingLiveData() { return requestingLiveData; } + public MutableLiveData getErrorLiveData() { + return errorLiveData; + } //フレンドの情報の取得 @@ -60,11 +66,13 @@ friendsLiveData.setValue(response.body()); } else { System.out.println("ResponseError: " + response.code()); + errorLiveData.setValue(parseStatusCode(response.code())); } } @Override public void onFailure(Call> call, Throwable t) { System.out.println(" NetworkError: " + t); + errorLiveData.setValue(ErrorType.NetworkError.getText()); } }); } @@ -79,11 +87,13 @@ System.out.println("Successful"); } else { System.out.println("ResponseError: " + response.code()); + errorLiveData.setValue(parseStatusCode(response.code())); } } @Override public void onFailure(Call call, Throwable t) { System.out.println(" NetworkError: " + t); + errorLiveData.setValue(ErrorType.NetworkError.getText()); } }); } @@ -98,11 +108,13 @@ System.out.println("Successful"); } else { System.out.println("ResponseError: " + response.code()); + errorLiveData.setValue(parseStatusCode(response.code())); } } @Override public void onFailure(Call call, Throwable t) { System.out.println(" NetworkError: " + t); + errorLiveData.setValue(ErrorType.NetworkError.getText()); } }); } @@ -117,11 +129,13 @@ System.out.println("Successful"); } else { System.out.println("ResponseError: " + response.code()); + errorLiveData.setValue(parseStatusCode(response.code())); } } @Override public void onFailure(Call> call, Throwable t) { System.out.println(" NetworkError: " + t); + errorLiveData.setValue(ErrorType.NetworkError.getText()); } }); } @@ -136,11 +150,13 @@ addRequestingLiveData(requesting_id, name); } else { System.out.println("ResponseError: " + response.code()); + errorLiveData.setValue(parseStatusCode(response.code())); } } @Override public void onFailure(Call call, Throwable t) { System.out.println(" NetworkError: " + t); + errorLiveData.setValue(ErrorType.NetworkError.getText()); } }); } @@ -155,11 +171,13 @@ System.out.println("Successful Delete"); } else { System.out.println("ResponseError: " + response.code()); + errorLiveData.setValue(parseStatusCode(response.code())); } } @Override public void onFailure(Call call, Throwable t) { System.out.println(" NetworkError: " + t); + errorLiveData.setValue(ErrorType.NetworkError.getText()); } }); } @@ -175,11 +193,13 @@ requestedLiveData.setValue(accountNameJson); } else { System.out.println("ResponseError: " + response.code()); + errorLiveData.setValue(parseStatusCode(response.code())); } } @Override public void onFailure(Call> call, Throwable t) { System.out.println(" NetworkError: " + t); + errorLiveData.setValue(ErrorType.NetworkError.getText()); } }); } @@ -194,11 +214,13 @@ removeRequestedLiveData(fid); } else { System.out.println("ResponseError: " + response.code()); + errorLiveData.setValue(parseStatusCode(response.code())); } } @Override public void onFailure(Call call, Throwable t) { System.out.println(" NetworkError: " + t); + errorLiveData.setValue(ErrorType.NetworkError.getText()); } }); } @@ -216,7 +238,7 @@ preData.add(anj); } preData.add(createAccountNameJson(uid, name)); - requestedLiveData.setValue(preData); + requestingLiveData.setValue(preData); } private void removeFriendLiveData(String id) { @@ -251,4 +273,17 @@ } requestedLiveData.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/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 148afaf..e5e8b46 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) { @@ -177,4 +183,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_friend.xml b/app/src/main/res/layout/activity_friend.xml index c8ed16a..9eb30db 100644 --- a/app/src/main/res/layout/activity_friend.xml +++ b/app/src/main/res/layout/activity_friend.xml @@ -1,59 +1,137 @@ + android:layout_weight="0.1" + android:orientation="horizontal"> + +