diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 78b143c..7bd27ea 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -7,11 +7,11 @@ - + - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 961a5e2..4343ab5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -15,10 +15,12 @@ + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0407368..b19b47f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,7 +26,8 @@ + android:label="Map" + android:windowSoftInputMode="adjustPan"> @@ -63,12 +64,12 @@ android:exported="true" android:label="@string/title_activity_sign_up"> - - + + - - + + - - + + - - + + - + + + + - + listData; + ListView list; + boolean isGenre; + String genreData[]; + String friendsData[]; + @Override protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps); + nemophila = (Nemophila) this.getApplication(); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayShowTitleEnabled(false); - // ナビゲーションホストを取得する - NavHostFragment navHostFragment = - (NavHostFragment)getSupportFragmentManager() - .findFragmentById(R.id.navHostFragment); + // DrawerToggle + DrawerLayout drawer = + (DrawerLayout) findViewById(R.id.drawer_layout); + ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( + this, drawer, toolbar, + R.string.drawer_open, + R.string.drawer_close); + drawer.addDrawerListener(toggle); + toggle.syncState(); - // navHostFragmentのナビゲーションコントローラを取得する - NavController navController = navHostFragment.getNavController(); + // NavigationView Listener + NavigationView navigationView = (NavigationView) findViewById(R.id.navView); + navigationView.setNavigationItemSelectedListener(this); - // アップバーのコンフィグレーションをビルドする - AppBarConfiguration appBarConfiguration = - new AppBarConfiguration.Builder(navController.getGraph()) - .setOpenableLayout((DrawerLayout)findViewById(R.id.drawer_layout)) - .build(); + // geocode Test + handler = new Handler(); - // ナビゲーションUIをセットアップする - NavigationUI.setupWithNavController(toolbar, navController, appBarConfiguration); +// // 検索バーの処理 +// SearchView searchView = findViewById(R.id.tool_search); +// searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { +// @Override +// public boolean onQueryTextSubmit(String query) { +// new Thread(() -> { +// geoCode(query); +// }).start(); +// return false; +// } +// +// @Override +// public boolean onQueryTextChange(String newText) { +// return false; +// } +// }); + + //filterDialog = new FilterDialog(); + + // サイドメニューのボタン + Button genreButton = findViewById(R.id.filter_genre_button); + Button friendButton = findViewById(R.id.filter_friends_button); + + // 押したボタンを灰色にし、listを作成 + genreButton.setOnClickListener(view -> { + genreButton.setBackgroundColor(Color.parseColor("#afafb0")); + friendButton.setBackgroundColor(Color.WHITE); + prepareGenreList(null); + }); + friendButton.setOnClickListener(view -> { + friendButton.setBackgroundColor(Color.parseColor("#afafb0")); + genreButton.setBackgroundColor(Color.WHITE); + prepareFriendList(null); + }); + + // サイドメニューのフィルターのリストの準備 + genreData = new String[5]; + friendsData = new String[5]; + genreData[0] = "和食"; + genreData[1] = "中華"; + genreData[2] = "イタリアン"; + genreData[3] = "洋食"; + genreData[4] = "ジャンクフード"; + + friendsData[0] = "iyo"; + friendsData[1] = "iyo2"; + friendsData[2] = "superiyo"; + friendsData[3] = "perfectiyo"; + friendsData[4] = "finaliyo"; + + listData = new ArrayList<>(); + list = findViewById(R.id.drawer_list); + prepareGenreList(null); + + // フィルターを有効にする + list.setTextFilterEnabled(true); + + //サイドメニューの検索バー + SearchView listSearch = findViewById(R.id.drawer_search); + listSearch.setOnQueryTextListener( + new SearchView.OnQueryTextListener() { + // 入力テキストに変更があったとき + @Override + public boolean onQueryTextChange(String s) { + if(isGenre){ + if(s.equals("")){ + prepareGenreList(null); + } else { + prepareGenreList(s); + } + } else { + if(s.equals("")){ + prepareFriendList(null); + } else { + prepareFriendList(s); + } + } + return false; + } + + // 検索ボタンを押したとき + @Override + public boolean onQueryTextSubmit(String s) { + return false; + } + } + ); + } + //右上のメニューを用意、マイページ画面への遷移 @Override public boolean onCreateOptionsMenu(@NonNull Menu menu) { getMenuInflater().inflate(R.menu.tool_menu, menu); @@ -58,4 +184,145 @@ return super.onOptionsItemSelected(item); } + + public void prepareGenreList(String s){ + // 現在表示されているリストがジャンルのリストかどうかを設定 + isGenre = true; + + // 一度リストのデータを取り除いてから追加する + listData.clear(); + for(int i = 0; i < genreData.length; i++){ + if(s == null) { + FilterDataModel fd = new FilterDataModel(); + fd.setText(genreData[i]); + listData.add(fd); + } else { + if(genreData[i].contains(s)){ + FilterDataModel fd = new FilterDataModel(); + fd.setText(genreData[i]); + listData.add(fd); + } + } + } + + // ListViewにデータをセットする + list.setAdapter(new MyAdapter( + this, + R.layout.filter_layout, + listData + )); + list.deferNotifyDataSetChanged(); + } + + public void prepareFriendList(String s){ + // 現在表示されているリストがジャンルのリストかどうかを設定 + isGenre = false; + + // 一度リストのデータを取り除いてから追加する + listData.clear(); + for(int i = 0; i < friendsData.length; i++){ + if(s == null) { + FilterDataModel fd = new FilterDataModel(); + fd.setText(friendsData[i]); + listData.add(fd); + } else { + if(friendsData[i].contains(s)){ + FilterDataModel fd = new FilterDataModel(); + fd.setText(friendsData[i]); + listData.add(fd); + } + } + } + + // ListViewにデータをセットする + list.setAdapter(new MyAdapter( + this, + R.layout.filter_layout, + listData + )); + list.deferNotifyDataSetChanged(); + } + + @Override + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + return false; + } + + // 内部クラス + private class MyAdapter extends ArrayAdapter { + private LayoutInflater layoutInflater; + public MyAdapter(Context context, int resourceId, List objects){ + super(context, resourceId, objects); + + layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + } + + // 画面外に行ったときにチェックがずれないようにする + @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); + } + + 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) { + checkBox.setChecked(nemophila.getSelectGenres().contains(item.getText())); + } else { + checkBox.setChecked(nemophila.getSelectFriends().contains(item.getText())); + } + + // チェックボックスを押したときの処理 + checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + if(b) { + if(isGenre) { + //Toast.makeText(MapsActivity.this, listData.get(position).getText(), Toast.LENGTH_SHORT).show(); + nemophila.setSelectGenres(listData.get(position).getText()); + } else { + nemophila.setSelectFriends(listData.get(position).getText()); + } + } else { + if(isGenre) { + //Toast.makeText(MapsActivity.this, listData.get(position).getText(), Toast.LENGTH_SHORT).show(); + nemophila.removeSelectGenres(listData.get(position).getText()); + } else { + nemophila.removeSelectFriends(listData.get(position).getText()); + } + } + FilterDataModel data = getItem(position); + data.isChecked = b; + } + }); + + return convertView; + } + } + + private static class FilterDataModel{ + private String text; + private boolean isChecked; + + public String getText() { + return text; + } + + public boolean isChecked() { + return isChecked; + } + + public void setText(String text) { + this.text = 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 a1c429c..0ed3186 100644 --- a/app/src/main/java/com/example/nemophila/MapsFragment.java +++ b/app/src/main/java/com/example/nemophila/MapsFragment.java @@ -78,6 +78,7 @@ nemophila = (Nemophila) getActivity().getApplication(); mMap = googleMap; + //ViewModelへのアクセス shopsViewModel = new ViewModelProvider(getActivity()).get(ShopsViewModel.class); @@ -265,29 +266,6 @@ //2回目移行 currentMarker.setPosition(current_location); } -// -// // マップに貼り付ける BitmapDescriptor生成 -// BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.drawable.icon_current); -// //Drawable ic_current = ResourcesCompat.getDrawable(getResources(),R.drawable.ic_current_location,null); -// -// // 貼り付設定 -// GroundOverlayOptions overlayOptions = new GroundOverlayOptions(); -// overlayOptions.image(descriptor); -// -// //public GroundOverlayOptions anchor (float u, float v) -// // (0,0):top-left, (0,1):bottom-left, (1,0):top-right, (1,1):bottom-right -// overlayOptions.anchor(0.5f, 0.5f); -// -// // 張り付け画像の大きさ メートル単位 -// // public GroundOverlayOptions position(LatLng location, float width, float height) -// overlayOptions.position(current_location, 200f, 200f); -// -// // マップに貼り付け・アルファを設定 -// currentOverlay = mMap.addGroundOverlay(overlayOptions); -// -// // 透明度 -// assert currentOverlay != null; -// currentOverlay.setTransparency(0.8F); } diff --git a/app/src/main/java/com/example/nemophila/Nemophila.java b/app/src/main/java/com/example/nemophila/Nemophila.java index 37d9e2b..14f1aed 100644 --- a/app/src/main/java/com/example/nemophila/Nemophila.java +++ b/app/src/main/java/com/example/nemophila/Nemophila.java @@ -30,7 +30,7 @@ //フィルターのデータ private HashSet selectGenres = new HashSet<>(); private HashSet selectFriends = new HashSet<>(); - private HashSet favoriteFriends = new HashSet<>(); + private HashSet favoriteFriends; //Account関連のGetter public String getName() { @@ -100,11 +100,11 @@ return selectFriends; } public HashSet getFavoriteFriends() { - if(favoriteFriends.isEmpty()){ + if(favoriteFriends == null){ SharedPreferences preferences = getSharedPreferences("prefData", MODE_PRIVATE); - favoriteFriends = (HashSet) preferences.getStringSet("favoriteFriends", new HashSet<>()); + favoriteFriends = new HashSet<>(preferences.getStringSet("favoriteFriends", new HashSet<>())); } - return new HashSet<>(favoriteFriends); + return favoriteFriends; } //Setter @@ -146,18 +146,21 @@ SharedPreferences.Editor editor = preferences.edit(); editor.putFloat("cameraLatitude", (float) cameraLatitude); this.cameraLatitude = cameraLatitude; + editor.commit(); } public void setCameraLongitude(double cameraLongitude) { SharedPreferences preferences = getSharedPreferences("prefData", MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putFloat("cameraLongitude", (float) cameraLongitude); this.cameraLongitude = cameraLongitude; + editor.commit(); } public void setZoom(float zoom) { SharedPreferences preferences = getSharedPreferences("prefData", MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putFloat("zoom", zoom); this.zoom = zoom; + editor.commit(); } //フィルター関連のSetter @@ -170,8 +173,9 @@ public void setFavoriteFriends(String favoriteFriend) { SharedPreferences preferences = getSharedPreferences("prefData", MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); - editor.putStringSet("favoriteFriends", favoriteFriends); this.favoriteFriends.add(favoriteFriend); + editor.putStringSet("favoriteFriends", favoriteFriends); + editor.commit(); } //フィルターを取り除く @@ -182,6 +186,6 @@ this.selectFriends.remove(selectFriend); } public void removeFavoriteFriends(String favoriteFriend){ - this.selectFriends.remove(favoriteFriend); + this.favoriteFriends.remove(favoriteFriend); } } diff --git a/app/src/main/java/com/example/nemophila/RequestedActivity.java b/app/src/main/java/com/example/nemophila/RequestedActivity.java index 5203dee..19e1515 100644 --- a/app/src/main/java/com/example/nemophila/RequestedActivity.java +++ b/app/src/main/java/com/example/nemophila/RequestedActivity.java @@ -4,9 +4,12 @@ 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; @@ -14,6 +17,7 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; +import android.widget.Toast; import com.example.nemophila.entities.Account; import com.example.nemophila.entities.AccountNameJson; @@ -24,10 +28,11 @@ import java.util.List; public class RequestedActivity extends AppCompatActivity { - - @Override protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_requested); + //初期化 FriendViewModel friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); Nemophila nemophila = (Nemophila) this.getApplication(); @@ -36,9 +41,6 @@ String uid = nemophila.getUid(); String token = nemophila.getToken(); - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_requested); - Button returnButton = (Button)findViewById(R.id.CancelButton); returnButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ @@ -48,11 +50,50 @@ }); RecyclerView rv = findViewById(R.id.requestedList); - RequestedAdapter adapter = new RequestedAdapter(requestedDataSet); + RequestedAdapter adapter = new RequestedAdapter(requestedDataSet) { + @Override + void onOkButtonClick(View view, int position, RequestedUserModel userModel) { + new AlertDialog.Builder(RequestedActivity.this) + .setTitle("確認") + .setMessage("フレンド申請を承諾します") + .setPositiveButton("OK", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + Toast.makeText(RequestedActivity.this, userModel.getName(), Toast.LENGTH_SHORT).show(); + System.out.println("承諾ボタンが押されました: " + userModel.getName()); + friendViewModel.putFriend(uid, userModel.getName() ,userModel.getId(), token); + } + }) + .setNegativeButton("Cancel", null) + .create() + .show(); + } + @Override + void onNoButtonClick(View view, int position, RequestedUserModel userModel) { + new AlertDialog.Builder(RequestedActivity.this) + .setTitle("警告") + .setMessage("フレンド申請を拒否します") + .setPositiveButton("OK", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + Toast.makeText(RequestedActivity.this, userModel.getName(), Toast.LENGTH_SHORT).show(); + System.out.println("拒否ボタンが押されました: " + userModel.getName()); + friendViewModel.deleteRequested(uid, userModel.getId(), token); + } + }) + .setNegativeButton("Cancel", null) + .create() + .show(); + } + }; + + RecyclerView.ItemDecoration itemDecoration = + new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); + + rv.addItemDecoration(itemDecoration); rv.setHasFixedSize(true); rv.setLayoutManager(llm); - rv.setAdapter(adapter); friendViewModel.getRequested(uid); friendViewModel.getRequestedLiveData().observe(this, new Observer>() { @@ -72,7 +113,7 @@ } //Adapter - public class RequestedAdapter extends RecyclerView.Adapter { + abstract public class RequestedAdapter extends RecyclerView.Adapter { private List list; public RequestedAdapter(List list) { this.list = list; @@ -86,6 +127,23 @@ public RequestedViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_requested_activity, parent,false); RequestedViewHolder vh = new RequestedViewHolder(inflate); + + vh.okButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + int position = vh.getBindingAdapterPosition(); + onOkButtonClick(view, position, list.get(position)); + } + }); + + vh.noButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + int position = vh.getBindingAdapterPosition(); + onNoButtonClick(view, position, list.get(position)); + } + }); + return vh; } @@ -98,15 +156,22 @@ public int getItemCount() { return list.size(); } + + abstract void onOkButtonClick(View view, int position, RequestedUserModel userModel); + abstract void onNoButtonClick(View view, int position, RequestedUserModel userModel); } //ViewHolder public class RequestedViewHolder extends RecyclerView.ViewHolder { public TextView nameView; + public Button okButton; + public Button noButton; public RequestedViewHolder(@NonNull View view) { super(view); nameView = (TextView) view.findViewById(R.id.textView3); + okButton = view.findViewById(R.id.okButton); + noButton = view.findViewById(R.id.noButton); } } diff --git a/app/src/main/java/com/example/nemophila/RequestingActivity.java b/app/src/main/java/com/example/nemophila/RequestingActivity.java index 692dd76..988fadd 100644 --- a/app/src/main/java/com/example/nemophila/RequestingActivity.java +++ b/app/src/main/java/com/example/nemophila/RequestingActivity.java @@ -8,6 +8,8 @@ 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; @@ -17,9 +19,12 @@ 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.Post; +import com.example.nemophila.viewmodels.AccountViewModel; import com.example.nemophila.viewmodels.FriendViewModel; import com.example.nemophila.viewmodels.PostsViewModel; @@ -29,14 +34,22 @@ 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を取得 - String uid = ((Nemophila)getApplication()).getUid(); - String token = ((Nemophila)getApplication()).getToken(); - String requestingId; + uid = ((Nemophila)getApplication()).getUid(); + token = ((Nemophila)getApplication()).getToken(); + + //左上のボタンでマイページへ遷移 Button returnButton = (Button)findViewById(R.id.requestingAcReturnButton); @@ -47,6 +60,9 @@ } }); + //idからアカウント名を検索するためのAccountViewModelを宣言しておく + AccountViewModel accountViewModel = new ViewModelProvider(this).get(AccountViewModel.class); + //フレンド検索ボタン Button requestingButton = (Button)findViewById(R.id.requestingSearchButton); requestingButton.setOnClickListener(new View.OnClickListener(){ @@ -54,22 +70,61 @@ public void onClick(View v){ //入力されたIDを取得 EditText editSearchId = (EditText) findViewById(R.id.inputRequestingId); - String searchingId = editSearchId.getText().toString(); - //取得したIDのユーザー名を受け取り、OKならreqyestingIdに入れる - String requestingName; - //申請を送るダイアログを表示 - RequestingDialogFragment dialog = new RequestingDialogFragment(); - dialog.show(getSupportFragmentManager(), "Requesting_dialog"); - //OK押したら申請するメソッドにuid、requestingId、tokenを渡す + searchingId = editSearchId.getText().toString(); + + //IDが存在しなければ落ちるのでその処理を書く + //取得したIDからアカウントを読み込んでおく + accountViewModel.fetchAccount(searchingId); + //検索用LiveDataへの購読 + accountViewModel.getAccountLiveData().observe(RequestingActivity.this, new Observer() { + + //ViewModelからアカウントが返ってくれば(データ変更があれば)実行 + @Override + public void onChanged(Account user) { + 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を渡す + } + }); + } }); - //RecyclerView(表示の設定、直接表示するところはLivedataを購読しているonChanged内にしたい) + + //RecyclerView(表示の設定、直接表示するところはLivedataを購読しているonChanged内に) List requestingDataList = new ArrayList<>(); - //xmlからrvにRecyclerViewを取得、アダプターを宣言 + //xmlからrvにRecyclerViewを取得 RecyclerView rv = (RecyclerView) findViewById(R.id.requestingList); - RequestingAdapter adapter = new RequestingAdapter(requestingDataList); + + //アダプターを宣言し、削除ボタンを押したときの処理をオーバーライド + 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); @@ -81,12 +136,11 @@ rv.setHasFixedSize(true); rv.setLayoutManager(llm); - //ViewModelを宣言し、申請先のデータをロードしておく - FriendViewModel friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); + //FriendViewModelを初期化し、申請先のデータをロードしておく + friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); friendViewModel.getRequesting(uid); //申請先の一覧のLiveDataへの購読 - friendViewModel.getRequestingLiveData().observe(this, new Observer>() { //データに変更があった時実行 @Override @@ -110,27 +164,16 @@ rv.setAdapter(adapter); } }); - - -// //表示テスト用に仮データ -// List testDataSet = new ArrayList<>(); -// for (int i = 0; i < 15; i++) { -// RequestingDataModel data = new RequestingDataModel(); -// data.setName("ネモフィラ太郎"+ i + "号(テスト)"); -// -// testDataSet.add(data); -// } -// //onChange内に書くべき表示部分 -// adapter.setList(testDataSet); -// rv.setAdapter(adapter); - - } + //ダイアログでOKを押した時に呼び出される フレンド申請を送るメソッド + public void putRequesting(){ + requestingId = searchingId; + friendViewModel.putRequesting(uid, requestingId, requestingName, token); + } //RecyclerViewのための内部クラス - //Adapter public class RequestingAdapter extends RecyclerView.Adapter { @@ -151,13 +194,13 @@ 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(); - // 処理はonItemClickに - onItemClick(v, position, list.get(position)); + // 処理はonDeleteClickに + onDeleteClick(v, position, list.get(position)); } }); @@ -174,7 +217,7 @@ return list.size(); } - void onItemClick(View view, int position, RequestingDataModel requesting) { + void onDeleteClick(View view, int position, RequestingDataModel requesting) { // このメソッドをActivity内でオーバーライドして、クリックイベントの処理を設定する } } diff --git a/app/src/main/java/com/example/nemophila/RequestingDialogFragment.java b/app/src/main/java/com/example/nemophila/RequestingDialogFragment.java index 03fa52f..22a3c07 100644 --- a/app/src/main/java/com/example/nemophila/RequestingDialogFragment.java +++ b/app/src/main/java/com/example/nemophila/RequestingDialogFragment.java @@ -10,16 +10,25 @@ import androidx.fragment.app.DialogFragment; public class RequestingDialogFragment extends DialogFragment { + private RequestingActivity requestingActivity; + + public RequestingDialogFragment(RequestingActivity requestingActivity) { + this.requestingActivity = requestingActivity; + } @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + + String message = getArguments().getString("message", ""); + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("フレンド申請") - .setMessage("IDにあったユーザー") + .setMessage(message + "さんに申請しますか?") .setPositiveButton("申請を送る", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { - // ボタンを押した時の処理 + // ボタンを押した時にフレンド申請を送る + requestingActivity.putRequesting(); } }) .setNegativeButton("キャンセル", null); diff --git a/app/src/main/java/com/example/nemophila/TestActivity.java b/app/src/main/java/com/example/nemophila/TestActivity.java index 6a9c2e7..3ff993a 100644 --- a/app/src/main/java/com/example/nemophila/TestActivity.java +++ b/app/src/main/java/com/example/nemophila/TestActivity.java @@ -69,7 +69,7 @@ "和食", "辛いね", "", "", ""); break; case 3: - friendViewModel.putRequesting("1111", "1112", "a95d68cc-4efb-49e2-8f55-799f768a5c09"); +// friendViewModel.putRequesting("1111", "1112", "a95d68cc-4efb-49e2-8f55-799f768a5c09"); } } }); 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 aec3547..8cc8f52 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java @@ -164,7 +164,7 @@ } //idからアカウント情報を取得するメソッド - private void fetchAccount(String id) { + public void fetchAccount(String id) { Call call = accountsRest.getAccount(id); call.enqueue(new Callback() { 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 3676d3f..a7493ca 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/FriendViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/FriendViewModel.java @@ -9,6 +9,7 @@ import com.example.nemophila.resources.AccountsRest; import com.example.nemophila.resources.FriendsRest; +import java.util.ArrayList; import java.util.Collection; import retrofit2.Call; @@ -56,34 +57,34 @@ public void onResponse(Call> call, Response> response) { if (response.isSuccessful()) { System.out.println("Successful"); - Collection accountNameJson = response.body(); - friendsLiveData.setValue(accountNameJson); - + friendsLiveData.setValue(response.body()); } else { - System.out.println("ResponseError"); + System.out.println("ResponseError: " + response.code()); } } @Override public void onFailure(Call> call, Throwable t) { - System.out.println(" NetworkError" + t); + System.out.println(" NetworkError: " + t); } }); } - public void putFriend(String uid,String fid, String token) { + public void putFriend(String uid, String fid, String name, String token) { Call call = friendsRest.putFriend(uid,fid,token); call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { if (response.isSuccessful()) { + addFriendLiveData(fid, name); + removeRequestedLiveData(fid); System.out.println("Successful"); } else { - System.out.println("ResponseError"); + System.out.println("ResponseError: " + response.code()); } } @Override public void onFailure(Call call, Throwable t) { - System.out.println(" NetworkError" + t); + System.out.println(" NetworkError: " + t); } }); } @@ -94,14 +95,15 @@ @Override public void onResponse(Call call, Response response) { if (response.isSuccessful()) { + removeFriendLiveData(fid); System.out.println("Successful"); } else { - System.out.println("ResponseError"); + System.out.println("ResponseError: " + response.code()); } } @Override public void onFailure(Call call, Throwable t) { - System.out.println(" NetworkError" + t); + System.out.println(" NetworkError: " + t); } }); } @@ -112,34 +114,34 @@ @Override public void onResponse(Call> call, Response> response) { if (response.isSuccessful()) { + requestingLiveData.setValue(response.body()); System.out.println("Successful"); - Collection accountNameJson = response.body(); - requestingLiveData.setValue(accountNameJson); } else { - System.out.println("ResponseError" + response.code()); + System.out.println("ResponseError: " + response.code()); } } @Override public void onFailure(Call> call, Throwable t) { - System.out.println(" NetworkError" + t); + System.out.println(" NetworkError: " + t); } }); } - public void putRequesting(String uid,String requesting_id, String token) { + public void putRequesting(String uid, String requesting_id, String name, String token) { Call call = friendsRest.putRequesting(uid,requesting_id,token); call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { if (response.isSuccessful()) { System.out.println("Successful"); + addRequestingLiveData(requesting_id, name); } else { - System.out.println("ResponseError" + response.code()); + System.out.println("ResponseError: " + response.code()); } } @Override public void onFailure(Call call, Throwable t) { - System.out.println(" NetworkError" + t); + System.out.println(" NetworkError: " + t); } }); } @@ -150,14 +152,15 @@ @Override public void onResponse(Call call, Response response) { if (response.isSuccessful()) { + removeRequestingLiveData(requesting_id); System.out.println("Successful"); } else { - System.out.println("ResponseError"); + System.out.println("ResponseError: " + response.code()); } } @Override public void onFailure(Call call, Throwable t) { - System.out.println(" NetworkError" + t); + System.out.println(" NetworkError: " + t); } }); } @@ -172,12 +175,12 @@ Collection accountNameJson = response.body(); requestedLiveData.setValue(accountNameJson); } else { - System.out.println("ResponseError"); + System.out.println("ResponseError: " + response.code()); } } @Override public void onFailure(Call> call, Throwable t) { - System.out.println(" NetworkError" + t); + System.out.println(" NetworkError: " + t); } }); } @@ -189,14 +192,73 @@ public void onResponse(Call call, Response response) { if (response.isSuccessful()) { System.out.println("Successful"); + removeRequestedLiveData(fid); } else { - System.out.println("ResponseError"); + System.out.println("ResponseError: " + response.code()); } } @Override public void onFailure(Call call, Throwable t) { - System.out.println(" NetworkError" + t); + System.out.println(" NetworkError: " + t); } }); } + + private AccountNameJson createAccountNameJson(String uid, String name) { + AccountNameJson anj = new AccountNameJson(); + anj.setUid(uid); + anj.setName(name); + return anj; + } + + private void addFriendLiveData(String uid, String name) { + ArrayList preData = new ArrayList<>(); + for (AccountNameJson anj: friendsLiveData.getValue()) { + preData.add(anj); + } + preData.add(createAccountNameJson(uid, name)); + friendsLiveData.setValue(preData); + } + + private void addRequestingLiveData(String uid, String name) { + ArrayList preData = new ArrayList<>(); + for (AccountNameJson anj: requestingLiveData.getValue()) { + preData.add(anj); + } + preData.add(createAccountNameJson(uid, name)); + requestedLiveData.setValue(preData); + } + + private void removeFriendLiveData(String id) { + ArrayList preData = new ArrayList<>(); + for (AccountNameJson anj: friendsLiveData.getValue()) { + if (anj.getUid().equals(id)) { + continue; + } + preData.add(anj); + friendsLiveData.setValue(preData); + } + } + + private void removeRequestingLiveData(String id) { + ArrayList preData = new ArrayList<>(); + for (AccountNameJson anj: requestingLiveData.getValue()) { + if (anj.getUid().equals(id)) { + continue; + } + preData.add(anj); + requestingLiveData.setValue(preData); + } + } + + private void removeRequestedLiveData(String id) { + ArrayList preData = new ArrayList<>(); + for (AccountNameJson anj: requestedLiveData.getValue()) { + if (anj.getUid().equals(id)) { + continue; + } + preData.add(anj); + requestedLiveData.setValue(preData); + } + } } diff --git a/app/src/main/res/layout/activity_maps.xml b/app/src/main/res/layout/activity_maps.xml index 7636d4b..df097a4 100644 --- a/app/src/main/res/layout/activity_maps.xml +++ b/app/src/main/res/layout/activity_maps.xml @@ -29,9 +29,10 @@ app:menu="@menu/tool_menu"> + android:layout_height="wrap_content" + app:queryHint="地名検索"/> @@ -68,6 +69,61 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" - app:menu="@menu/navdrawer_menu" /> + > + + + + + + +