diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index e69de29..86843cb 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 432cce0..81804e1 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -16,6 +16,7 @@ + diff --git a/app/src/main/java/com/example/nemophila/FriendActivity.java b/app/src/main/java/com/example/nemophila/FriendActivity.java index 22a0002..1f6f9d0 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,79 +39,17 @@ 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 showDialog = findViewById(R.id.showDialog); showDialog.setOnClickListener(v -> { // 任意の大きさでダイアログを生成 @@ -118,10 +57,25 @@ dialog.setContentView(R.layout.layout_friend_dialog); dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); + Button showFriend = dialog.findViewById(R.id.showFriend); + Button showRequesting = dialog.findViewById(R.id.showRequesting); + RecyclerView friendRecyclerView = dialog.findViewById(R.id.friendsList); + ConstraintLayout requestingConstraintLayout = dialog.findViewById(R.id.requestingLayout); + + showFriend.setOnClickListener(v2 -> { + friendRecyclerView.setVisibility(View.VISIBLE); + requestingConstraintLayout.setVisibility(View.INVISIBLE); + }); + + showRequesting.setOnClickListener(v3 -> { + friendRecyclerView.setVisibility(View.INVISIBLE); + requestingConstraintLayout.setVisibility(View.VISIBLE); + }); + // 初期化 List friendsDataset = new ArrayList<>(); // 1行分の情報を持つDataModelを格納するリスト RecyclerView rv = dialog.findViewById(R.id.friendsList); // recyclerViewを取得 - FriendViewModel friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); // ViewModelを取得 + friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); // ViewModelを取得 nemophila = (Nemophila) this.getApplication(); @@ -135,8 +89,8 @@ rv.setHasFixedSize(true); rv.setLayoutManager(llm); - String myUid = nemophila.getUid(); // 自身のidを取得 - String myToken = nemophila.getToken(); // 自身のtokenを取得 + uid = nemophila.getUid(); // 自身のidを取得 + token = nemophila.getToken(); // 自身のtokenを取得 // getFriendsの通信が呼び出されて、フレンドの一覧をfriendsDatasetに格納し、Adapterにセットする FriendActivityAdapter adapter = new FriendActivityAdapter(friendsDataset) { @Override @@ -146,7 +100,7 @@ .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - friendViewModel.deleteFriend(myUid, friend.getId(), myToken); + friendViewModel.deleteFriend(uid, friend.getId(), token); } }) .setNegativeButton("キャンセル", null) @@ -166,7 +120,7 @@ } } }; - friendViewModel.getFriends(myUid); // 自身のフレンドの一覧を取得するメソッドを呼び出す + friendViewModel.getFriends(uid); // 自身のフレンドの一覧を取得するメソッドを呼び出す friendViewModel.getFriendsLiveData().observe(this, new Observer>() { @Override @@ -186,122 +140,117 @@ } }); -// //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); -// } -// }); + //idからアカウント名を検索するためのAccountViewModelを宣言しておく + AccountViewModel accountViewModel = new ViewModelProvider(this).get(AccountViewModel.class); - Button friendBtn = dialog.findViewById(R.id.showFriend); - friendBtn.setOnClickListener(fv -> { + //フレンド検索ボタン + Button requestingButton = dialog.findViewById(R.id.requestingSearchButton); + requestingButton.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick(View v){ + //入力されたIDを取得 + EditText editSearchId = dialog.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) dialog.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); + } }); // ダイアログを閉じる @@ -310,18 +259,6 @@ // 生成したダイアログを表示 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"); }); // マイページ画面に画面遷移する @@ -458,7 +395,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 +412,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 +449,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/FriendDialogFragment.java b/app/src/main/java/com/example/nemophila/FriendDialogFragment.java new file mode 100644 index 0000000..e75076c --- /dev/null +++ b/app/src/main/java/com/example/nemophila/FriendDialogFragment.java @@ -0,0 +1,457 @@ +package com.example.nemophila; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import com.example.nemophila.entities.Account; +import com.example.nemophila.entities.AccountNameJson; +import com.example.nemophila.viewmodels.AccountViewModel; +import com.example.nemophila.viewmodels.FriendViewModel; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.fragment.app.DialogFragment; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +public class FriendDialogFragment extends DialogFragment { + Nemophila nemophila; + FriendViewModel friendViewModel; + String uid; + String token; + String requestingId; + String requestingName; + String searchingId; + + public FriendDialogFragment(Nemophila nemophila) { + this.nemophila = nemophila; + } + + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + Dialog dialog = new Dialog(getContext()); + dialog.setContentView(R.layout.layout_friend_dialog); + dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); + + Button showFriend = dialog.findViewById(R.id.showFriend); + Button showRequesting = dialog.findViewById(R.id.showRequesting); + RecyclerView friendRecyclerView = dialog.findViewById(R.id.friendsList); + ConstraintLayout requestingConstraintLayout = dialog.findViewById(R.id.requestingLayout); + + showFriend.setOnClickListener(v2 -> { + friendRecyclerView.setVisibility(View.VISIBLE); + requestingConstraintLayout.setVisibility(View.INVISIBLE); + }); + + showRequesting.setOnClickListener(v3 -> { + friendRecyclerView.setVisibility(View.INVISIBLE); + requestingConstraintLayout.setVisibility(View.VISIBLE); + }); + + // 初期化 + List friendsDataset = new ArrayList<>(); // 1行分の情報を持つDataModelを格納するリスト + RecyclerView rv = dialog.findViewById(R.id.friendsList); // recyclerViewを取得 + friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); // ViewModelを取得 + + //一行ずつを縦に(LinearLayout)表示するLayoutManagerを宣言 + LinearLayoutManager llm = new LinearLayoutManager(getContext()); + + // データ1つ1つの区切りが分かるように線を引く + RecyclerView.ItemDecoration itemDecoration = + new DividerItemDecoration(getContext(), 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, FriendActivity.FriendDataModel friend) { + new AlertDialog.Builder(getContext()) + .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, FriendActivity.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) { + FriendActivity.FriendDataModel data = new FriendActivity.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 = dialog.findViewById(R.id.requestingSearchButton); + requestingButton.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick(View v){ + //入力されたIDを取得 + EditText editSearchId = dialog.findViewById(R.id.inputRequestingId); + String searchingId = editSearchId.getText().toString(); + + //IDが存在しなければ落ちるのでその処理を書く + //取得したIDからアカウントを読み込んでおく + accountViewModel.fetchAccount(searchingId); + //検索用LiveDataへの購読 + accountViewModel.getAccountLiveData().observe(, new Observer() { + + //ViewModelからアカウントが返ってくれば(データ変更があれば)実行 + @Override + public void onChanged(Account user) { + if(user == null){ + new AlertDialog.Builder(getContext()) + .setTitle("IDが間違っています") + .setPositiveButton("OK", null) + .create() + .show(); + }else { + requestingName = (user.getName()); + + new AlertDialog.Builder(getContext()) + .setTitle("フレンド申請") + .setMessage(requestingName + "さんに申請しますか?") + .setPositiveButton("申請を送る", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + // ボタンを押した時にフレンド申請を送る + friendViewModel.putRequesting(uid, searchingId, requestingName, token); + } + }) + .setNegativeButton("キャンセル", null) + .create() + .show(); + +// //申請を送るダイアログ +// RequestingDialogFragment dialog = new RequestingDialogFragment(); +// //名前を渡す +// 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) dialog.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 = dialog.findViewById(R.id.close); + closeBtn.setOnClickListener(d -> dialog.dismiss()); + + return dialog; + } + + // ----------- FriendのRecyclerView用の内部クラス ------------// + // Adapter + abstract public class FriendActivityAdapter extends RecyclerView.Adapter { + private List friendData; + + public FriendActivityAdapter(List friendData) { + this.friendData = friendData; + } + + public void setList(List friendData) { + this.friendData = friendData; + } + + @NonNull + @Override + public FriendActivity.FriendsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int ViewType) { + // layoutXMLからViewを生成 + View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.friend_list_item, parent,false); + // ViewHolderを生成 + FriendActivity.FriendsViewHolder vh = new FriendActivity.FriendsViewHolder(inflate); + + // 削除ボタンを押したときのイベントを登録 + vh.deleteButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int position = vh.getBindingAdapterPosition(); + // 処理はonDeleteClick()に丸投げ + onDeleteClick(v, position, friendData.get(position)); + } + }); + + // お気に入りに追加したときのイベントを登録 + vh.favoriteOutline.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int position = vh.getBindingAdapterPosition(); + // 処理はonFavoriteClick()に丸投げ + onFavoriteClick(v, position, friendData.get(position), vh.favorite); + } + }); + + return vh; + } + + @Override + public void onBindViewHolder(@NonNull FriendActivity.FriendsViewHolder holder, int position) { + // 後からアイコンの登録をできるようにする + holder.nameView.setText(friendData.get(position).getName()); + if (nemophila.getFavoriteFriends().contains(friendData.get(position).getId())) { + holder.favorite.setVisibility(View.VISIBLE); + } + } + + @Override + public int getItemCount() { + return friendData.size(); + } + + abstract void onDeleteClick(View view, int position, FriendActivity.FriendDataModel friend); + abstract void onFavoriteClick(View view, int position, FriendActivity.FriendDataModel friend, ImageView favorite); + } + + // ViewHolder + public class FriendsViewHolder extends RecyclerView.ViewHolder { + public ImageView favorite; + public ImageButton favoriteOutline; + public ImageView iconView; + public TextView nameView; + public Button deleteButton; + + public FriendsViewHolder(@NonNull View itemView) { + super(itemView); + favorite = itemView.findViewById(R.id.favorite); + favoriteOutline = itemView.findViewById(R.id.favorite_outline); + iconView = itemView.findViewById(R.id.friendIcon); + nameView = itemView.findViewById(R.id.friendName); + deleteButton = itemView.findViewById(R.id.friendDelete); + } + } + + // DataModel + public static class FriendDataModel { + private String name; + private String id; + + public String getName() { + return name; + } + public String getId() { + return id; + } + + public void setName(String name) { + this.name = name; + } + public void setId(String id) { this.id = id;} + } + + // ----------- RequestingのRecyclerView用の内部クラス ------------// + //Adapter + public class RequestingAdapter extends RecyclerView.Adapter { + + private List list; + + public RequestingAdapter(List list) { + this.list =list; + } + + public void setList(List list) { + this.list = list; + } + + @NonNull + @Override + public FriendActivity.RequestingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + //1データあたりのレイアウトを読み込み、ビューホルダーを宣言 + View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_requesting_activity, parent,false); + FriendActivity.RequestingViewHolder vh = new FriendActivity.RequestingViewHolder(inflate); + + // リスト内の削除ボタンを押した時の処理 + vh.deleteButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int position = vh.getBindingAdapterPosition(); + // 処理はonDeleteClickに + onDeleteClick_r(v, position, list.get(position)); + } + }); + + return vh; + } + + @Override + public void onBindViewHolder(@NonNull FriendActivity.RequestingViewHolder holder, int position) { + holder.nameView.setText(list.get(position).getName()); + } + + @Override + public int getItemCount() { + return list.size(); + } + + void onDeleteClick_r(View view, int position, FriendActivity.RequestingDataModel requesting) { + // このメソッドをActivity内でオーバーライドして、クリックイベントの処理を設定する + } + } + + //ViewHolder + public class RequestingViewHolder extends RecyclerView.ViewHolder { + public TextView nameView; + public ImageView iconView; + public Button deleteButton; + + public RequestingViewHolder(@NonNull View itemView) { + super(itemView); + nameView = (TextView) itemView.findViewById(R.id.requestingName); + iconView = itemView.findViewById(R.id.requestingIcon); + deleteButton = itemView.findViewById(R.id.requestingDeleteButton); + } + } + + //DataModel + public static class RequestingDataModel { + private String name; + private String id; + + public String getName() { + return name; + } + public String getId() { + return id; + } + + public void setName(String name) { + this.name = name; + } + public void setId(String id){ + this.id = id; + } + } + + //ダイアログでOKを押した時に呼び出される フレンド申請を送るメソッド + public void putRequesting(){ + requestingId = searchingId; + friendViewModel.putRequesting(uid, requestingId, requestingName, token); + } +} diff --git a/app/src/main/java/com/example/nemophila/MyPageActivity.java b/app/src/main/java/com/example/nemophila/MyPageActivity.java index f90011a..b67e074 100644 --- a/app/src/main/java/com/example/nemophila/MyPageActivity.java +++ b/app/src/main/java/com/example/nemophila/MyPageActivity.java @@ -56,8 +56,8 @@ Button friendButton = (Button) findViewById(R.id.friend); friendButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - Intent intent = new Intent(MyPageActivity.this, FriendActivity.class); - startActivity(intent); + FriendDialogFragment dialog = new FriendDialogFragment(nemophila); + dialog.show(getSupportFragmentManager(), "tag"); } }); diff --git a/app/src/main/java/com/example/nemophila/RequestingActivity.java b/app/src/main/java/com/example/nemophila/RequestingActivity.java index 94df1eb..eda2628 100644 --- a/app/src/main/java/com/example/nemophila/RequestingActivity.java +++ b/app/src/main/java/com/example/nemophila/RequestingActivity.java @@ -88,16 +88,16 @@ }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を渡す +// //申請を送るダイアログ +//// RequestingDialogFragment dialog = new RequestingDialogFragment(); +// //名前を渡す +// Bundle args = new Bundle(); +// args.putString("message", requestingName); +// dialog.setArguments(args); +// +// //ダイアログの表示 +// dialog.show(getSupportFragmentManager(), "Requesting_dialog"); +// //OK押したら申請するメソッドにuid、requestingId、tokenを渡す } } }); 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/res/layout/activity_requesting.xml b/app/src/main/res/layout/activity_requesting.xml index b15fa49..c22f3c2 100644 --- a/app/src/main/res/layout/activity_requesting.xml +++ b/app/src/main/res/layout/activity_requesting.xml @@ -6,98 +6,117 @@ android:layout_height="match_parent" tools:context=".RequestingActivity"> + -