diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index e58179e..63e623f 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -12,6 +12,6 @@ - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 87dc5c1..1adffca 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -39,7 +39,7 @@ - + @@ -49,9 +49,10 @@ + - + 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 @@ + NameToId; // フィルターのリスト用 @@ -61,7 +55,7 @@ ListView list; boolean isGenre; String genreData[]; - ArrayList friendsData; + ArrayList UsersData; @Override @@ -95,24 +89,37 @@ // 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; -// } -// }); + // 検索バーの処理 + SearchView searchView = findViewById(R.id.tool_search); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { - //filterDialog = new FilterDialog(); + //文字列を入力後に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; + } + }); // サイドメニューのボタン Button genreButton = findViewById(R.id.filter_genre_button); @@ -131,15 +138,11 @@ }); // サイドメニューのフィルターのリストの準備 - genreData = new String[]{"中華", "和食", "イタリアン", "フレンチ", "カフェ", "バー", "居酒屋", "ラーメン", "うどん・そば", "その他 海外料理"}; - friendsData = new ArrayList<>(); - //NameToId = new HashMap<>(); + genreData = new String[]{"和食", "洋食", "中華", "イタリアン", "フレンチ", "その他海外料理", "カフェ", "バー", "居酒屋", "焼肉", "鍋", "カレー", "丼", "ラーメン", "うどん", "そば", "その他"}; + UsersData = new ArrayList<>(); -// friendsData[0] = "iyo"; -// friendsData[1] = "iyo2"; -// friendsData[2] = "superiyo"; -// friendsData[3] = "perfectiyo"; -// friendsData[4] = "finaliyo"; + //自分自身をfilterにかけられるように追加しておく + UsersData.add(nemophila.getUid()); //フレンド一覧を取得 friendViewModel.getFriends(nemophila.getUid()); @@ -147,8 +150,7 @@ @Override public void onChanged(Collection friends) { for (AccountNameJson friend : friends) { - friendsData.add(friend.getUid()); - //NameToId.put(friend.getName(), friend.getUid()); + UsersData.add(friend.getUid()); } } }); @@ -209,7 +211,7 @@ return super.onOptionsItemSelected(item); } - + //ジャンルfilter設定画面になったとき public void prepareGenreList(String s){ //sは検索欄に入力された文字列 @@ -241,6 +243,7 @@ list.deferNotifyDataSetChanged(); } + //ユーザーfilter設定画面になったとき public void prepareFriendList(String s){ //sは検索欄に入力された文字列 @@ -249,20 +252,25 @@ // 一度リストのデータを取り除いてから追加する listData.clear(); + + FilterDataModel fd = new FilterDataModel(); + fd.setText(nemophila.getUid()); + fd.setNameText(nemophila.getName()); + listData.add(fd); for (AccountNameJson friend : nemophila.getFriends()) { if(s == null) { - FilterDataModel fd = new FilterDataModel(); - fd.setText(friend.getUid()); - fd.setNameText(friend.getName()); - listData.add(fd); + FilterDataModel fd2 = new FilterDataModel(); + fd2.setText(friend.getUid()); + fd2.setNameText(friend.getName()); + listData.add(fd2); } else { //検索にヒットしたフレンドのみのリストにする if(friend.getName().contains(s)){ - FilterDataModel fd = new FilterDataModel(); - fd.setText(friend.getUid()); - fd.setNameText(friend.getName()); - listData.add(fd); + FilterDataModel fd2 = new FilterDataModel(); + fd2.setText(friend.getUid()); + fd2.setNameText(friend.getName()); + listData.add(fd2); } } } @@ -281,6 +289,10 @@ return false; } + public void setMapsFragment(MapsFragment mapsFragment) { + this.mapsFragment = mapsFragment; + } + // 内部クラス private class MyAdapter extends ArrayAdapter { private LayoutInflater layoutInflater; @@ -290,7 +302,7 @@ layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } - // 画面外に行ったときにチェックがずれないようにする + // 画面外に行ったときにチェックがはずれないようにする @Override public View getView(int position, View convertView, ViewGroup parent) { CheckBox checkBox; @@ -330,67 +342,76 @@ 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; + //shopsViewModelのPreShoplistは、現在取得した全てのshopを持っている Collection 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); - } + ArrayList userIdSet = (ArrayList)shop.getUserIdSet().clone(); + UsersData.add(nemophila.getUid()); + userIdSet.retainAll(UsersData); + + //自分とそのフレンド以外の投稿は確認しない + if( userIdSet.size() > 0) { + //場合分け + //フィルターを一切かけていないとき + if(nemophila.getSelectGenres().isEmpty() && nemophila.getSelectFriends().isEmpty()){ + setMarker.setVisible(true); } - } - //フレンドのみフィルターをかけているとき - 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)) { + //ジャンルのみフィルターをかけているとき + else if(nemophila.getSelectFriends().isEmpty()) { + for(String genre : nemophila.getSelectGenres()) { + if(shop.getGenreSet().contains(genre)) { setMarker.setVisible(true); + break; } else { setMarker.setVisible(false); } } } + //フレンドのみフィルターをかけているとき + else if(nemophila.getSelectGenres().isEmpty()) { + for(String friendId : nemophila.getSelectFriends()) { + if(shop.getUserIdSet().contains(friendId)) { + setMarker.setVisible(true); + break; + } 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); + break; + } else { + setMarker.setVisible(false); + } + } + } + } + } else { + setMarker.setVisible(false); } } } @@ -410,13 +431,6 @@ public String getText() { return text; } - public String getNameText() { - return nameText; - } - - public boolean isChecked() { - return isChecked; - } public void setText(String text) { this.text = text; @@ -425,9 +439,6 @@ this.nameText = text; } - public void setChecked(boolean checked) { - isChecked = checked; - } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/nemophila/MapsFragment.java b/app/src/main/java/com/example/nemophila/MapsFragment.java index 053faca..ce1422c 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,7 +35,16 @@ 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; import com.example.nemophila.entities.Shop; import com.example.nemophila.viewmodels.FriendViewModel; @@ -42,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; @@ -66,18 +78,15 @@ Nemophila nemophila; private GoogleMap mMap; + private GeoApiContext geoApiContext; private ActivityMainBinding binding; private LatLng currentLatlng = null; private LatLng initialLatlng; private LatLng shopLatlng; -// private LatLng testLatlng; -// private LatLng testLatlng2; private LatLng tapLatlng; -// private CameraPosition nowCamera; -// private LatLng nowLatlng; private Marker currentMarker; private BitmapDescriptor bd; - private boolean isLongClick; + ArrayList friendsData; LocationManager locationManager; @@ -95,77 +104,94 @@ friendViewModel = new ViewModelProvider(getActivity()).get(FriendViewModel.class); postsViewModel = new ViewModelProvider(getActivity()).get(PostsViewModel.class); - + friendsData = new ArrayList<>(); //フレンドの更新が入った時の処理(LiveDataへの購読) friendViewModel.getFriends(nemophila.getUid()); friendViewModel.getFriendsLiveData().observe(getActivity(), friends -> { - Toast.makeText(getActivity(), - String.format("フレンドの更新を確認しました。"), - Toast.LENGTH_SHORT) - .show(); //nemophilaにセットしておく nemophila.setFriends(friends); + for (AccountNameJson friend : friends) { + friendsData.add(friend.getUid()); + } }); - // 店情報の更新が入った時の処理(LiveDataへの購読) shopsViewModel.getShopsLiveData().observe(getActivity(), shops -> { - Toast.makeText(getActivity(), - String.format("表示していない店を確認しました。ピンを立てます"), - Toast.LENGTH_SHORT) - .show(); - for (Shop shop : shops) { - if ( shopsViewModel.getMarker(shop) == null) { //フレンド以外の投稿のピンも立てたい場合 + 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); - //各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(String genre : nemophila.getSelectGenres()) { - if(shop.getGenreSet().contains(genre)) { - createMarker.setVisible(true); - } else { - createMarker.setVisible(false); + //ShopToMarkerに紐づけ + shopsViewModel.setShopAndMarker(shop, createMarker); + System.out.println(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); + } } } - -// if ( !nemophila.getSelectFriends().isEmpty() ) { -// createMaker.setVisible(false); -// } - - //ShopToMarkerに紐づけ - shopsViewModel.setShopAndMarker(shop, createMarker); + //フレンドのみフィルターをかけているとき + 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 { -// //すでに立っているピンをフィルター掛け -// Marker setMaker = shopsViewModel.getMarker(shop); -// if ( !nemophila.getSelectGenres().isEmpty() ) { -// setMaker.setVisible(false); -// } -// if ( !nemophila.getSelectFriends().isEmpty() ) { -// setMaker.setVisible(false); -// } + createMarker.setVisible(false); } } + } }); // 長押しを認識した後の処理(LiveDataへの購読) shopsViewModel.getNearShopsLiveData().observe(getActivity(), shops -> { - Toast.makeText(getActivity(), - String.format("近辺の店を確認しました。ダイアログを表示します"), - Toast.LENGTH_SHORT) - .show(); - - //長押し時は周辺のピンを全て取得し、ダイアログに表示する - DialogFragment dialogFragment = new MapsDialogFragment(shops); - dialogFragment.show(getActivity().getSupportFragmentManager(),"mapsdialog"); + //長押し時は周辺のピンを全て取得し、ダイアログに表示する + DialogFragment dialogFragment = new MapsDialogFragment(shops); + dialogFragment.show(getActivity().getSupportFragmentManager(), "mapsdialog"); }); //初期画面の座標(現在地をロードするまで表示) - //initialLatlng = new LatLng(39,138); initialLatlng = new LatLng(nemophila.getCameraLatitude(), nemophila.getCameraLongitude()); //初期画面に移動 mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(initialLatlng, nemophila.getZoom())); @@ -174,7 +200,6 @@ //画面が動いたとき mMap.setOnCameraIdleListener(() -> { //カメラの座標とZOOM倍率を保存 - //nowCamera = mMap.getCameraPosition(); nemophila.setCameraLatitude(mMap.getCameraPosition().target.latitude); nemophila.setCameraLongitude(mMap.getCameraPosition().target.longitude); nemophila.setZoom(mMap.getCameraPosition().zoom); @@ -183,26 +208,21 @@ }); - // 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(); +// }); //長押し時に店を作成し、その座標にピンを立てる //長押し時にその座標を保存し、投稿画面に移り、Shop作成完了時にはピンを立て、Shop画面に移行 mMap.setOnMapLongClickListener(longpushLocation -> { - //長押しされた位置の緯度経度を取得 - //LatLng newlocation = new LatLng(longpushLocation.latitude, longpushLocation.longitude); - - //長押し座標を画面中心にしておく - //zoomMap(longpushLocation.latitude, longpushLocation.longitude); //Nemophilaに座標を保存 nemophila.setCurrentLatitude(longpushLocation.latitude); nemophila.setCurrentLongitude(longpushLocation.longitude); @@ -213,21 +233,15 @@ //テスト用 //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); }); // ピンをクリックした場合 mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { - //店の詳細と投稿一覧を表示 - //ここでshopActivityを呼び出す - - //下からクリックしたことを通知 - //Toast.makeText(getActivity(), "ピンクリック", Toast.LENGTH_SHORT).show(); - //現在地マーカーをクリックしたときのみ例外 - if(marker.getTag() == null) { + if (marker.getTag() == null) { //以下の処理をストップ return false; } @@ -260,9 +274,6 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - //binding = ActivityMainBinding.inflate(getLayoutInflater()); - //getActivity().setContentView(binding.getRoot()); - if (ActivityCompat.checkSelfPermission( getContext(), Manifest.permission.ACCESS_FINE_LOCATION) @@ -270,16 +281,11 @@ requestPermissionLauncher.launch( Manifest.permission.ACCESS_FINE_LOCATION); - } - else{ + } else { locationStart(); } -// // Obtain the SupportMapFragment and get notified when the map is ready to be used. -// SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() -// .findFragmentById(R.id.map); -// assert mapFragment != null; -// mapFragment.getMapAsync(this); + ((MapsActivity) getContext()).setMapsFragment(this); SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map); @@ -294,7 +300,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); @@ -303,7 +309,6 @@ LatLng latlng = new LatLng(latitude, longitude); - // LatLngBounds (LatLng southwest, LatLng northeast) //左下、右上 LatLngBounds bounds = LatLngBounds.builder() .include(new LatLng(south, west)) @@ -328,9 +333,9 @@ //初回現在地取得時 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回目移行 + //2回目以降 currentMarker.setPosition(current_location); } } @@ -342,18 +347,17 @@ isGranted -> { if (isGranted) { locationStart(); - } - else { + } else { Toast toast = Toast.makeText(getActivity(), - "これ以上なにもできません", Toast.LENGTH_SHORT); + "エラー", Toast.LENGTH_SHORT); toast.show(); } }); //現在地の取得 @SuppressLint("MissingPermission") - private void locationStart(){ - Log.d("debug","locationStart()"); + private void locationStart() { + Log.d("debug", "locationStart()"); // LocationManager インスタンス生成 locationManager = @@ -389,7 +393,7 @@ @Override public void onLocationChanged(Location location) { //初期画面は現在地を中心にするため... - if (currentLatlng == null){ + if (currentLatlng == null) { //↓現在地ロード後画面中心を現在地にする場合 //zoomMap(location.getLatitude(), location.getLongitude()); //ロード画面の終了 @@ -399,7 +403,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()); //現在地にカメラを移動 @@ -412,7 +416,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 diff --git a/app/src/main/java/com/example/nemophila/MyPageActivity.java b/app/src/main/java/com/example/nemophila/MyPageActivity.java index d332234..c6ef3de 100644 --- a/app/src/main/java/com/example/nemophila/MyPageActivity.java +++ b/app/src/main/java/com/example/nemophila/MyPageActivity.java @@ -62,15 +62,6 @@ } }); - // 「フレンド申請する」ボタンを押したときにフレンド申請画面へ遷移する - Button requestingButton = (Button) findViewById(R.id.requesting); - requestingButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - Intent intent = new Intent(MyPageActivity.this, FriendActivity.class); - startActivity(intent); - } - }); - // 「フレンド許可する」ボタンを押したときにフレンド許可画面へ遷移する Button requestedButton = (Button) findViewById(R.id.requested); requestedButton.setOnClickListener(new View.OnClickListener() { @@ -138,6 +129,8 @@ for (Post post: Posts){ MyPageActDataModel data = new MyPageActDataModel(); data.setDate(post.getDate()); + data.setName(post.getName()); + data.setGenre(post.getGenre()); //rateはintで受け取った評価に対応した星の数のStringに変換してセット int intRate = post.getRate(); String strRate = ""; @@ -149,7 +142,6 @@ } } data.setRate(strRate); - data.setGenre(post.getGenre()); data.setComment(post.getComment()); data.setPid(post.getPid()); myPageActDataset.add(data); @@ -188,6 +180,7 @@ @Override public void onBindViewHolder(@NonNull MyPageActViewHolder holder, int position) { + holder.nameView.setText(list.get(position).getName()); holder.dateView.setText(list.get(position).getDate()); holder.rateView.setText(list.get(position).getRate()); holder.genreView.setText(list.get(position).getGenre()); @@ -202,6 +195,7 @@ // ViewHolder public class MyPageActViewHolder extends RecyclerView.ViewHolder { + public TextView nameView; public TextView dateView; public TextView rateView; public TextView genreView; @@ -210,6 +204,7 @@ public MyPageActViewHolder(@NonNull View view) { super(view); + nameView = (TextView) view.findViewById(R.id.nameOfShop); dateView = (TextView) view.findViewById(R.id.date); rateView = (TextView) view.findViewById(R.id.rate); genreView = (TextView) view.findViewById(R.id.genre); @@ -220,12 +215,16 @@ // DataModel public static class MyPageActDataModel { + private String name; private String date; private String rate; private String genre; private String comment; private String pid; + public String getName() { return name; } + public void setName(String name) { this.name = name; } + public String getDate() { return date; } @@ -255,6 +254,6 @@ } public String getPid() { return pid; } - public void setPid(String sid) { this.pid = pid; } + public void setPid(String pid) { this.pid = pid; } } } diff --git a/app/src/main/java/com/example/nemophila/MyPageEditorActivity.java b/app/src/main/java/com/example/nemophila/MyPageEditorActivity.java index 4ff7896..458568c 100644 --- a/app/src/main/java/com/example/nemophila/MyPageEditorActivity.java +++ b/app/src/main/java/com/example/nemophila/MyPageEditorActivity.java @@ -1,64 +1,174 @@ package com.example.nemophila; +import androidx.activity.result.ActivityResultCallback; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AppCompatActivity; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; +import android.app.AlertDialog; +import android.content.DialogInterface; import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; import android.os.Bundle; +import android.os.Handler; import android.view.Gravity; import android.view.View; 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.viewmodels.AccountViewModel; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Base64; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + public class MyPageEditorActivity extends AppCompatActivity { + //フィールド + private String icon; + private Nemophila nemophila; + private String uid; + private String token; + private ImageButton iconButton; + private ExecutorService executor; + private Handler handler; + private String iconUrlString; + //マイページ編集画面の作成 + private ActivityResultLauncher launcher = registerForActivityResult(new ActivityResultContracts.OpenDocument(), new ActivityResultCallback() { + @Override + public void onActivityResult(Uri uri) { + if(uri == null)return; + icon = new String(Base64.getEncoder().encode(uri.toString().getBytes())); + ImageButton changeIconButton = findViewById(R.id.changeIconButton); + changeIconButton.setImageURI(uri); + } + }); + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_page_editor); - //LiveDataへの購読 + // 初期化 AccountViewModel accountViewModel = new ViewModelProvider(this).get(AccountViewModel.class); - Nemophila nemophila = (Nemophila) getApplication(); - String name = nemophila.getName(); - EditText myName = (EditText) findViewById(R.id.editName); - myName.setText(name); + nemophila = (Nemophila) getApplication(); + uid = nemophila.getUid(); + token = nemophila.getToken(); + iconButton = findViewById(R.id.changeIconButton); + executor = Executors.newSingleThreadExecutor(); + handler = new Handler(); + iconUrlString = "http://nitta-lab-www.is.konan-u.ac.jp/nemophila-data/test01.jpg"; + + // アカウントのアイコンを表示 + setIcon(iconButton); //MyPageに戻るボタン - ImageButton backButton = (ImageButton) findViewById(R.id.backMyPage); - backButton.setOnClickListener(new View.OnClickListener() { + ImageButton backButton = findViewById(R.id.backMyPage); + backButton.setOnClickListener(v -> finish()); + + iconButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { - Intent intent = new Intent(MyPageEditorActivity.this, MyPageActivity.class); - startActivity(intent); + launcher.launch(new String[] {"image/*"}); } }); - //LiveDataへの購読 + + //変更確定ボタンを押した場合の動き + Button changeDecisionButton = findViewById(R.id.changeConfirm); + changeDecisionButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + //名前とパスワードを取り込む + EditText editName = findViewById(R.id.editName); + String newName = editName.getText().toString(); + EditText editOldPw = findViewById(R.id.editOldPw); + String oldPw = editOldPw.getText().toString(); + EditText editNewPw = findViewById(R.id.editNewPw); + String newPw = editNewPw.getText().toString(); + + // 名前が入力されているとき通信を行う + if(newName.length() > 0) { + System.out.println(newName); + accountViewModel.changeName(uid, newName, token); + } + // パスワードが入力されているとき通信を行う + if(oldPw.length() > 0 && newPw.length() > 0) { + accountViewModel.changePw(uid, oldPw, newPw, token); + } + // アイコンが入力されているとき通信を行う + if(icon != null){ + accountViewModel.changeIcon(uid, icon, token); + } + + } + }); + + // ログアウトボタンを押したときの処理 + Button logoutButton = findViewById(R.id.logoutButton); + logoutButton.setOnClickListener(v -> { + new AlertDialog.Builder(this) + .setTitle("本当にログアウトしますか?") + .setPositiveButton("OK", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + nemophila.logout(); + Intent intent = new Intent(MyPageEditorActivity.this, LoginActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + } + }) + .setNeutralButton("キャンセル", null) + .create() + .show(); + }); + + // 削除ボタンを押したときの処理 + Button deleteAccountButton = findViewById(R.id.deleteAccount); + deleteAccountButton.setOnClickListener(v -> { + new AlertDialog.Builder(this) + .setTitle("本当に削除しますか?") + .setPositiveButton("OK", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { +// accountViewModel.deleteAccount(uid, token); + } + }) + .setNeutralButton("キャンセル", null) + .create() + .show(); + }); + + // ------------------------------ LiveDataへの購読 ------------------------------------------- // + // アカウントの名前を取得した際のLiveDataの購読 accountViewModel.getNameLiveData().observe(this, new Observer() { @Override public void onChanged(String name) { - TextView myName = (TextView) findViewById(R.id.editName); + TextView myName = findViewById(R.id.editName); myName.setText(name); nemophila.setName(name); } - }); - //LiveDataへの購読 + + // アカウントのパスワードを取得した際のLiveDataの購読 accountViewModel.getPwLiveData().observe(this, new Observer() { @Override public void onChanged(String Pw) { - Intent intent = new Intent(MyPageEditorActivity.this, MyPageActivity.class); - startActivity(intent); + finish(); } - }); - //LiveDataへの購読 + + // パスワードのエラーが発生した際のLiveDataの購読 accountViewModel.getPwErrorLiveData().observe(this, new Observer() { @Override public void onChanged(String name) { @@ -66,43 +176,44 @@ ts.setGravity(Gravity.CENTER, 0, 0); ts.show(); } - }); - //変更確定ボタンを押した場合の動き - Button changeNameButton = (Button) findViewById(R.id.changeConfirm); - changeNameButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - //名前とパスワードを取り込む - EditText editName = (EditText) findViewById(R.id.editName); - String newName = editName.getText().toString(); - EditText editOldPw = (EditText) findViewById(R.id.editOldPw); - String oldPw = editOldPw.getText().toString(); - EditText editNewPw = (EditText) findViewById(R.id.editNewPw); - String newPw = editNewPw.getText().toString(); - - //Nemophilaから(id)(token)をgetしてaccountViewModelに送る - String uid = nemophila.getUid(); - String token = nemophila.getToken(); - if(newName!=null) { - System.out.println(newName); - accountViewModel.changeName(uid, newName, token); - } - if(oldPw!=null && newPw!=null) { - accountViewModel.changePw(uid, oldPw, newPw, token); - } + // アカウントの削除をした際のLiveDataの購読 + accountViewModel.getSuccessDeleteAccountLiveData().observe(this, new Observer() { + @Override + public void onChanged(Boolean isSuccess) { + Intent intent = new Intent(MyPageEditorActivity.this, SignUpActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent); } }); - //削除ボタンを押したときの処理 - Button deleteAccountButton = (Button) findViewById(R.id.deleteAccount); - deleteAccountButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - String uid = nemophila.getUid(); - String token = nemophila.getToken(); - accountViewModel.deleteAccount(uid,token); - Intent intent = new Intent(MyPageEditorActivity.this, LoginActivity.class); - startActivity(intent); + // アカウントの削除をした際のエラーのLiveDataの購読 + accountViewModel.getDelAcErrorLiveData().observe(this, new Observer() { + @Override + public void onChanged(String s) { + Toast ts = Toast.makeText(MyPageEditorActivity.this, s, Toast.LENGTH_SHORT); + ts.setGravity(Gravity.CENTER, 0, 0); + ts.show(); + } + }); + } + + // アイコンに画像を設定 + private void setIcon(ImageView iv) { + executor.execute(() -> { + try{ + URL url = new URL(iconUrlString); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.connect(); + + InputStream is = con.getInputStream(); + + Bitmap bitmap = BitmapFactory.decodeStream(is); + handler.post(() -> iv.setImageBitmap(bitmap)); + is.close(); + con.disconnect(); + }catch (Exception e){ + e.printStackTrace(); } }); } diff --git a/app/src/main/java/com/example/nemophila/Nemophila.java b/app/src/main/java/com/example/nemophila/Nemophila.java index 00a9120..79c017d 100644 --- a/app/src/main/java/com/example/nemophila/Nemophila.java +++ b/app/src/main/java/com/example/nemophila/Nemophila.java @@ -207,4 +207,12 @@ return friendIds; } + // tokenを削除 + public void logout(){ + SharedPreferences preferences = getSharedPreferences("prefData", MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.remove("token"); + editor.commit(); + token = null; + } } diff --git a/app/src/main/java/com/example/nemophila/PostActivity.java b/app/src/main/java/com/example/nemophila/PostActivity.java index 07a4800..4bfff00 100644 --- a/app/src/main/java/com/example/nemophila/PostActivity.java +++ b/app/src/main/java/com/example/nemophila/PostActivity.java @@ -216,17 +216,22 @@ genreAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); genreAdapter.add("ジャンルを選択"); - genreAdapter.add("中華"); genreAdapter.add("和食"); + genreAdapter.add("洋食"); + genreAdapter.add("中華"); genreAdapter.add("イタリアン"); genreAdapter.add("フレンチ"); + genreAdapter.add("その他海外料理"); genreAdapter.add("カフェ"); genreAdapter.add("バー"); genreAdapter.add("居酒屋"); + genreAdapter.add("焼肉"); + genreAdapter.add("鍋"); + genreAdapter.add("カレー"); + genreAdapter.add("丼"); genreAdapter.add("ラーメン"); - genreAdapter.add("うどん・そば"); - genreAdapter.add("その他 海外料理"); - genreAdapter.add("その他 和食"); + genreAdapter.add("うどん"); + genreAdapter.add("そば"); genreAdapter.add("その他"); Spinner genreSpinner = (Spinner) findViewById(R.id.inputGenre); genreSpinner.setAdapter(genreAdapter); diff --git a/app/src/main/java/com/example/nemophila/ShopActivity.java b/app/src/main/java/com/example/nemophila/ShopActivity.java index d02d414..d9a9451 100644 --- a/app/src/main/java/com/example/nemophila/ShopActivity.java +++ b/app/src/main/java/com/example/nemophila/ShopActivity.java @@ -11,11 +11,15 @@ import androidx.recyclerview.widget.RecyclerView; import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.os.Bundle; +import android.os.Handler; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; +import android.widget.ImageView; import android.widget.TextView; import com.example.nemophila.entities.Account; @@ -24,13 +28,21 @@ import com.example.nemophila.entities.Shop; import com.example.nemophila.viewmodels.PostsViewModel; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; public class ShopActivity extends AppCompatActivity { private ShopAcAdapter adapter = null; + private final ExecutorService executor = Executors.newSingleThreadExecutor(); + private final Handler handler = new Handler(); + private String iconUrlString; @Override protected void onCreate(Bundle savedInstanceState) { @@ -41,6 +53,7 @@ String shopName; String sid; String myUid = ((Nemophila)getApplication()).getUid(); + Bitmap iconBitmap; //NemophilaからcurrentShopを取得、店名の表示 shop = ((Nemophila)getApplication()).getCurrentShop(); @@ -70,6 +83,29 @@ //フレンドを取得 Collection friends = ((Nemophila)getApplication()).getFriends(); + //Nemophilaから選択中のジャンル(HashSet)を受け取る + HashSet selectingGenre = ((Nemophila)getApplication()).getSelectGenres(); + //選択中のジャンルが何かあれば表示 + if(!(selectingGenre.isEmpty())) { + TextView genreView = (TextView) findViewById(R.id.shopAcGenre); + genreView.setText("選択中のジャンル:" + selectingGenre); + } + + //Nemophilaから選択中のフレンド(HashSet)を受け取る + HashSet selectingFriend = ((Nemophila)getApplication()).getSelectFriends(); + //選択したフレンドを表示するために名前を格納するHashSetを宣言 + HashSet selectingFriendName = new HashSet<>(); + //フレンド選択があればフレンド名をHashSetにセットし表示する + if(!(selectingFriend.isEmpty())) { + for (AccountNameJson friendNJ : friends) { + if (selectingFriend.contains(friendNJ.getUid())) { + selectingFriendName.add(friendNJ.getName()); + } + } + TextView friendView = (TextView) findViewById(R.id.shopAcFriend); + friendView.setText("選択中のフレンド:" + selectingFriendName); + } + //RecyclerViewに表示する中身を格納するリストを宣言 List postsDataset = new ArrayList<>(); @@ -78,7 +114,7 @@ RecyclerView rv = (RecyclerView) findViewById(R.id.postsList); adapter = new ShopAcAdapter(postsDataset); - //一行ずつを縦に(LinearLayout)表示するLayoutManagerを宣言 第三引数のtrueで降順に表示 + //一行ずつを縦に(LinearLayout)表示するLayoutManagerを宣言 LinearLayoutManager llm = new LinearLayoutManager(this); // RecyclerView.ItemDecoration itemDecoration = @@ -88,6 +124,7 @@ rv.setHasFixedSize(true); rv.setLayoutManager(llm); + //PostViewModelを宣言し、currentShopから取得したsidの店舗の投稿をロード PostsViewModel postsViewModel = new ViewModelProvider(this).get(PostsViewModel.class); postsViewModel.loadShopPost(sid); @@ -97,32 +134,17 @@ @Override public void onChanged(List ShopPosts) { - //Nemophilaから選択中のジャンル(HashSet)を受け取る - HashSet selectingGenre = ((Nemophila)getApplication()).getSelectGenres(); - - //選択中のジャンルが何かあれば表示 - if(!(selectingGenre.isEmpty())) { - TextView genreView = (TextView) findViewById(R.id.shopAcGenre); - genreView.setText("選択中のジャンル:" + selectingGenre); - } - - //Nemophilaから選択中のフレンド(HashSet)を受け取る - HashSet selectingFriend = ((Nemophila)getApplication()).getSelectFriends(); - //選択したフレンドを表示するために名前を格納するHashSetの宣言 - HashSet selectingFriendName = new HashSet<>(); - //postsDatasetを一旦クリアし、LiveDataから受け取ったデータを一つずつセット(重複しないように) postsDataset.clear(); int postViewFrag; for (Post post: ShopPosts){ - //dataを宣言 dataに投稿の必要なデータをセットし、それをpostsDatasetに追加してリストを作る + //dataを宣言 dataに投稿の必要なデータをpostから受け取ってセットし、それをpostsDatasetに追加してリストを作る ShopAcDataModel data = new ShopAcDataModel(); - //フィルター判定のためにgenreとuidを、表示用のセットのためにnameを先に読み込む + //フィルター判定のためにgenreとuidを先に読み込む String genre = post.getGenre(); String uid = post.getUid(); - String name = post.getName(); //投稿が自分もしくはフレンドのものかチェック postViewFrag = 0; @@ -138,12 +160,13 @@ //表示する投稿のみdataにセット if(postViewFrag == 1) { -// if(friends.contains(uid)){ //選択が何もない場合は全ての投稿を、選択がある場合は一致する投稿をdataにセット if (selectingGenre.isEmpty() || selectingGenre.contains(genre)) { if (selectingFriend.isEmpty() || selectingFriend.contains(uid)) { - data.setName(name); + data.setName(post.getName()); data.setDate(post.getDate()); + //アイコンをURLで取得、セット + //rateはintで受け取った評価に対応した星の数のStringに変換してセット int intRate = post.getRate(); String strRate = ""; @@ -158,21 +181,39 @@ data.setGenre(genre); data.setComment(post.getComment()); + //アイコン仮セット + //url作る + iconUrlString = "http://nitta-lab-www.is.konan-u.ac.jp/nemophila-data/test01.jpg"; + + executor.execute(() -> { + try{ + URL url = new URL(iconUrlString); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.connect(); + + InputStream is = con.getInputStream(); + + Bitmap bitmap = BitmapFactory.decodeStream(is); + handler.post(() -> { + data.setIcon(bitmap); + adapter.notifyItemChanged(adapter.getPosition(data)); + }); + is.close(); + con.disconnect(); + }catch (Exception e){ + e.printStackTrace(); + } + }); + + //画像がなければViewの表示をgoneに、あればvisibleにして画像をセット +// if(post.get) { +// } + //投稿一つの情報がdataに全部セットされたらDatasetに追加 postsDataset.add(0, data); } } } - //フレンド名を表示用HashSetにセット - if(!(selectingFriend.isEmpty()) && selectingFriend.contains(uid)) { - selectingFriendName.add(name); - } - } - - //フレンド選択があればフレンド名を表示する - if(!(selectingFriend.isEmpty())) { - TextView friendView = (TextView) findViewById(R.id.shopAcFriend); - friendView.setText("表示中のフレンド:" + selectingFriendName); } //RecyclerViewをonChangedが呼ばれるたび表示(アダプターを更新してRecyclerViewにセット) @@ -196,6 +237,8 @@ this.list = list; } + public int getPosition(ShopAcDataModel data) { return list.indexOf(data); } + @NonNull @Override public ShopAcViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -212,6 +255,27 @@ holder.rateView.setText(list.get(position).getRate()); holder.genreView.setText(list.get(position).getGenre()); holder.commentView.setText(list.get(position).getComment()); + holder.iconView.setImageBitmap(list.get(position).getIcon()); +// //アイコン仮セット +// executor.execute(() -> { +// try{ +// URL url = new URL(iconUrlString); +// HttpURLConnection con = (HttpURLConnection) url.openConnection(); +// con.connect(); +// +// InputStream is = con.getInputStream(); +// +// Bitmap bitmap = BitmapFactory.decodeStream(is); +// handler.post(() -> { +// ImageView imageView = findViewById(R.id.shopAcIconPic); +// imageView.setImageBitmap(bitmap); +// }); +// is.close(); +// con.disconnect(); +// }catch (Exception e){ +// e.printStackTrace(); +// } +// }); } @Override @@ -227,14 +291,22 @@ public TextView rateView; public TextView genreView; public TextView commentView; + public ImageView iconView; + public ImageView image1View; + public ImageView image2View; + public ImageView image3View; public ShopAcViewHolder(@NonNull View itemView) { super(itemView); - nameView = (TextView) itemView.findViewById(R.id.userName); - dateView = (TextView) itemView.findViewById(R.id.date); - rateView = (TextView) itemView.findViewById(R.id.rate); - genreView = (TextView) itemView.findViewById(R.id.genre); - commentView = (TextView) itemView.findViewById(R.id.comment); + nameView = (TextView) itemView.findViewById(R.id.shopAcUserName); + dateView = (TextView) itemView.findViewById(R.id.shopAcDate); + rateView = (TextView) itemView.findViewById(R.id.shopAcRate); + genreView = (TextView) itemView.findViewById(R.id.shopAcGenre); + commentView = (TextView) itemView.findViewById(R.id.shopAcComment); + iconView = (ImageView) itemView.findViewById(R.id.shopAcIconPic); +// image1View = (ImageView) itemView.findViewById(R.id.shopAcImage1); +// image2View = (ImageView) itemView.findViewById(R.id.shopAcImage2); +// image3View = (ImageView) itemView.findViewById(R.id.shopAcImage3); } } @@ -245,6 +317,10 @@ private String rate; private String genre; private String comment; + private Bitmap icon; + private String image1; + private String image2; + private String image3; public String getName() { return name; @@ -280,6 +356,27 @@ public void setComment(String comment) { this.comment = comment; } + + public Bitmap getIcon() { return icon; } + public void setIcon(Bitmap icon) { + this.icon = icon; + } + +// public String getImage() { return image1; } +// public void setImage1(String image1) { +// this.image1 = image1; +// } +// +// public String getImage2() { return image2; } +// public void setImage2(String image2) { +// this.image2 = image2; +// } +// +// public String getImage3() { return image3; } +// public void setImage3(String image3) { +// this.image3 = image3; +// } + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/nemophila/entities/ErrorType.java b/app/src/main/java/com/example/nemophila/entities/ErrorType.java index 4ab24d7..8d40df5 100644 --- a/app/src/main/java/com/example/nemophila/entities/ErrorType.java +++ b/app/src/main/java/com/example/nemophila/entities/ErrorType.java @@ -5,7 +5,8 @@ NetworkError("ネットワークエラー"), InvalidToken("トークンが不一致"), UnknownError("不明なエラー"), - ResponseNoyFound("リソースが見つかりません"); + ResponseNotFound("リソースが見つかりません"), + ServerError("サーバーエラー"); private final String text; diff --git a/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java b/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java index a4f9f2a..8b5aed5 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java @@ -1,12 +1,9 @@ package com.example.nemophila.viewmodels; import android.util.Log; -import android.widget.TextView; -import com.example.nemophila.R; import com.example.nemophila.entities.Account; import com.example.nemophila.entities.AccountJson; -import com.example.nemophila.entities.AccountNameJson; import com.example.nemophila.entities.ErrorType; import com.example.nemophila.entities.Post; import com.example.nemophila.entities.PostJson; @@ -37,7 +34,9 @@ private final MutableLiveData pwErrorLiveData; private final MutableLiveData accountLiveData; private final MutableLiveData errorLiveData; - private final MutableLiveData finishChangeIconLiveData; + private final MutableLiveData successChangeIconLiveData; + private final MutableLiveData successDeleteAccountLiveData; + private final MutableLiveData delAcErrorLiveData; // コンストラクタ public AccountViewModel() { @@ -52,7 +51,9 @@ this.pwErrorLiveData = new MutableLiveData<>(); this.accountLiveData = new MutableLiveData<>(); this.errorLiveData = new MutableLiveData<>(); - this.finishChangeIconLiveData = new MutableLiveData<>(); + this.successChangeIconLiveData = new MutableLiveData<>(); + this.successDeleteAccountLiveData = new MutableLiveData<>(); + this.delAcErrorLiveData = new MutableLiveData<>(); } // ライブデータの取得(ゲッター) @@ -72,27 +73,9 @@ public MutableLiveData getErrorLiveData() { return errorLiveData; } - public MutableLiveData getFinishChangeIconLiveData() {return finishChangeIconLiveData;} - - // 対象のアカウント情報の削除 - public void deleteAccount(String uid, String token) { - Call call = accountsRest.deleteAccount(uid, token); - - call.enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if (response.isSuccessful()) { - System.out.println("DeleteAccount Successful"); - } else { - System.out.println("DeleteAccount ResponseError"); - } - } - @Override - public void onFailure(Call call, Throwable t) { - System.out.println("DeleteAccount NetworkError" + t); - } - }); - } + public MutableLiveData getSuccessChangeIconLiveData() { return successChangeIconLiveData; } + public MutableLiveData getSuccessDeleteAccountLiveData() { return successDeleteAccountLiveData; } + public MutableLiveData getDelAcErrorLiveData() { return delAcErrorLiveData; } // 対象のアカウントパスワードの変更 public void changePw(String uid, String oldPw, String newPw, String token) { @@ -149,16 +132,16 @@ @Override public void onResponse(Call call, Response response) { if (response.isSuccessful()) { - finishChangeIconLiveData.setValue(true); + successChangeIconLiveData.setValue(true); } else { - finishChangeIconLiveData.setValue(false); + successChangeIconLiveData.setValue(false); System.out.println("response error"); } } @Override public void onFailure(Call call, Throwable t) { - finishChangeIconLiveData.setValue(false); + successChangeIconLiveData.setValue(false); System.out.println("ChangeIcon NetworkError :" + t); } }); @@ -275,14 +258,36 @@ accountPostsLiveData.setValue(preData); } + // 対象のアカウント情報の削除 + public void deleteAccount(String uid, String token) { + Call call = accountsRest.deleteAccount(uid, token); + + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + successDeleteAccountLiveData.setValue(true); + } else { + delAcErrorLiveData.setValue(parseStatusCode(response.code())); + } + } + @Override + public void onFailure(Call call, Throwable t) { + delAcErrorLiveData.setValue(ErrorType.NetworkError.getText()); + } + }); + } + private String parseStatusCode(Integer stats) { switch (stats) { case 404: - return ErrorType.ResponseNoyFound.getText(); + return ErrorType.ResponseNotFound.getText(); case 401: return ErrorType.InvalidToken.getText(); case 400: return ErrorType.ResponseError.getText(); + case 500: + return ErrorType.ServerError.getText(); default: return ErrorType.UnknownError.getText(); } diff --git a/app/src/main/java/com/example/nemophila/viewmodels/FriendViewModel.java b/app/src/main/java/com/example/nemophila/viewmodels/FriendViewModel.java index 13e1bf2..0f5e67a 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/FriendViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/FriendViewModel.java @@ -5,9 +5,6 @@ import com.example.nemophila.entities.AccountNameJson; import com.example.nemophila.entities.ErrorType; -import com.example.nemophila.entities.Post; -import com.example.nemophila.entities.PostJson; -import com.example.nemophila.resources.AccountsRest; import com.example.nemophila.resources.FriendsRest; import java.util.ArrayList; @@ -279,11 +276,13 @@ private String parseStatusCode(Integer stats) { switch (stats) { case 404: - return ErrorType.ResponseNoyFound.getText(); + return ErrorType.ResponseNotFound.getText(); case 401: return ErrorType.InvalidToken.getText(); case 400: return ErrorType.ResponseError.getText(); + case 500: + return ErrorType.ServerError.getText(); default: return ErrorType.UnknownError.getText(); } diff --git a/app/src/main/java/com/example/nemophila/viewmodels/PostsViewModel.java b/app/src/main/java/com/example/nemophila/viewmodels/PostsViewModel.java index 9229454..d418ed8 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/PostsViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/PostsViewModel.java @@ -153,11 +153,13 @@ private String parseStatusCode(Integer stats) { switch (stats) { case 404: - return ErrorType.ResponseNoyFound.getText(); + return ErrorType.ResponseNotFound.getText(); case 401: return ErrorType.InvalidToken.getText(); case 400: return ErrorType.ResponseError.getText(); + case 500: + return ErrorType.ServerError.getText(); default: return ErrorType.UnknownError.getText(); } diff --git a/app/src/main/java/com/example/nemophila/viewmodels/ShopsViewModel.java b/app/src/main/java/com/example/nemophila/viewmodels/ShopsViewModel.java index e5e8b46..3ffbb58 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/ShopsViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/ShopsViewModel.java @@ -2,16 +2,12 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; import com.example.nemophila.entities.ErrorType; import com.example.nemophila.entities.Shop; import com.example.nemophila.resources.ShopsRest; import com.google.android.gms.maps.model.Marker; -import java.io.IOError; -import java.io.IOException; -import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -126,6 +122,7 @@ System.out.println("response null : setViewModel"); } } else { + errorLiveData.setValue(parseStatusCode(response.code())); System.out.println("ステータスコード 不正 : setViewModel"); } } @@ -135,6 +132,7 @@ public void onFailure(Call> call, Throwable t) { System.out.println("通信失敗 : setViewModel"); System.out.println(t); + errorLiveData.setValue(ErrorType.UnknownError.getText()); } }); } @@ -152,6 +150,7 @@ nearShopsLiveData.setValue(response.body()); } else { System.out.println("ShopsViewModel : 通信失敗"); + errorLiveData.setValue(parseStatusCode(response.code())); } } @@ -160,6 +159,7 @@ public void onFailure(Call> call, Throwable t) { System.out.println("setViewModel : 通信失敗"); System.out.println(t); + errorLiveData.setValue(ErrorType.UnknownError.getText()); } }); } @@ -173,6 +173,8 @@ public void onResponse(Call call, Response response) { if (response.isSuccessful()) { currentShopLiveData.setValue(response.body()); + } else { + errorLiveData.setValue(parseStatusCode(response.code())); } } @@ -180,6 +182,7 @@ public void onFailure(Call call, Throwable t) { System.out.println("通信失敗 : createShop"); System.out.println(t); + errorLiveData.setValue(ErrorType.UnknownError.getText()); } }); } @@ -187,11 +190,13 @@ private String parseStatusCode(Integer stats) { switch (stats) { case 404: - return ErrorType.ResponseNoyFound.getText(); + return ErrorType.ResponseNotFound.getText(); case 401: return ErrorType.InvalidToken.getText(); case 400: return ErrorType.ResponseError.getText(); + case 500: + return ErrorType.ServerError.getText(); default: return ErrorType.UnknownError.getText(); } diff --git a/app/src/main/res/drawable/ic_backpage.xml b/app/src/main/res/drawable/ic_backpage.xml new file mode 100644 index 0000000..36421a3 --- /dev/null +++ b/app/src/main/res/drawable/ic_backpage.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_friend.xml b/app/src/main/res/layout/activity_friend.xml index e42699e..e22a6fe 100644 --- a/app/src/main/res/layout/activity_friend.xml +++ b/app/src/main/res/layout/activity_friend.xml @@ -53,14 +53,14 @@ android:id="@+id/friendsList" android:layout_width="match_parent" android:layout_height="match_parent" - android:visibility="invisible"/> + android:visibility="visible"/> + android:visibility="invisible"> - -