Newer
Older
NemophilaClient / app / src / main / java / com / example / nemophila / MapsActivity.java
r-nishimura on 3 Oct 2023 17 KB
package com.example.nemophila;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.Toolbar;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.DialogFragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.NavController;
import androidx.navigation.fragment.NavHostFragment;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;

import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ListView;
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.Shop;
import com.example.nemophila.viewmodels.FriendViewModel;
import com.example.nemophila.viewmodels.ShopsViewModel;
import com.google.android.gms.maps.model.Marker;
import com.google.android.material.navigation.NavigationView;

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


public class MapsActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    Nemophila nemophila;
    ShopsViewModel shopsViewModel;
    FriendViewModel friendViewModel;
    DialogFragment filterDialog;
    MapsFragment mapsFragment;
    private Handler handler;
    //private HashMap<String, String> NameToId;


    // フィルターのリスト用
    ArrayList<FilterDataModel> listData;
    ListView list;
    boolean isGenre;
    String genreData[];
    ArrayList<String> friendsData;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        shopsViewModel = new ViewModelProvider(this).get(ShopsViewModel.class);
        friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        nemophila = (Nemophila) this.getApplication();

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);

        // DrawerToggle
        DrawerLayout drawer =
                (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar,
                R.string.drawer_open,
                R.string.drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        // NavigationView Listener
        NavigationView navigationView = (NavigationView) findViewById(R.id.navView);
        navigationView.setNavigationItemSelectedListener(this);

        // geocode Test
        handler = new Handler();

//        // 検索バーの処理
//        SearchView searchView = findViewById(R.id.tool_search);
//        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
//            @Override
//            public boolean onQueryTextSubmit(String query) {
//                new Thread(() -> {
//                    geoCode(query);
//                }).start();
//                return false;
//            }
//
//            @Override
//            public boolean onQueryTextChange(String newText) {
//                return false;
//            }
//        });

        //filterDialog = new FilterDialog();

        // サイドメニューのボタン
        Button genreButton = findViewById(R.id.filter_genre_button);
        Button friendButton = findViewById(R.id.filter_friends_button);

        // 押したボタンを灰色にし、listを作成
        genreButton.setOnClickListener(view -> {
            genreButton.setBackgroundColor(Color.parseColor("#afafb0"));
            friendButton.setBackgroundColor(Color.WHITE);
            prepareGenreList(null);
        });
        friendButton.setOnClickListener(view -> {
            friendButton.setBackgroundColor(Color.parseColor("#afafb0"));
            genreButton.setBackgroundColor(Color.WHITE);
            prepareFriendList(null);
        });

        // サイドメニューのフィルターのリストの準備
        genreData = new String[]{"中華", "和食", "イタリアン", "フレンチ", "カフェ", "バー", "居酒屋", "ラーメン", "うどん・そば", "その他 海外料理"};
        friendsData = new ArrayList<>();
        //NameToId = new HashMap<>();

//        friendsData[0] = "iyo";
//        friendsData[1] = "iyo2";
//        friendsData[2] = "superiyo";
//        friendsData[3] = "perfectiyo";
//        friendsData[4] = "finaliyo";

        //フレンド一覧を取得
        friendViewModel.getFriends(nemophila.getUid());
        friendViewModel.getFriendsLiveData().observe(this, new Observer<Collection<AccountNameJson>>() {
            @Override
            public void onChanged(Collection<AccountNameJson> friends) {
                for (AccountNameJson friend : friends) {
                    friendsData.add(friend.getUid());
                    //NameToId.put(friend.getName(), friend.getUid());
                }
            }
        });


        listData = new ArrayList<>();
        list = findViewById(R.id.drawer_list);
        prepareGenreList(null);

        // フィルターを有効にする
        list.setTextFilterEnabled(true);

        //サイドメニューの検索バー
        SearchView listSearch = findViewById(R.id.drawer_search);
        listSearch.setOnQueryTextListener(
                new SearchView.OnQueryTextListener() {
                    // 入力テキストに変更があったとき
                    @Override
                    public boolean onQueryTextChange(String s) {
                        if(isGenre){
                            if(s.equals("")){
                                prepareGenreList(null);
                            } else {
                                prepareGenreList(s);
                            }
                        } else {
                            if(s.equals("")){
                                prepareFriendList(null);
                            } else {
                                prepareFriendList(s);
                            }
                        }
                        return false;
                    }

                    // 検索ボタンを押したとき
                    @Override
                    public boolean onQueryTextSubmit(String s) {
                        return false;
                    }
                }
        );

    }

    //右上のメニューを用意、マイページ画面への遷移
    @Override
    public boolean onCreateOptionsMenu(@NonNull Menu menu) {
        getMenuInflater().inflate(R.menu.tool_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Intent intent = new Intent(MapsActivity.this, MyPageActivity.class);
        startActivity(intent);

        return super.onOptionsItemSelected(item);
    }


    public void prepareGenreList(String s){
        //sは検索欄に入力された文字列
        
        // 現在表示されているリストがジャンルのリストかどうかを設定
        isGenre = true;

        // 一度リストのデータを取り除いてから追加する
        listData.clear();
        for(int i = 0; i < genreData.length; i++){
            if(s == null) {
                FilterDataModel fd = new FilterDataModel();
                fd.setText(genreData[i]);
                listData.add(fd);
            } else {
                if(genreData[i].contains(s)){
                    FilterDataModel fd = new FilterDataModel();
                    fd.setText(genreData[i]);
                    listData.add(fd);
                }
            }
        }

        // ListViewにデータをセットする
        list.setAdapter(new MyAdapter(
                this,
                R.layout.filter_layout,
                listData
        ));
        list.deferNotifyDataSetChanged();
    }

    public void prepareFriendList(String s){
        //sは検索欄に入力された文字列
        
        // 現在表示されているリストがジャンルのリストかどうかを設定
        isGenre = false;

        // 一度リストのデータを取り除いてから追加する
        listData.clear();
        
        for (AccountNameJson friend : nemophila.getFriends()) {
            if(s == null) {
                FilterDataModel fd = new FilterDataModel();
                fd.setText(friend.getUid());
                fd.setNameText(friend.getName());
                listData.add(fd);
            } else {
                //検索にヒットしたフレンドのみのリストにする
                if(friend.getName().contains(s)){
                    FilterDataModel fd = new FilterDataModel();
                    fd.setText(friend.getUid());
                    fd.setNameText(friend.getName());
                    listData.add(fd);
                }
            }
        }

        // ListViewにデータをセットする
        list.setAdapter(new MyAdapter(
                this,
                R.layout.filter_layout,
                listData
        ));
        list.deferNotifyDataSetChanged();
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        return false;
    }

    public void setMapsFragment(MapsFragment mapsFragment) {
        this.mapsFragment = mapsFragment;
    }

    // 内部クラス
    private class MyAdapter extends ArrayAdapter<FilterDataModel> {
        private LayoutInflater layoutInflater;
        public MyAdapter(Context context, int resourceId, List<FilterDataModel> objects){
            super(context, resourceId, objects);

            layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        // 画面外に行ったときにチェックがずれないようにする
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            CheckBox checkBox;

            if(isGenre) {
                FilterDataModel item = (FilterDataModel) getItem(position);
                if (convertView == null) {
                    convertView = layoutInflater.inflate(R.layout.filter_item, null);
                }

                TextView textView = convertView.findViewById(R.id.filter_text);
                textView.setText(item.text);
                checkBox = convertView.findViewById(R.id.filter_checkbox);
                checkBox.setOnCheckedChangeListener(null);
                //チェック済みの項目をチェックにしておく
                checkBox.setChecked(nemophila.getSelectGenres().contains(item.getText()));
            } else {
                FilterDataModel item = (FilterDataModel) getItem(position);
                if (convertView == null) {
                    convertView = layoutInflater.inflate(R.layout.filter_friend_item, null);
                }

                TextView textView = convertView.findViewById(R.id.filter_text);
                TextView nameTextView = convertView.findViewById(R.id.filter_name);
                textView.setText(item.text);
                nameTextView.setText(item.nameText);

                checkBox = convertView.findViewById(R.id.filter_checkbox);
                checkBox.setOnCheckedChangeListener(null);
                //チェック済みの項目をチェックにしておく
                checkBox.setChecked(nemophila.getSelectFriends().contains(item.getText()));
            }

            // チェックボックスを押したときの処理 //bがtrueでチェック状態を指す
            checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                    if(b) {
                        if(isGenre) {
                            //Toast.makeText(MapsActivity.this, listData.get(position).getText(), Toast.LENGTH_SHORT).show();
                            nemophila.setSelectGenres(listData.get(position).getText());
                        } else {
                            nemophila.setSelectFriends(listData.get(position).getText());
                        }
                    } else {
                        if(isGenre) {
                            //Toast.makeText(MapsActivity.this, listData.get(position).getText(), Toast.LENGTH_SHORT).show();
                            nemophila.removeSelectGenres(listData.get(position).getText());

                        } else {
                            nemophila.removeSelectFriends(listData.get(position).getText());
                        }
                    }
                    FilterDataModel data = getItem(position);
                    data.isChecked = b;
                    Collection<Shop> shops = shopsViewModel.getPreShoplist();

                    if ( shops != null ) {
                        System.out.println(shops);
                        nemophila.getSelectGenres();

                        for (Shop shop : shops) {
                            Marker setMarker = shopsViewModel.getMarker(shop);

                            //自分とそのフレンド以外の投稿は確認しない
                            if (shop.getUserIdSet().contains(nemophila.getUid()) || shop.getUserIdSet().contains(friendsData)) {
                                //場合分け
                                //フィルターを一切かけていないとき
                                if(nemophila.getSelectGenres().isEmpty() && nemophila.getSelectFriends().isEmpty()){
                                    setMarker.setVisible(true);
                                }
                                //ジャンルのみフィルターをかけているとき
                                else if(nemophila.getSelectFriends().isEmpty()) {
                                    for(String genre : nemophila.getSelectGenres()) {
                                        if(shop.getGenreSet().contains(genre)) {
                                            setMarker.setVisible(true);
                                        } else {
                                            setMarker.setVisible(false);
                                        }
                                    }
                                }
                                //フレンドのみフィルターをかけているとき
                                else if(nemophila.getSelectGenres().isEmpty()) {
                                    for(String friendId : nemophila.getSelectFriends()) {
                                        if(shop.getUserIdSet().contains(friendId)) {
                                            setMarker.setVisible(true);
                                        } else {
                                            setMarker.setVisible(false);
                                        }
                                    }
                                }
                                //どちらもフィルターをかけているとき
                                else {
                                    for(String genre : nemophila.getSelectGenres()) {
                                        for(String friendId : nemophila.getSelectFriends()) {
                                            if (shop.getGenreSet().contains(genre) && shop.getUserIdSet().contains(friendId)) {
                                                setMarker.setVisible(true);
                                            } else {
                                                setMarker.setVisible(false);
                                            }
                                        }
                                    }
                                }
                            } else {
                                setMarker.setVisible(false);
                            }
                        }
                    }
                }
            });

            return convertView;
        }
    }

    private static class FilterDataModel{
        private String text;
        private String nameText;

        private boolean isChecked;

        public String getText() {
            return text;
        }
        public String getNameText() {
            return nameText;
        }

        public boolean isChecked() {
            return isChecked;
        }

        public void setText(String text) {
            this.text = text;
        }
        public void setNameText(String text) {
            this.nameText = text;
        }

        public void setChecked(boolean checked) {
            isChecked = checked;
        }
    }

}