diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9d1c6dc..b682eed 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + { -// geoCode(query); -// }).start(); -// return false; -// } -// -// @Override -// public boolean onQueryTextChange(String newText) { -// return false; -// } -// }); + // 検索バーの処理 + SearchView searchView = findViewById(R.id.tool_search); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + + //文字列を入力後にEnterなど、検索確定したとき + @Override + public boolean onQueryTextSubmit(String query) { + if(query == null) { + Toast.makeText(MapsActivity.this, + String.format("住所や施設名を入力してください"), + Toast.LENGTH_SHORT) + .show(); + } else { + System.out.println("------検索内容---------"); + System.out.println(query); + System.out.println("----------------------"); + //mapsFragment側で地名検索,見つかった場合はその地点に画面移動 + mapsFragment.SeachLocation(query); + } + return false; + } + + //検索文字に変化があったとき + @Override + public boolean onQueryTextChange(String newText) { + System.out.println("------文字列変化検出------"); + System.out.println(newText); + System.out.println("----------------------"); + return false; + } + }); //filterDialog = new FilterDialog(); diff --git a/app/src/main/java/com/example/nemophila/MapsFragment.java b/app/src/main/java/com/example/nemophila/MapsFragment.java index 20e9e3d..e7b1f33 100644 --- a/app/src/main/java/com/example/nemophila/MapsFragment.java +++ b/app/src/main/java/com/example/nemophila/MapsFragment.java @@ -24,6 +24,7 @@ import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; +import android.os.AsyncTask; import android.os.Bundle; import android.provider.Settings; import android.util.Log; @@ -34,6 +35,14 @@ import android.widget.TextView; import android.widget.Toast; +import android.content.Context; +import android.location.Address; +import android.location.Geocoder; +import android.text.TextUtils; +import java.io.IOException; +import java.util.List; +import java.util.Locale; + import com.example.nemophila.databinding.ActivityMainBinding; import com.example.nemophila.entities.AccountNameJson; import com.example.nemophila.entities.Post; @@ -43,6 +52,8 @@ import com.example.nemophila.viewmodels.ShopsViewModel; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; +import com.google.maps.*; +import com.google.maps.model.GeocodingResult; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptor; @@ -67,6 +78,7 @@ Nemophila nemophila; private GoogleMap mMap; + private GeoApiContext geoApiContext; private ActivityMainBinding binding; private LatLng currentLatlng = null; private LatLng initialLatlng; @@ -108,77 +120,76 @@ }); - // 店情報の更新が入った時の処理(LiveDataへの購読) shopsViewModel.getShopsLiveData().observe(getActivity(), shops -> { Toast.makeText(getActivity(), String.format("表示していない店を確認しました。ピンを立てます"), Toast.LENGTH_SHORT) .show(); - for (Shop shop : shops) { - if ( shopsViewModel.getMarker(shop) == null) { //フレンド以外の投稿のピンも立てたい場合 - //各shopに対応するMarkerがなければMarkerを立てる - shopLatlng = new LatLng(shop.getLatitude(), shop.getLongitude()); - System.out.println(shopLatlng); - Marker createMarker = mMap.addMarker(new MarkerOptions().position(shopLatlng).title("")); - //マーカーに店情報を持たせる - createMarker.setTag(shop); + for (Shop shop : shops) { + if (shopsViewModel.getMarker(shop) == null) { //フレンド以外の投稿のピンも立てたい場合 + //各shopに対応するMarkerがなければMarkerを立てる + shopLatlng = new LatLng(shop.getLatitude(), shop.getLongitude()); + System.out.println(shopLatlng); + Marker createMarker = mMap.addMarker(new MarkerOptions().position(shopLatlng).title("")); + //マーカーに店情報を持たせる + createMarker.setTag(shop); - //ShopToMarkerに紐づけ - shopsViewModel.setShopAndMarker(shop, createMarker); - System.out.println(friendsData); + //ShopToMarkerに紐づけ + shopsViewModel.setShopAndMarker(shop, createMarker); + System.out.println(friendsData); - ArrayList userIdSet = (ArrayList)shop.getUserIdSet().clone(); - friendsData.add(nemophila.getUid()); - userIdSet.retainAll(friendsData); + ArrayList userIdSet = (ArrayList) shop.getUserIdSet().clone(); + friendsData.add(nemophila.getUid()); + userIdSet.retainAll(friendsData); - //自分とそのフレンド以外の投稿は確認しない - if( userIdSet.size() > 0) { - //場合分け - //フィルターを一切かけていないとき - if(nemophila.getSelectGenres().isEmpty() && nemophila.getSelectFriends().isEmpty()){ - createMarker.setVisible(true); - } - //ジャンルのみフィルターをかけているとき - else if(nemophila.getSelectFriends().isEmpty()) { - for(String genre : nemophila.getSelectGenres()) { - if(shop.getGenreSet().contains(genre)) { - createMarker.setVisible(true); - break; - } else { - createMarker.setVisible(false); - } - } - } - //フレンドのみフィルターをかけているとき - else if(nemophila.getSelectGenres().isEmpty()) { - for(String friendId : nemophila.getSelectFriends()) { - if(shop.getUserIdSet().contains(friendId)) { - createMarker.setVisible(true); - break; - } else { - createMarker.setVisible(false); - } - } - } - //どちらもフィルターをかけているとき - else { - for(String genre : nemophila.getSelectGenres()) { - for(String friendId : nemophila.getSelectFriends()) { - if (shop.getGenreSet().contains(genre) && shop.getUserIdSet().contains(friendId)) { - createMarker.setVisible(true); - break; - } else { - createMarker.setVisible(false); - } - } - } - } - } else { - createMarker.setVisible(false); + //自分とそのフレンド以外の投稿は確認しない + if (userIdSet.size() > 0) { + //場合分け + //フィルターを一切かけていないとき + if (nemophila.getSelectGenres().isEmpty() && nemophila.getSelectFriends().isEmpty()) { + createMarker.setVisible(true); } + //ジャンルのみフィルターをかけているとき + else if (nemophila.getSelectFriends().isEmpty()) { + for (String genre : nemophila.getSelectGenres()) { + if (shop.getGenreSet().contains(genre)) { + createMarker.setVisible(true); + break; + } else { + createMarker.setVisible(false); + } + } + } + //フレンドのみフィルターをかけているとき + else if (nemophila.getSelectGenres().isEmpty()) { + for (String friendId : nemophila.getSelectFriends()) { + if (shop.getUserIdSet().contains(friendId)) { + createMarker.setVisible(true); + break; + } else { + createMarker.setVisible(false); + } + } + } + //どちらもフィルターをかけているとき + else { + for (String genre : nemophila.getSelectGenres()) { + for (String friendId : nemophila.getSelectFriends()) { + if (shop.getGenreSet().contains(genre) && shop.getUserIdSet().contains(friendId)) { + createMarker.setVisible(true); + break; + } else { + createMarker.setVisible(false); + } + } + } + } + } else { + createMarker.setVisible(false); } } + } }); // 長押しを認識した後の処理(LiveDataへの購読) @@ -188,9 +199,9 @@ Toast.LENGTH_SHORT) .show(); - //長押し時は周辺のピンを全て取得し、ダイアログに表示する - DialogFragment dialogFragment = new MapsDialogFragment(shops); - dialogFragment.show(getActivity().getSupportFragmentManager(),"mapsdialog"); + //長押し時は周辺のピンを全て取得し、ダイアログに表示する + DialogFragment dialogFragment = new MapsDialogFragment(shops); + dialogFragment.show(getActivity().getSupportFragmentManager(), "mapsdialog"); }); //初期画面の座標(現在地をロードするまで表示) @@ -212,16 +223,16 @@ }); - // test用 座標を確認するため - // タップした時のリスナーをセット - mMap.setOnMapClickListener(tapLocation -> { - // map(ピン以外)をtapされた位置の緯度経度 - tapLatlng = new LatLng(tapLocation.latitude, tapLocation.longitude); - Toast.makeText(getActivity(), - String.format("%s", tapLatlng), - Toast.LENGTH_SHORT) - .show(); - }); + // test用 座標を確認するため + // タップした時のリスナーをセット + mMap.setOnMapClickListener(tapLocation -> { + // map(ピン以外)をtapされた位置の緯度経度 + tapLatlng = new LatLng(tapLocation.latitude, tapLocation.longitude); + Toast.makeText(getActivity(), + String.format("%s", tapLatlng), + Toast.LENGTH_SHORT) + .show(); + }); //長押し時に店を作成し、その座標にピンを立てる @@ -237,7 +248,7 @@ //テスト用 //shopsViewModel.longClickViewArea(longpushLocation.longitude+1, longpushLocation.latitude+1, longpushLocation.longitude-1, longpushLocation.latitude-1); //本番環境は↓の範囲で - shopsViewModel.longClickViewArea(longpushLocation.longitude+0.001, longpushLocation.latitude+0.001, longpushLocation.longitude-0.001, longpushLocation.latitude-0.001); + shopsViewModel.longClickViewArea(longpushLocation.longitude + 0.001, longpushLocation.latitude + 0.001, longpushLocation.longitude - 0.001, longpushLocation.latitude - 0.001); }); // ピンをクリックした場合 @@ -245,7 +256,7 @@ @Override public boolean onMarkerClick(Marker marker) { //現在地マーカーをクリックしたときのみ例外 - if(marker.getTag() == null) { + if (marker.getTag() == null) { //以下の処理をストップ return false; } @@ -285,8 +296,7 @@ requestPermissionLauncher.launch( Manifest.permission.ACCESS_FINE_LOCATION); - } - else{ + } else { locationStart(); } @@ -305,7 +315,7 @@ } - private void zoomMap(double latitude, double longitude) { + public void zoomMap(double latitude, double longitude) { // 表示する東西南北の緯度経度を設定 double south = latitude * (1 - 0.00005); double west = longitude * (1 - 0.00005); @@ -338,7 +348,7 @@ //初回現在地取得時 if (currentMarker == null) { - currentMarker=mMap.addMarker(new MarkerOptions().position(current_location).title("現在地").icon(bd)); + currentMarker = mMap.addMarker(new MarkerOptions().position(current_location).title("現在地").icon(bd)); } else { //2回目移行 currentMarker.setPosition(current_location); @@ -352,8 +362,7 @@ isGranted -> { if (isGranted) { locationStart(); - } - else { + } else { Toast toast = Toast.makeText(getActivity(), "これ以上なにもできません", Toast.LENGTH_SHORT); toast.show(); @@ -362,8 +371,8 @@ //現在地の取得 @SuppressLint("MissingPermission") - private void locationStart(){ - Log.d("debug","locationStart()"); + private void locationStart() { + Log.d("debug", "locationStart()"); // LocationManager インスタンス生成 locationManager = @@ -399,7 +408,7 @@ @Override public void onLocationChanged(Location location) { //初期画面は現在地を中心にするため... - if (currentLatlng == null){ + if (currentLatlng == null) { //↓現在地ロード後画面中心を現在地にする場合 //zoomMap(location.getLatitude(), location.getLongitude()); //ロード画面の終了 @@ -409,7 +418,7 @@ getView().findViewById(R.id.currentButton).setVisibility(View.VISIBLE); ImageButton button1 = getView().findViewById(R.id.currentButton); - button1.setOnClickListener( v -> { + button1.setOnClickListener(v -> { Log.d("debug", "currentbutton, 現在地にカメラを移動"); System.out.println(shopsViewModel.getShopsLiveData().getValue()); //現在地にカメラを移動 @@ -422,7 +431,49 @@ currentLatlng = new LatLng(location.getLatitude(), location.getLongitude()); //現在地アイコンを表示.このsetIcon内にzoomMap処理もあるので注意 - setIcon(location.getLatitude(),location.getLongitude()); + setIcon(location.getLatitude(), location.getLongitude()); + } + + //住所・施設名などから緯度経度を検索するメソッド + public void SeachLocation(String seachText) { + // Geocoderを使用して緯度経度を取得し移動 + LatLng latLng = getLatLngFromAddress(seachText); + if (latLng != null) { + System.out.println("-------検索地点の座標取得完了!--------"); + System.out.println("緯度: " + latLng.latitude + "\n経度: " + latLng.longitude); + System.out.println("-----------------------------------"); + + Toast.makeText(getActivity(), + String.format("該当の地点に移動します"), + Toast.LENGTH_SHORT) + .show(); + nemophila.setZoom(18f); + zoomMap(latLng.latitude, latLng.longitude); + } else { + //緯度経度取得ミス + System.out.println("-------検索地点の座標取得失敗--------"); + Toast.makeText(getActivity(), + String.format("該当の地点が見つかりませんでした"), + Toast.LENGTH_SHORT) + .show(); + } + } + + // 住所から緯度経度を取得するメソッド + private LatLng getLatLngFromAddress(String address) { + Geocoder geocoder = new Geocoder(requireContext(), Locale.getDefault()); + try { + List
addresses = geocoder.getFromLocationName(address, 1); + if (addresses != null && !addresses.isEmpty()) { + Address firstAddress = addresses.get(0); + double latitude = firstAddress.getLatitude(); + double longitude = firstAddress.getLongitude(); + return new LatLng(latitude, longitude); + } + } catch (IOException e) { + e.printStackTrace(); + } + return null; } @Override