diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2179e9b..012205b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> > getActivities(@Path("user_id") String userId, @Query("filter") String filter); + + @POST("users/{user_id}/activities") + @FormUrlEncoded + Call addActivity(@Path("user_id") String userId, @Field("token") String token, @Field("new-activity") String newActivity); // FIXME: We need to rename new-activity to new_activity + + @GET("users/{user_id}/activities/{activity_id}") + Call getActivity(@Path("user_id") String userId, @Path("activity_id") String activityId); + + @DELETE("users/{user_id}/activities/{activity_id}") + Call deleteActivity(@Path("user_id") String userId, @Path("activity_id") String activityId, @Query("token") String token); + + @GET("users/{user_id}/activities/{activity_id}/text") + Call getText(@Path("user_id") String userId, @Path("activity_id") String activityId); + + @GET("users/{user_id}/activities/{activity_id}/updated-time") + Call getUpdatedTime(@Path("user_id") String userId, @Path("activity_id") String activityId); + + @GET("users/{user_id}/activities/last-updated-time") + Call getLastUpdatedTime(@Path("user_id") String userId, @Path("activity_id") String activityId); +} diff --git a/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java b/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java new file mode 100644 index 0000000..72d5f07 --- /dev/null +++ b/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java @@ -0,0 +1,84 @@ +package com.example.tampopo_client.viewmodels; + +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import com.example.tampopo_client.models.Activity; +import com.example.tampopo_client.resources.ActivitiesResource; + +import java.util.ArrayList; +import java.util.List; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.jackson.JacksonConverterFactory; + +/** + * アクティビティを扱うためのViewModel + * + * @author Shohei Yamagiwa + * @implNote Repositoryは作成せずに、すべてViewModelで処理する + */ +public class ActivityViewModel extends ViewModel { + private final ActivitiesResource activitiesResource; + + private final MutableLiveData> activitiesLiveData; + + public ActivityViewModel() { + final Retrofit retrofit = new Retrofit.Builder() + .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/tampopo-server/") + .addConverterFactory(JacksonConverterFactory.create()) + .build(); + activitiesResource = retrofit.create(ActivitiesResource.class); + + activitiesLiveData = new MutableLiveData<>(List.of()); + } + + public void createActivity(String userId, String token, String newActivity) { + Call createActivityCall = activitiesResource.addActivity(userId, token, newActivity); + createActivityCall.enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + if (response.isSuccessful()) { + String createdActivityId = response.body(); + + // TODO: 仮作成なので改善必須 + Call getActivityCall = activitiesResource.getActivity(userId, createdActivityId); + getActivityCall.enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + List activities = activitiesLiveData.getValue(); + if (activities == null) { + activities = new ArrayList<>(); + } + Activity createdActivity = response.body(); + activities.add(createdActivity); + activitiesLiveData.postValue(activities); + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + Log.e(ActivityViewModel.class.getSimpleName(), "An error has occurred.", t); + } + }); + } else { + Log.e(ActivityViewModel.class.getSimpleName(), response.code() + " " + response.message()); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + Log.e(ActivityViewModel.class.getSimpleName(), "An error has occurred.", t); + } + }); + } + + public MutableLiveData> getActivitiesLiveData() { + return activitiesLiveData; + } +} diff --git a/app/src/main/java/com/example/tampopo_client/viewmodels/FriendViewModel.java b/app/src/main/java/com/example/tampopo_client/viewmodels/FriendViewModel.java index 5ebbfcb..a4e6274 100644 --- a/app/src/main/java/com/example/tampopo_client/viewmodels/FriendViewModel.java +++ b/app/src/main/java/com/example/tampopo_client/viewmodels/FriendViewModel.java @@ -3,6 +3,7 @@ import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; +import com.example.tampopo_client.models.FriendPair; import com.example.tampopo_client.resources.FriendsResource; import com.example.tampopo_client.resources.UserResource; @@ -13,6 +14,7 @@ import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.jackson.JacksonConverterFactory; +import retrofit2.http.Field; public class FriendViewModel extends ViewModel { @@ -20,20 +22,25 @@ private final UserResource usersResource; private final FriendsResource friendsResource; private final MutableLiveData> friendIdsLiveData; + private final MutableLiveData friendPair; public FriendViewModel(){ this.retrofit = new Retrofit.Builder() - .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/tampopo-server/") + .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/tampopo/") .addConverterFactory(JacksonConverterFactory.create()) .build(); this.usersResource = retrofit.create(UserResource.class); this.friendsResource = retrofit.create(FriendsResource.class); this.friendIdsLiveData = new MutableLiveData<>(); + this.friendPair = new MutableLiveData<>(); } public MutableLiveData> getFriendIdsLiveData(){ return this.friendIdsLiveData; } + public MutableLiveData getFriendPair(){ + return this.friendPair; + } public void loadFriends(String userId, String token){ Call> call = usersResource.getFriends(userId, token); @@ -56,4 +63,25 @@ } }); } + + public void addFriend(String token, String user0Id, String user1Id){ + Call call = friendsResource.createFriend(token, user0Id, user1Id); + + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if(response.isSuccessful()){ + friendPair.setValue(response.body()); + System.out.println(response.code()); + }else{ + System.out.println(response.code()); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("NetWorkError" + t); + } + }); + } } diff --git a/app/src/main/java/com/example/tampopo_client/viewmodels/UserViewModel.java b/app/src/main/java/com/example/tampopo_client/viewmodels/UserViewModel.java index effcf58..e106806 100644 --- a/app/src/main/java/com/example/tampopo_client/viewmodels/UserViewModel.java +++ b/app/src/main/java/com/example/tampopo_client/viewmodels/UserViewModel.java @@ -24,6 +24,16 @@ viewModel側  viewModelからsetValueで値を変えていく updateUserName、updateEmail、login、createUserもある。それらを書いていく。viewから必要なものを出していく + +viewとviewModels +イベントパターン +1.画面を表示するごとに値を取る +2.ボタンを押した際の通信をする +3.画面の途中で更新する + +view側がviewModelを使うための方法 +1.最初にUserViewModel userViewModelで宣言 88行目 userViewModelのインスタンスを作る + */ public class UserViewModel extends ViewModel { @@ -49,21 +59,45 @@ public LiveDataisLoading() { return loading;} public LiveData getError() { return error; } - //新規登録 + //新規登録 enqueueで非同期処理、Callbackで成功失敗の処理、LiveDataに反映 + //サーバーから返ってきた型と合わせないとFailureに流れる + //tokenはログイン処理後に発行されるため削除しました。 public void createUser(String id, String password) { loading.setValue(true); userResource.createUser(id, password).enqueue(new Callback() { @Override public void onResponse(Call c, Response res) { loading.setValue(false); if (res.isSuccessful()) { - user.setValue(res.body()); + User u = res.body(); + user.setValue(u); } else { error.setValue("登録失敗: " + res.code()); } } @Override public void onFailure(Call c, Throwable t) { loading.setValue(false); - error.setValue("ネットワークエラー: " + t.getMessage()); + error.setValue("エラー: " + t.getMessage()); + } + }); + } + + //ログイン + public void login(String id, String password) { + loading.setValue(true); + userResource.login(id, password).enqueue(new Callback() { + @Override public void onResponse(Call c, Response res) { + loading.setValue(false); + if (res.isSuccessful()) { + userResource.getUser(id); + token.setValue(res.body()); + + } else { + error.setValue("ログイン失敗: " + res.code()); + } + } + @Override public void onFailure(Call c, Throwable t) { + loading.setValue(false); + error.setValue("エラー: " + t.getMessage()); } }); } diff --git a/app/src/main/java/com/example/tampopo_client/views/LoginActivity.java b/app/src/main/java/com/example/tampopo_client/views/LoginActivity.java index a72efcb..64a5c94 100644 --- a/app/src/main/java/com/example/tampopo_client/views/LoginActivity.java +++ b/app/src/main/java/com/example/tampopo_client/views/LoginActivity.java @@ -1,16 +1,26 @@ package com.example.tampopo_client.views; +import android.content.Intent; import android.os.Bundle; - +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import androidx.lifecycle.ViewModelProvider; import com.example.tampopo_client.R; +import com.example.tampopo_client.Tampopo; +import com.example.tampopo_client.viewmodels.UserViewModel; public class LoginActivity extends AppCompatActivity { + UserViewModel userViewModel; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -21,5 +31,46 @@ v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + userViewModel = new ViewModelProvider(this).get(UserViewModel.class); + + userViewModel.getError().observe(this, + msg -> { + if (msg != null) { + Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); + } + }); + + Button button_login = (Button) findViewById(R.id.loginbutton); + button_login.setOnClickListener(new OnClickListener() { + + private Object getApplication; + + public void onClick(View v) { + EditText useridInput = (EditText) findViewById(R.id.userIDText); + String userid = useridInput.getText().toString(); + EditText passwordInput = (EditText) findViewById(R.id.PasswordText); + String password = passwordInput.getText().toString(); + userViewModel.login(userid, password); + + userViewModel.getToken().getValue(); + //TODO:上記のトークンを使ってTampopoクラスにセットするコードを書く + //((Tampopo)this.getApplication).setToken(token); + + + Intent intent = new Intent(LoginActivity.this, MainActivity.class); + startActivity(intent); + + } + }); + + Button button_createaccount = (Button) findViewById(R.id.createaccountbutton); + button_createaccount.setOnClickListener(new OnClickListener() { + + public void onClick(View v) { + Intent intent = new Intent(LoginActivity.this, RegisterActivity.class); + startActivity(intent); + } + }); + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/tampopo_client/views/MyFriendRecyclerViewAdapter.java b/app/src/main/java/com/example/tampopo_client/views/MyFriendRecyclerViewAdapter.java index bbcd4e4..1bdcbeb 100644 --- a/app/src/main/java/com/example/tampopo_client/views/MyFriendRecyclerViewAdapter.java +++ b/app/src/main/java/com/example/tampopo_client/views/MyFriendRecyclerViewAdapter.java @@ -33,7 +33,7 @@ @Override public void onBindViewHolder(final ViewHolder holder, int position) { holder.mItem = mValues.get(position); - holder.mIdView.setText(mValues.get(position).id); + //holder.mIdView.setText(mValues.get(position).id); holder.mContentView.setText(mValues.get(position).content); } @@ -43,13 +43,13 @@ } public class ViewHolder extends RecyclerView.ViewHolder { - public final TextView mIdView; + //public final TextView mIdView; public final TextView mContentView; public FriendContent.FriendItem mItem; public ViewHolder(FragmentFriendListBinding binding) { super(binding.getRoot()); - mIdView = binding.itemNumber; + //mIdView = binding.itemNumber; mContentView = binding.content; } diff --git a/app/src/main/java/com/example/tampopo_client/views/MyFriendRequestRecyclerViewAdapter.java b/app/src/main/java/com/example/tampopo_client/views/MyFriendRequestRecyclerViewAdapter.java index ebe4c76..9640389 100644 --- a/app/src/main/java/com/example/tampopo_client/views/MyFriendRequestRecyclerViewAdapter.java +++ b/app/src/main/java/com/example/tampopo_client/views/MyFriendRequestRecyclerViewAdapter.java @@ -33,7 +33,7 @@ @Override public void onBindViewHolder(final ViewHolder holder, int position) { holder.mItem = mValues.get(position); - holder.mIdView.setText(mValues.get(position).id); + //holder.mIdView.setText(mValues.get(position).id); holder.mContentView.setText(mValues.get(position).content); } @@ -43,13 +43,13 @@ } public class ViewHolder extends RecyclerView.ViewHolder { - public final TextView mIdView; + //public final TextView mIdView; public final TextView mContentView; public FriendRequestItem mItem; public ViewHolder(FragmentFriendReceivedBinding binding) { super(binding.getRoot()); - mIdView = binding.itemNumber; + //mIdView = binding.itemNumber; mContentView = binding.content; } diff --git a/app/src/main/java/com/example/tampopo_client/views/placeholder/FriendContent.java b/app/src/main/java/com/example/tampopo_client/views/placeholder/FriendContent.java index 7db3489..4521cdc 100644 --- a/app/src/main/java/com/example/tampopo_client/views/placeholder/FriendContent.java +++ b/app/src/main/java/com/example/tampopo_client/views/placeholder/FriendContent.java @@ -24,7 +24,7 @@ */ public static final Map ITEM_MAP = new HashMap(); - private static final int COUNT = 25; + private static final int COUNT = 30; static { // Add some sample items. @@ -42,7 +42,7 @@ private static FriendItem createPlaceholderItem(int position) { - return new FriendItem(String.valueOf(position), "Item " + position, makeDetails(position)); + return new FriendItem(String.valueOf(position), "ユーザー名 " , makeDetails(position)); } diff --git a/app/src/main/java/com/example/tampopo_client/views/placeholder/FriendRequestContent.java b/app/src/main/java/com/example/tampopo_client/views/placeholder/FriendRequestContent.java index fb43f8f..cd141e8 100644 --- a/app/src/main/java/com/example/tampopo_client/views/placeholder/FriendRequestContent.java +++ b/app/src/main/java/com/example/tampopo_client/views/placeholder/FriendRequestContent.java @@ -5,26 +5,17 @@ import java.util.List; import java.util.Map; -/** - * Helper class for providing sample content for user interfaces created by - * Android template wizards. - *

- * TODO: Replace all uses of this class before publishing your app. - */ public class FriendRequestContent { - /** - * An array of sample (placeholder) items. - */ + //FriendRequestを格納するリスト public static final List ITEMS = new ArrayList(); - /** - * A map of sample (placeholder) items, by ID. - */ + //各アイテムにアクセスするためのID付きマップ*/ public static final Map ITEM_MAP = new HashMap(); - private static final int COUNT = 25; + private static final int COUNT = 30; //データ30個作成 + //アイテムを初期化時に追加する static { // Add some sample items. for (int i = 1; i <= COUNT; i++) { @@ -32,15 +23,18 @@ } } + //アイテムをリストとマップの両方に登録するメソッド private static void addItem(FriendRequestItem item) { ITEMS.add(item); ITEM_MAP.put(item.id, item); } + //位置(1,2,...)に応じたFriendRequestItem を生成するメソッド private static FriendRequestItem createPlaceholderItem(int position) { - return new FriendRequestItem(String.valueOf(position), "Item " + position, makeDetails(position)); + return new FriendRequestItem(String.valueOf(position), "ユーザー名 ", makeDetails(position)); } + //詳細説明用の文字列を作るメソッド。position に応じて「詳細情報」がたくさん増える private static String makeDetails(int position) { StringBuilder builder = new StringBuilder(); builder.append("Details about Item: ").append(position); @@ -50,13 +44,11 @@ return builder.toString(); } - /** - * A placeholder item representing a piece of content. - */ + //FriendRequestを表す1件のデータ public static class FriendRequestItem { - public final String id; - public final String content; - public final String details; + public final String id; //アイテムのID + public final String content; //表示される名前 + public final String details; //詳細説明 public FriendRequestItem(String id, String content, String details) { this.id = id; diff --git a/app/src/main/res/drawable/eye.png b/app/src/main/res/drawable/eye.png new file mode 100644 index 0000000..0cb343f --- /dev/null +++ b/app/src/main/res/drawable/eye.png Binary files differ diff --git a/app/src/main/res/layout/activity_friend.xml b/app/src/main/res/layout/activity_friend.xml index 6f2939d..880385d 100644 --- a/app/src/main/res/layout/activity_friend.xml +++ b/app/src/main/res/layout/activity_friend.xml @@ -1,6 +1,7 @@ - + android:layout_width="413dp" + android:layout_height="590dp" + android:theme="@style/Theme.AppCompat.DayNight.DarkActionBar" + app:layout_constraintBottom_toTopOf="@+id/nav_view" + tools:layout_editor_absoluteX="0dp"> + tools:context=".views.LoginActivity" + android:background="#E0F7FA"> + + + + + +