Newer
Older
NemophilaClient / app / src / main / java / com / example / nemophila / RequestingActivity.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.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
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.entities.Post;
import com.example.nemophila.viewmodels.AccountViewModel;
import com.example.nemophila.viewmodels.FriendViewModel;
import com.example.nemophila.viewmodels.PostsViewModel;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class RequestingActivity extends AppCompatActivity {

    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_requesting);
        //Nemophilaから自分のuidとtokenを取得
        uid = ((Nemophila)getApplication()).getUid();
        token = ((Nemophila)getApplication()).getToken();

        //左上のボタンでマイページへ遷移
        Button returnButton = (Button)findViewById(R.id.requestingAcReturnButton);
        returnButton.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                Intent intent = new Intent(getApplication(), MyPageActivity.class);
                startActivity(intent);
            }
        });

        //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<RequestingDataModel> requestingDataList = new ArrayList<>();

        //xmlからrvにRecyclerViewを取得
        RecyclerView rv = (RecyclerView) findViewById(R.id.requestingList);

        //アダプターを宣言し、削除ボタンを押したときの処理をオーバーライド
        RequestingAdapter adapter = new RequestingAdapter(requestingDataList){
            @Override
            void onDeleteClick(View view, int position, 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に追加してリストを作る
                    RequestingDataModel data = new RequestingDataModel();
                    data.setName(user.getName());
                    data.setId(user.getUid());

                    //投稿一つの情報がdataに全部セットされたらDatasetに追加
                    requestingDataList.add(data);
                }

                //onChange内に書くべき表示部分
                adapter.setList(requestingDataList);
                rv.setAdapter(adapter);
            }
        });
    }


    //ダイアログでOKを押した時に呼び出される フレンド申請を送るメソッド
    public void putRequesting(){
        requestingId = searchingId;
        friendViewModel.putRequesting(uid, requestingId, requestingName, token);
    }

    //RecyclerViewのための内部クラス
    //Adapter
    public class RequestingAdapter extends RecyclerView.Adapter<RequestingViewHolder> {

        private List<RequestingDataModel> list;

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

        public void setList(List<RequestingDataModel> list) {
            this.list = list;
        }

        @NonNull
        @Override
        public RequestingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            //1データあたりのレイアウトを読み込み、ビューホルダーを宣言
            View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_requesting_activity, parent,false);
            RequestingViewHolder vh = new 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 RequestingViewHolder holder, int position) {
            holder.nameView.setText(list.get(position).getName());
        }

        @Override
        public int getItemCount() {
            return list.size();
        }

        void onDeleteClick(View view, int position, 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;
        }

    }

}