diff --git a/.idea/misc.xml b/.idea/misc.xml index 960c647..432cce0 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -15,13 +15,20 @@ + + + + + + + diff --git a/app/src/main/java/com/example/nemophila/FriendActivity.java b/app/src/main/java/com/example/nemophila/FriendActivity.java index 2df9314..22a0002 100644 --- a/app/src/main/java/com/example/nemophila/FriendActivity.java +++ b/app/src/main/java/com/example/nemophila/FriendActivity.java @@ -9,21 +9,27 @@ import androidx.recyclerview.widget.RecyclerView; import android.app.AlertDialog; +import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Color; import android.graphics.PorterDuff; import android.os.Bundle; +import android.util.DisplayMetrics; 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; @@ -37,72 +43,285 @@ 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(); +// // 初期化 +// 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 -> { + // 任意の大きさでダイアログを生成 + 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); + //一行ずつを縦に(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); + // データ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); + 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(); } - adapter.setList(friendsDataset); - rv.setAdapter(adapter); - } + @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"); }); // マイページ画面に画面遷移する @@ -114,7 +333,7 @@ } - // ----------- RecyclerView用の内部クラス ------------// + // ----------- FriendのRecyclerView用の内部クラス ------------// // Adapter abstract public class FriendActivityAdapter extends RecyclerView.Adapter { private List friendData; @@ -211,4 +430,88 @@ } 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(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(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; + } + + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/nemophila/RequestingActivity.java b/app/src/main/java/com/example/nemophila/RequestingActivity.java index 12f8900..94df1eb 100644 --- a/app/src/main/java/com/example/nemophila/RequestingActivity.java +++ b/app/src/main/java/com/example/nemophila/RequestingActivity.java @@ -243,7 +243,7 @@ } //DataModel - public static class RequestingDataModel { + public static class RequestingDataModel extends FriendActivity.RequestingDataModel { private String name; private String id; diff --git a/app/src/main/res/layout/activity_friend.xml b/app/src/main/res/layout/activity_friend.xml index 8a95aba..c8ed16a 100644 --- a/app/src/main/res/layout/activity_friend.xml +++ b/app/src/main/res/layout/activity_friend.xml @@ -13,7 +13,9 @@ android:orientation="horizontal" android:background="#AFAFB0"> - diff --git a/app/src/main/res/layout/layout_friend.xml b/app/src/main/res/layout/layout_friend.xml new file mode 100644 index 0000000..8d0f3a7 --- /dev/null +++ b/app/src/main/res/layout/layout_friend.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_friend_dialog.xml b/app/src/main/res/layout/layout_friend_dialog.xml new file mode 100644 index 0000000..afe04fd --- /dev/null +++ b/app/src/main/res/layout/layout_friend_dialog.xml @@ -0,0 +1,73 @@ + + + + + + + +