diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b19b47f..9d1c6dc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -98,17 +98,18 @@ android:exported="false" /> - + android:exported="false" + android:windowSoftInputMode="adjustPan"/> + + + + + - + { friendRecyclerView.setVisibility(View.VISIBLE); @@ -133,6 +134,7 @@ } }); + //idからアカウント名を検索するためのAccountViewModelを宣言しておく AccountViewModel accountViewModel = new ViewModelProvider(this).get(AccountViewModel.class); @@ -143,47 +145,45 @@ public void onClick(View v){ //入力されたIDを取得 EditText editSearchId = findViewById(R.id.inputRequestingId); - String searchingId = editSearchId.getText().toString(); + searchingId = editSearchId.getText().toString(); - //IDが存在しなければ落ちるのでその処理を書く - //取得したIDからアカウントを読み込んでおく + //取得したIDからアカウントを読み込む(検索用のOnChangedへ) accountViewModel.fetchAccount(searchingId); - //検索用LiveDataへの購読 - accountViewModel.getAccountLiveData().observe(FriendActivity.this, new Observer() { - - //ViewModelからアカウントが返ってくれば(データ変更があれば)実行 - @Override - public void onChanged(Account user) { - if(user == null){ - new AlertDialog.Builder(FriendActivity.this) - .setTitle("IDが間違っています") - .setPositiveButton("OK", null) - .create() - .show(); - }else { - requestingName = (user.getName()); - - //申請を送るダイアログ - RequestingDialogFragment dialog = new RequestingDialogFragment(FriendActivity.this); - //名前を渡す - Bundle args = new Bundle(); - args.putString("message", requestingName); - dialog.setArguments(args); - - //ダイアログの表示 - dialog.show(getSupportFragmentManager(), "Requesting_dialog"); - //OK押したら申請するメソッドにuid、requestingId、tokenを渡す - } - } - }); } + }); + //検索用LiveDataへの購読 + accountViewModel.getAccountLiveData().observe(FriendActivity.this, new Observer() { + //ViewModelからアカウントが返ってくれば(データ変更があれば)実行 + @Override + public void onChanged(Account user) { + if(user == null){ + new AlertDialog.Builder(FriendActivity.this) + .setTitle("IDが間違っています") + .setPositiveButton("OK", null) + .create() + .show(); + }else { + requestingName = (user.getName()); + + //申請を送るダイアログ + RequestingDialogFragment dialog = new RequestingDialogFragment(FriendActivity.this); + //名前を渡す + Bundle args = new Bundle(); + args.putString("message", requestingName); + dialog.setArguments(args); + + //ダイアログの表示 + dialog.show(getSupportFragmentManager(), "Requesting_dialog"); + //OK押したら申請するメソッドにuid、requestingId、tokenを渡す + } + } }); //RecyclerView(表示の設定、直接表示するところはLivedataを購読しているonChanged内に) - List requestingDataList = new ArrayList<>(); + List requestingDataList = new ArrayList<>(); //xmlからrvにRecyclerViewを取得 RecyclerView rv_r = (RecyclerView) findViewById(R.id.requestingList); @@ -232,12 +232,12 @@ //受け取ったLivedataの要素分繰り返し、セット for (AccountNameJson user: requestingUsers) { //dataを宣言 dataに投稿の必要なデータをセットし、それをpostsDatasetに追加してリストを作る - RequestingActivity.RequestingDataModel data = new RequestingActivity.RequestingDataModel(); + RequestingDataModel data = new RequestingDataModel(); data.setName(user.getName()); data.setId(user.getUid()); //投稿一つの情報がdataに全部セットされたらDatasetに追加 - requestingDataList.add(data); + requestingDataList.add(0, data); } //onChange内に書くべき表示部分 @@ -351,13 +351,13 @@ //Adapter public class RequestingAdapter extends RecyclerView.Adapter { - private List list; + private List list; - public RequestingAdapter(List list) { + public RequestingAdapter(List list) { this.list =list; } - public void setList(List list) { + public void setList(List list) { this.list = list; } diff --git a/app/src/main/java/com/example/nemophila/MapsActivity.java b/app/src/main/java/com/example/nemophila/MapsActivity.java index 1256256..0702432 100644 --- a/app/src/main/java/com/example/nemophila/MapsActivity.java +++ b/app/src/main/java/com/example/nemophila/MapsActivity.java @@ -7,6 +7,8 @@ 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; @@ -30,28 +32,42 @@ 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 NameToId; + // フィルターのリスト用 ArrayList listData; ListView list; boolean isGenre; String genreData[]; - String friendsData[]; + ArrayList 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); @@ -115,19 +131,28 @@ }); // サイドメニューのフィルターのリストの準備 - genreData = new String[5]; - friendsData = new String[5]; - genreData[0] = "和食"; - genreData[1] = "中華"; - genreData[2] = "イタリアン"; - genreData[3] = "洋食"; - genreData[4] = "ジャンクフード"; + genreData = new String[]{"中華", "和食", "イタリアン", "フレンチ", "カフェ", "バー", "居酒屋", "ラーメン", "うどん・そば", "その他 海外料理"}; + friendsData = new ArrayList<>(); + //NameToId = new HashMap<>(); - friendsData[0] = "iyo"; - friendsData[1] = "iyo2"; - friendsData[2] = "superiyo"; - friendsData[3] = "perfectiyo"; - friendsData[4] = "finaliyo"; +// 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>() { + @Override + public void onChanged(Collection friends) { + for (AccountNameJson friend : friends) { + friendsData.add(friend.getUid()); + //NameToId.put(friend.getName(), friend.getUid()); + } + } + }); + listData = new ArrayList<>(); list = findViewById(R.id.drawer_list); @@ -186,6 +211,8 @@ public void prepareGenreList(String s){ + //sは検索欄に入力された文字列 + // 現在表示されているリストがジャンルのリストかどうかを設定 isGenre = true; @@ -215,20 +242,26 @@ } public void prepareFriendList(String s){ + //sは検索欄に入力された文字列 + // 現在表示されているリストがジャンルのリストかどうかを設定 isGenre = false; // 一度リストのデータを取り除いてから追加する listData.clear(); - for(int i = 0; i < friendsData.length; i++){ + + for (AccountNameJson friend : nemophila.getFriends()) { if(s == null) { FilterDataModel fd = new FilterDataModel(); - fd.setText(friendsData[i]); + fd.setText(friend.getUid()); + fd.setNameText(friend.getName()); listData.add(fd); } else { - if(friendsData[i].contains(s)){ + //検索にヒットしたフレンドのみのリストにする + if(friend.getName().contains(s)){ FilterDataModel fd = new FilterDataModel(); - fd.setText(friendsData[i]); + fd.setText(friend.getUid()); + fd.setNameText(friend.getName()); listData.add(fd); } } @@ -260,23 +293,38 @@ // 画面外に行ったときにチェックがずれないようにする @Override public View getView(int position, View convertView, ViewGroup parent) { - FilterDataModel item = (FilterDataModel) getItem(position); - if (convertView == null) { - convertView = layoutInflater.inflate(R.layout.filter_item, null); - } + CheckBox checkBox; - TextView textView = convertView.findViewById(R.id.filter_text); - textView.setText(item.text); - CheckBox checkBox = convertView.findViewById(R.id.filter_checkbox); - checkBox.setOnCheckedChangeListener(null); - //チェック済みの項目をチェックにしておく 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) { @@ -291,12 +339,61 @@ 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 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); + } + } + } + } + } + } } }); @@ -306,11 +403,16 @@ 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; @@ -319,6 +421,9 @@ public void setText(String text) { this.text = text; } + public void setNameText(String text) { + this.nameText = text; + } public void setChecked(boolean checked) { isChecked = checked; diff --git a/app/src/main/java/com/example/nemophila/MapsDialogFragment.java b/app/src/main/java/com/example/nemophila/MapsDialogFragment.java index f2028a4..caad4ba 100644 --- a/app/src/main/java/com/example/nemophila/MapsDialogFragment.java +++ b/app/src/main/java/com/example/nemophila/MapsDialogFragment.java @@ -45,8 +45,8 @@ } AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setTitle("投稿したいお店はこの中にありますか?") - .setPositiveButton("該当する店がありません(新規作成)", new DialogInterface.OnClickListener() { + builder.setTitle("周囲の店舗情報") + .setPositiveButton("新規作成", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { //このボタンを押した時の処理を書きます。 //新規投稿画面へ遷移 diff --git a/app/src/main/java/com/example/nemophila/MapsFragment.java b/app/src/main/java/com/example/nemophila/MapsFragment.java index 1ee5dd6..053faca 100644 --- a/app/src/main/java/com/example/nemophila/MapsFragment.java +++ b/app/src/main/java/com/example/nemophila/MapsFragment.java @@ -9,6 +9,7 @@ import androidx.core.content.res.ResourcesCompat; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; +import androidx.lifecycle.LiveData; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; @@ -55,6 +56,7 @@ import com.google.common.collect.Maps; import java.util.ArrayList; +import java.util.Collection; import java.util.Map; public class MapsFragment extends Fragment implements LocationListener { @@ -113,46 +115,39 @@ String.format("表示していない店を確認しました。ピンを立てます"), Toast.LENGTH_SHORT) .show(); - for (Shop shop : shops) { - //受け取ったshopsにfriendsの投稿が含まれているかを確認,受け取ったshopsに対してMarkerが立っているかを確認 - - //observeの中にobserveはうまくいかなかった -// postsViewModel.loadShopPost(shop.getSid()); -// postsViewModel.getShopPostLiveData().observe(getActivity(), new Observer >() { -// @Override -// public void onChanged(ArrayList posts) { -// ArrayList ids = postsViewModel.getUserIds(); -// -// for(int i = 0; i < ids.size(); i++) { -// ArrayList fids = nemophila.getFriendIds(); -// for(int j = 0; j < fids.size(); j++) { -// if( ( ids.get(i).equals(fids.get(j)) || ids.get(i).equals(nemophila.getUid()) ) && shopsViewModel.getMarker(shop) == null ){ -// //各shopに対応するMarkerがなければMarkerを立てる -// shopLatlng = new LatLng(shop.getLatitude(), shop.getLongitude()); -// System.out.println(shopLatlng); -// Marker createMaker = mMap.addMarker(new MarkerOptions().position(shopLatlng).title("")); -// //マーカーに店情報を持たせる -// createMaker.setTag(shop); -// //ShopToMarkerに紐づけ -// shopsViewModel.setShopAndMarker(shop, createMaker); -// } -// } -// } -// } -// }); - if ( shopsViewModel.getMarker(shop) == null) { //フレンド以外の投稿のピンも立てたい場合 - //if( && shopsViewModel.getMarker(shop) == null) { //各shopに対応するMarkerがなければMarkerを立てる shopLatlng = new LatLng(shop.getLatitude(), shop.getLongitude()); System.out.println(shopLatlng); - Marker createMaker = mMap.addMarker(new MarkerOptions().position(shopLatlng).title("")); + Marker createMarker = mMap.addMarker(new MarkerOptions().position(shopLatlng).title("")); //マーカーに店情報を持たせる - createMaker.setTag(shop); + createMarker.setTag(shop); + //フィルター掛け + for(String genre : nemophila.getSelectGenres()) { + if(shop.getGenreSet().contains(genre)) { + createMarker.setVisible(true); + } else { + createMarker.setVisible(false); + } + } + +// if ( !nemophila.getSelectFriends().isEmpty() ) { +// createMaker.setVisible(false); +// } + //ShopToMarkerに紐づけ - shopsViewModel.setShopAndMarker(shop, createMaker); + shopsViewModel.setShopAndMarker(shop, createMarker); + } else { +// //すでに立っているピンをフィルター掛け +// Marker setMaker = shopsViewModel.getMarker(shop); +// if ( !nemophila.getSelectGenres().isEmpty() ) { +// setMaker.setVisible(false); +// } +// if ( !nemophila.getSelectFriends().isEmpty() ) { +// setMaker.setVisible(false); +// } } } }); diff --git a/app/src/main/java/com/example/nemophila/MyPageActivity.java b/app/src/main/java/com/example/nemophila/MyPageActivity.java index f90011a..d332234 100644 --- a/app/src/main/java/com/example/nemophila/MyPageActivity.java +++ b/app/src/main/java/com/example/nemophila/MyPageActivity.java @@ -66,7 +66,7 @@ Button requestingButton = (Button) findViewById(R.id.requesting); requestingButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - Intent intent = new Intent(MyPageActivity.this, RequestingActivity.class); + Intent intent = new Intent(MyPageActivity.this, FriendActivity.class); startActivity(intent); } }); diff --git a/app/src/main/java/com/example/nemophila/RequestingActivity.java b/app/src/main/java/com/example/nemophila/RequestingActivity.java index 78a3ec8..f2a6f78 100644 --- a/app/src/main/java/com/example/nemophila/RequestingActivity.java +++ b/app/src/main/java/com/example/nemophila/RequestingActivity.java @@ -1,286 +1,286 @@ -package com.example.nemophila; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatActivity; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; -import androidx.recyclerview.widget.DividerItemDecoration; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Intent; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import com.example.nemophila.entities.Account; -import com.example.nemophila.entities.AccountNameJson; -import com.example.nemophila.entities.ErrorType; -import com.example.nemophila.entities.Post; -import com.example.nemophila.viewmodels.AccountViewModel; -import com.example.nemophila.viewmodels.FriendViewModel; -import com.example.nemophila.viewmodels.PostsViewModel; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -public class RequestingActivity extends AppCompatActivity { - - FriendViewModel friendViewModel; - String uid; - String token; - String requestingId; - String requestingName; - String searchingId; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_requesting); - //Nemophilaから自分のuidとtokenを取得 - uid = ((Nemophila)getApplication()).getUid(); - token = ((Nemophila)getApplication()).getToken(); - - //左上のボタンでマイページへ遷移 - Button returnButton = (Button)findViewById(R.id.requestingAcReturnButton); - returnButton.setOnClickListener(new View.OnClickListener(){ - public void onClick(View v){ - Intent intent = new Intent(getApplication(), MyPageActivity.class); - startActivity(intent); - } - }); - - //idからアカウント名を検索するためのAccountViewModelを宣言しておく - AccountViewModel accountViewModel = new ViewModelProvider(this).get(AccountViewModel.class); - - //フレンド検索ボタン - Button requestingButton = (Button)findViewById(R.id.requestingSearchButton); - requestingButton.setOnClickListener(new View.OnClickListener(){ - - @Override - public void onClick(View v){ - //入力されたIDを取得 - EditText editSearchId = (EditText) findViewById(R.id.inputRequestingId); - searchingId = editSearchId.getText().toString(); - //取得したIDからアカウントを読み込み、検索用LiveDataのonChangeへ - accountViewModel.fetchAccount(searchingId); - } - }); - - //検索用LiveDataへの購読 - accountViewModel.getAccountLiveData().observe(RequestingActivity.this, new Observer() { - - //ViewModelから検索結果が返ってくれば(データ変更があれば)実行 - @Override - public void onChanged(Account user) { - - if (user == null) { - new AlertDialog.Builder(RequestingActivity.this) - .setTitle("IDが間違っています") - .setPositiveButton("OK", null) - .create() - .show(); - } else { - requestingName = (user.getName()); - - //申請を送るダイアログ - RequestingDialogFragment dialog = new RequestingDialogFragment(RequestingActivity.this); - //名前を渡す - Bundle args = new Bundle(); - args.putString("message", requestingName); - dialog.setArguments(args); - - //ダイアログの表示 - dialog.show(getSupportFragmentManager(), "Requesting_dialog"); - //OK押したら申請するメソッドにuid、requestingId、tokenを渡す - } - } - }); - - //FriendViewModelの初期化 - friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); - - //エラーコードを購読 - friendViewModel.getErrorLiveData().observe(RequestingActivity.this, new Observer() { - @Override - public void onChanged(String error) { - - if (error == ErrorType.ResponseError.getText()) { - new AlertDialog.Builder(RequestingActivity.this) - .setTitle("既にフレンド、申請を受けているなどの理由で申請できません") - .setPositiveButton("OK", null) - .create() - .show(); - } - } - }); - - //RecyclerView(表示の設定、直接表示するところはLivedataを購読しているonChanged内に) - List requestingDataList = new ArrayList<>(); - - //xmlからrvにRecyclerViewを取得 - RecyclerView rv = (RecyclerView) findViewById(R.id.requestingList); - - //アダプターを宣言し、削除ボタンを押したときの処理をオーバーライド - RequestingAdapter adapter = new RequestingAdapter(requestingDataList){ - @Override - void onDeleteClick(View view, int position, RequestingDataModel user) { - new AlertDialog.Builder(RequestingActivity.this) - .setTitle(user.getName() + "さんへの申請を削除しますか?") - .setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - Toast.makeText(RequestingActivity.this, user.getName(), Toast.LENGTH_SHORT).show(); - friendViewModel.deleteRequesting(uid, user.getId(), token); - } - }) - .setNegativeButton("キャンセル", null) - .create() - .show(); - } - }; - - //一行ずつを縦に(LinearLayout)表示するLayoutManagerを宣言 - LinearLayoutManager llm = new LinearLayoutManager(this); - //データごとの区切り線を入れる - RecyclerView.ItemDecoration itemDecoration = - new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); - rv.addItemDecoration(itemDecoration); - - rv.setHasFixedSize(true); - rv.setLayoutManager(llm); - - //FriendViewModelを初期化し、申請先のデータをロードしておく - friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); - friendViewModel.getRequesting(uid); - - //申請先の一覧のLiveDataへの購読 - friendViewModel.getRequestingLiveData().observe(this, new Observer>() { - //データに変更があった時実行 - @Override - public void onChanged(Collection requestingUsers) { - - //表示用のDataListを一旦クリアし、LiveDataから受け取ったデータを一つずつセット(重複しないように) - requestingDataList.clear(); - //受け取ったLivedataの要素分繰り返し、セット - for (AccountNameJson user: requestingUsers) { - //申請先1人に必要な情報をセットするdataを宣言 - RequestingDataModel data = new RequestingDataModel(); - //dataをpostsDatasetに追加してリストを作る - data.setName(user.getName()); - data.setId(user.getUid()); - - //申請先一つの情報がdataに全部セットされたらDatasetに追加 重複していたら追加しない - if(!(requestingDataList.contains(data))) { - requestingDataList.add(0, data); - } - } - - //onChange内に書くべき表示部分 - adapter.setList(requestingDataList); - rv.setAdapter(adapter); - } - }); - } - - - //ダイアログでOKを押した時に呼び出される フレンド申請を送るメソッド - public void putRequesting(){ - requestingId = searchingId; - friendViewModel.putRequesting(uid, requestingId, requestingName, token); - } - - //RecyclerViewのための内部クラス - //Adapter - public class RequestingAdapter extends RecyclerView.Adapter { - - private List list; - - public RequestingAdapter(List list) { - this.list =list; - } - - public void setList(List list) { - this.list = list; - } - - @NonNull - @Override - public RequestingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - //1データあたりのレイアウトを読み込み、ビューホルダーを宣言 - View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_requesting_activity, parent,false); - RequestingViewHolder vh = new RequestingViewHolder(inflate); - - // リスト内の削除ボタンを押した時の処理 - vh.deleteButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - int position = vh.getBindingAdapterPosition(); - // 処理はonDeleteClickに - onDeleteClick(v, position, list.get(position)); - } - }); - - return vh; - } - - @Override - public void onBindViewHolder(@NonNull RequestingViewHolder holder, int position) { - holder.nameView.setText(list.get(position).getName()); - } - - @Override - public int getItemCount() { - return list.size(); - } - - void onDeleteClick(View view, int position, RequestingDataModel requesting) { - // このメソッドをActivity内でオーバーライドして、クリックイベントの処理を設定する - } - } - - //ViewHolder - public class RequestingViewHolder extends RecyclerView.ViewHolder { - public TextView nameView; - public ImageView iconView; - public Button deleteButton; - - public RequestingViewHolder(@NonNull View itemView) { - super(itemView); - nameView = (TextView) itemView.findViewById(R.id.requestingName); - iconView = itemView.findViewById(R.id.requestingIcon); - deleteButton = itemView.findViewById(R.id.requestingDeleteButton); - } - } - - //DataModel - public static class RequestingDataModel extends FriendActivity.RequestingDataModel { - private String name; - private String id; - - public String getName() { - return name; - } - public String getId() { - return id; - } - - public void setName(String name) { - this.name = name; - } - public void setId(String id){ - this.id = id; - } - - } - -} \ No newline at end of file +//package com.example.nemophila; +// +//import androidx.annotation.NonNull; +//import androidx.appcompat.app.AppCompatActivity; +//import androidx.lifecycle.Observer; +//import androidx.lifecycle.ViewModelProvider; +//import androidx.recyclerview.widget.DividerItemDecoration; +//import androidx.recyclerview.widget.LinearLayoutManager; +//import androidx.recyclerview.widget.RecyclerView; +// +//import android.app.AlertDialog; +//import android.content.DialogInterface; +//import android.content.Intent; +//import android.os.Bundle; +//import android.view.LayoutInflater; +//import android.view.View; +//import android.view.ViewGroup; +//import android.widget.Button; +//import android.widget.EditText; +//import android.widget.ImageView; +//import android.widget.TextView; +//import android.widget.Toast; +// +//import com.example.nemophila.entities.Account; +//import com.example.nemophila.entities.AccountNameJson; +//import com.example.nemophila.entities.ErrorType; +//import com.example.nemophila.entities.Post; +//import com.example.nemophila.viewmodels.AccountViewModel; +//import com.example.nemophila.viewmodels.FriendViewModel; +//import com.example.nemophila.viewmodels.PostsViewModel; +// +//import java.util.ArrayList; +//import java.util.Collection; +//import java.util.List; +// +//public class RequestingActivity extends AppCompatActivity { +// +// FriendViewModel friendViewModel; +// String uid; +// String token; +// String requestingId; +// String requestingName; +// String searchingId; +// +// @Override +// protected void onCreate(Bundle savedInstanceState) { +// super.onCreate(savedInstanceState); +// setContentView(R.layout.activity_requesting); +// //Nemophilaから自分のuidとtokenを取得 +// uid = ((Nemophila)getApplication()).getUid(); +// token = ((Nemophila)getApplication()).getToken(); +// +// //左上のボタンでマイページへ遷移 +// Button returnButton = (Button)findViewById(R.id.requestingAcReturnButton); +// returnButton.setOnClickListener(new View.OnClickListener(){ +// public void onClick(View v){ +// Intent intent = new Intent(getApplication(), MyPageActivity.class); +// startActivity(intent); +// } +// }); +// +// //idからアカウント名を検索するためのAccountViewModelを宣言しておく +// AccountViewModel accountViewModel = new ViewModelProvider(this).get(AccountViewModel.class); +// +// //フレンド検索ボタン +// Button requestingButton = (Button)findViewById(R.id.requestingSearchButton); +// requestingButton.setOnClickListener(new View.OnClickListener(){ +// +// @Override +// public void onClick(View v){ +// //入力されたIDを取得 +// EditText editSearchId = (EditText) findViewById(R.id.inputRequestingId); +// searchingId = editSearchId.getText().toString(); +// //取得したIDからアカウントを読み込み、検索用LiveDataのonChangeへ +// accountViewModel.fetchAccount(searchingId); +// } +// }); +// +// //検索用LiveDataへの購読 +// accountViewModel.getAccountLiveData().observe(RequestingActivity.this, new Observer() { +// +// //ViewModelから検索結果が返ってくれば(データ変更があれば)実行 +// @Override +// public void onChanged(Account user) { +// +// if (user == null) { +// new AlertDialog.Builder(RequestingActivity.this) +// .setTitle("IDが間違っています") +// .setPositiveButton("OK", null) +// .create() +// .show(); +// } else { +// requestingName = (user.getName()); +// +// //申請を送るダイアログ +// RequestingDialogFragment dialog = new RequestingDialogFragment(RequestingActivity.this); +// //名前を渡す +// Bundle args = new Bundle(); +// args.putString("message", requestingName); +// dialog.setArguments(args); +// +// //ダイアログの表示 +// dialog.show(getSupportFragmentManager(), "Requesting_dialog"); +// //OK押したら申請するメソッドにuid、requestingId、tokenを渡す +// } +// } +// }); +// +// //FriendViewModelの初期化 +// friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); +// +// //エラーコードを購読 +// friendViewModel.getErrorLiveData().observe(RequestingActivity.this, new Observer() { +// @Override +// public void onChanged(String error) { +// +// if (error == ErrorType.ResponseError.getText()) { +// new AlertDialog.Builder(RequestingActivity.this) +// .setTitle("既にフレンド、申請を受けているなどの理由で申請できません") +// .setPositiveButton("OK", null) +// .create() +// .show(); +// } +// } +// }); +// +// //RecyclerView(表示の設定、直接表示するところはLivedataを購読しているonChanged内に) +// List requestingDataList = new ArrayList<>(); +// +// //xmlからrvにRecyclerViewを取得 +// RecyclerView rv = (RecyclerView) findViewById(R.id.requestingList); +// +// //アダプターを宣言し、削除ボタンを押したときの処理をオーバーライド +// RequestingAdapter adapter = new RequestingAdapter(requestingDataList){ +// @Override +// void onDeleteClick(View view, int position, RequestingDataModel user) { +// new AlertDialog.Builder(RequestingActivity.this) +// .setTitle(user.getName() + "さんへの申請を削除しますか?") +// .setPositiveButton("OK", new DialogInterface.OnClickListener() { +// @Override +// public void onClick(DialogInterface dialog, int which) { +// Toast.makeText(RequestingActivity.this, user.getName(), Toast.LENGTH_SHORT).show(); +// friendViewModel.deleteRequesting(uid, user.getId(), token); +// } +// }) +// .setNegativeButton("キャンセル", null) +// .create() +// .show(); +// } +// }; +// +// //一行ずつを縦に(LinearLayout)表示するLayoutManagerを宣言 +// LinearLayoutManager llm = new LinearLayoutManager(this); +// //データごとの区切り線を入れる +// RecyclerView.ItemDecoration itemDecoration = +// new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); +// rv.addItemDecoration(itemDecoration); +// +// rv.setHasFixedSize(true); +// rv.setLayoutManager(llm); +// +// //FriendViewModelを初期化し、申請先のデータをロードしておく +// friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); +// friendViewModel.getRequesting(uid); +// +// //申請先の一覧のLiveDataへの購読 +// friendViewModel.getRequestingLiveData().observe(this, new Observer>() { +// //データに変更があった時実行 +// @Override +// public void onChanged(Collection requestingUsers) { +// +// //表示用のDataListを一旦クリアし、LiveDataから受け取ったデータを一つずつセット(重複しないように) +// requestingDataList.clear(); +// //受け取ったLivedataの要素分繰り返し、セット +// for (AccountNameJson user: requestingUsers) { +// //申請先1人に必要な情報をセットするdataを宣言 +// RequestingDataModel data = new RequestingDataModel(); +// //dataをpostsDatasetに追加してリストを作る +// data.setName(user.getName()); +// data.setId(user.getUid()); +// +// //申請先一つの情報がdataに全部セットされたらDatasetに追加 重複していたら追加しない +// if(!(requestingDataList.contains(data))) { +// requestingDataList.add(0, data); +// } +// } +// +// //onChange内に書くべき表示部分 +// adapter.setList(requestingDataList); +// rv.setAdapter(adapter); +// } +// }); +// } +// +// +// //ダイアログでOKを押した時に呼び出される フレンド申請を送るメソッド +// public void putRequesting(){ +// requestingId = searchingId; +// friendViewModel.putRequesting(uid, requestingId, requestingName, token); +// } +// +// //RecyclerViewのための内部クラス +// //Adapter +// public class RequestingAdapter extends RecyclerView.Adapter { +// +// private List list; +// +// public RequestingAdapter(List list) { +// this.list =list; +// } +// +// public void setList(List list) { +// this.list = list; +// } +// +// @NonNull +// @Override +// public RequestingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { +// //1データあたりのレイアウトを読み込み、ビューホルダーを宣言 +// View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_requesting_activity, parent,false); +// RequestingViewHolder vh = new RequestingViewHolder(inflate); +// +// // リスト内の削除ボタンを押した時の処理 +// vh.deleteButton.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// int position = vh.getBindingAdapterPosition(); +// // 処理はonDeleteClickに +// onDeleteClick(v, position, list.get(position)); +// } +// }); +// +// return vh; +// } +// +// @Override +// public void onBindViewHolder(@NonNull RequestingViewHolder holder, int position) { +// holder.nameView.setText(list.get(position).getName()); +// } +// +// @Override +// public int getItemCount() { +// return list.size(); +// } +// +// void onDeleteClick(View view, int position, RequestingDataModel requesting) { +// // このメソッドをActivity内でオーバーライドして、クリックイベントの処理を設定する +// } +// } +// +// //ViewHolder +// public class RequestingViewHolder extends RecyclerView.ViewHolder { +// public TextView nameView; +// public ImageView iconView; +// public Button deleteButton; +// +// public RequestingViewHolder(@NonNull View itemView) { +// super(itemView); +// nameView = (TextView) itemView.findViewById(R.id.requestingName); +// iconView = itemView.findViewById(R.id.requestingIcon); +// deleteButton = itemView.findViewById(R.id.requestingDeleteButton); +// } +// } +// +// //DataModel +// public static class RequestingDataModel extends FriendActivity.RequestingDataModel { +// private String name; +// private String id; +// +// public String getName() { +// return name; +// } +// public String getId() { +// return id; +// } +// +// public void setName(String name) { +// this.name = name; +// } +// public void setId(String id){ +// this.id = id; +// } +// +// } +// +//} \ No newline at end of file diff --git a/app/src/main/java/com/example/nemophila/TestActivity.java b/app/src/main/java/com/example/nemophila/TestActivity.java index c9734de..cd77215 100644 --- a/app/src/main/java/com/example/nemophila/TestActivity.java +++ b/app/src/main/java/com/example/nemophila/TestActivity.java @@ -85,4 +85,4 @@ } }); } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/example/nemophila/entities/Shop.java b/app/src/main/java/com/example/nemophila/entities/Shop.java index 13522f2..be24255 100644 --- a/app/src/main/java/com/example/nemophila/entities/Shop.java +++ b/app/src/main/java/com/example/nemophila/entities/Shop.java @@ -7,6 +7,8 @@ private String name; private double longitude; private double latitude; + private ArrayList genreSet; + private ArrayList userIdSet; //Getter public String getSid() { @@ -21,6 +23,12 @@ public double getLatitude() { return latitude; } + public ArrayList getGenreSet() { + return genreSet; + } + public ArrayList getUserIdSet() { + return userIdSet; + } //Setter public void setSid(String id) { @@ -35,6 +43,12 @@ public void setLatitude(double latitude) { this.latitude = latitude; } + public void setGenreSet(ArrayList genreSet) { + this.genreSet = genreSet; + } + public void setUserIdSet(ArrayList userIdSet) { + this.userIdSet = userIdSet; + } @Override public boolean equals(Object other) { diff --git a/app/src/main/java/com/example/nemophila/resources/AccountsRest.java b/app/src/main/java/com/example/nemophila/resources/AccountsRest.java index f8c10df..83ab4a8 100644 --- a/app/src/main/java/com/example/nemophila/resources/AccountsRest.java +++ b/app/src/main/java/com/example/nemophila/resources/AccountsRest.java @@ -64,6 +64,15 @@ @Field("name") String name, @Field("token") String token ); + + @FormUrlEncoded + @PUT("accounts/{uid}/icon") + Call changeIcon( + @Path("uid") String uid, + @Field("name") String icon, + @Field("token") String token + ); + @GET("accounts/{uid}/posts") Call> getAccountPosts( @Path("uid") String uid 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 207f837..a4f9f2a 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java @@ -37,6 +37,7 @@ private final MutableLiveData pwErrorLiveData; private final MutableLiveData accountLiveData; private final MutableLiveData errorLiveData; + private final MutableLiveData finishChangeIconLiveData; // コンストラクタ public AccountViewModel() { @@ -51,6 +52,7 @@ this.pwErrorLiveData = new MutableLiveData<>(); this.accountLiveData = new MutableLiveData<>(); this.errorLiveData = new MutableLiveData<>(); + this.finishChangeIconLiveData = new MutableLiveData<>(); } // ライブデータの取得(ゲッター) @@ -70,6 +72,7 @@ public MutableLiveData getErrorLiveData() { return errorLiveData; } + public MutableLiveData getFinishChangeIconLiveData() {return finishChangeIconLiveData;} // 対象のアカウント情報の削除 public void deleteAccount(String uid, String token) { @@ -138,6 +141,29 @@ }); } + // アイコンの変更を行う + public void changeIcon(String uid, String icon, String token) { + Call call = accountsRest.changeIcon(uid, icon, token); + + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + finishChangeIconLiveData.setValue(true); + } else { + finishChangeIconLiveData.setValue(false); + System.out.println("response error"); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + finishChangeIconLiveData.setValue(false); + System.out.println("ChangeIcon NetworkError :" + t); + } + }); + } + // 対象のアカウントがした投稿の全取得 public void getAccountPosts(String uid) { Call> call = accountsRest.getAccountPosts(uid); @@ -160,7 +186,7 @@ }); } - //PostJsonからPostを作成し,対象のライブデータに設定する + // PostJsonからPostを作成し,対象のライブデータに設定する private void setAccountPostLiveDataFromJson(Collection postJson) { ArrayList posts = new ArrayList<>(); for(PostJson pj: postJson) { 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 8f3dc95..13e1bf2 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/FriendViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/FriendViewModel.java @@ -235,7 +235,9 @@ private void addRequestingLiveData(String uid, String name) { ArrayList preData = new ArrayList<>(); for (AccountNameJson anj: requestingLiveData.getValue()) { - preData.add(anj); + if(!anj.getUid().equals(uid)) { + preData.add(anj); + } } preData.add(createAccountNameJson(uid, name)); requestingLiveData.setValue(preData); 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 da09614..e5e8b46 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/ShopsViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/ShopsViewModel.java @@ -81,6 +81,10 @@ return ShopToMarker.get(shop); } + public Collection getPreShoplist() { + return this.shopsPreData; + } + // TimerViewModelを利用して、定期的にMainActivityに呼び出してもらう @Override public void update() { diff --git a/app/src/main/res/layout/activity_friend.xml b/app/src/main/res/layout/activity_friend.xml index 9eb30db..e42699e 100644 --- a/app/src/main/res/layout/activity_friend.xml +++ b/app/src/main/res/layout/activity_friend.xml @@ -1,5 +1,6 @@ + android:visibility="invisible"/> - + android:orientation="vertical" + android:visibility="visible"> + + + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="0.05" + android:text=" IDで検索してフレンド申請を送る"/> + + + + + + + + + +