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; 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; } // 内部クラス 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(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); } } } } } } } }); 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; } } }