Newer
Older
NemophilaClient / app / src / main / java / com / example / nemophila / FriendActivity.java
package com.example.nemophila;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
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;
import java.util.Collection;
import java.util.List;

public class FriendActivity extends AppCompatActivity {
    private Nemophila nemophila;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_friend);

//        // 初期化
//        List<FriendDataModel> 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<Collection<AccountNameJson>>() {
//            @Override
//            public void onChanged(Collection<AccountNameJson> 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<FriendDataModel> 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<Collection<AccountNameJson>>() {
                @Override
                public void onChanged(Collection<AccountNameJson> 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<Account>() {
//
//                        //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<RequestingActivity.RequestingDataModel> 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<Collection<AccountNameJson>>() {
//                //データに変更があった時実行
//                @Override
//                public void onChanged(Collection<AccountNameJson> 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");
        });

        // マイページ画面に画面遷移する
        Button backButton = findViewById(R.id.backMyPage);
        backButton.setOnClickListener(v -> {
            Intent intent = new Intent(getApplication(), MyPageActivity.class);
            startActivity(intent);
        });
        
    }

    // ----------- FriendのRecyclerView用の内部クラス ------------//
    // Adapter
    abstract public class FriendActivityAdapter extends RecyclerView.Adapter<FriendsViewHolder> {
        private List<FriendDataModel> friendData;

        public FriendActivityAdapter(List<FriendDataModel> friendData) {
            this.friendData = friendData;
        }

        public void setList(List<FriendDataModel> friendData) {
            this.friendData = friendData;
        }

        @NonNull
        @Override
        public FriendsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int ViewType) {
            // layoutXMLからViewを生成
            View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.friend_list_item, parent,false);
            // ViewHolderを生成
            FriendsViewHolder vh = new 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 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, FriendDataModel friend);
        abstract void onFavoriteClick(View view, int position, 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<FriendActivity.RequestingViewHolder> {

        private List<RequestingActivity.RequestingDataModel> list;

        public RequestingAdapter(List<RequestingActivity.RequestingDataModel> list) {
            this.list =list;
        }

        public void setList(List<RequestingActivity.RequestingDataModel> 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;
        }

    }
}