diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index efd7422..17e4369 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -35,13 +35,14 @@
}
dependencies {
-
implementation(libs.appcompat)
implementation(libs.material)
implementation(libs.activity)
implementation(libs.constraintlayout)
implementation(libs.legacy.support.v4)
implementation(libs.recyclerview)
+ implementation(libs.retrofit2.retrofit)
+ implementation(libs.converter.jackson)
testImplementation(libs.junit)
androidTestImplementation(libs.ext.junit)
androidTestImplementation(libs.espresso.core)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2928fe9..041ace3 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -12,11 +12,17 @@
android:supportsRtl="true"
android:theme="@style/Theme.Tampopoclient"
tools:targetApi="31">
+
+
@@ -24,6 +30,9 @@
+
\ No newline at end of file
diff --git a/app/src/main/java/com/example/tampopo_client/MainActivity.java b/app/src/main/java/com/example/tampopo_client/MainActivity.java
deleted file mode 100644
index 8700a7e..0000000
--- a/app/src/main/java/com/example/tampopo_client/MainActivity.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.example.tampopo_client;
-
-import android.os.Bundle;
-
-import androidx.activity.EdgeToEdge;
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.core.graphics.Insets;
-import androidx.core.view.ViewCompat;
-import androidx.core.view.WindowInsetsCompat;
-
-public class MainActivity extends AppCompatActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- EdgeToEdge.enable(this);
- setContentView(R.layout.activity_main);
- ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
- Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
- v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
- return insets;
- });
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/tampopo_client/models/FriendPair.java b/app/src/main/java/com/example/tampopo_client/models/FriendPair.java
new file mode 100644
index 0000000..4f9c35f
--- /dev/null
+++ b/app/src/main/java/com/example/tampopo_client/models/FriendPair.java
@@ -0,0 +1,36 @@
+package com.example.tampopo_client.models;
+
+public class FriendPair {
+ private Integer id;
+ private String user0Id;
+ private String user1Id;
+
+ public FriendPair(String user0Id, String user1Id) {
+ this.user0Id = user0Id;
+ this.user1Id = user1Id;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getUser0Id() {
+ return user0Id;
+ }
+
+ public void setUser0Id(String user0Id) {
+ this.user0Id = user0Id;
+ }
+
+ public String getUser1Id() {
+ return user1Id;
+ }
+
+ public void setUser1Id(String user1Id) {
+ this.user1Id = user1Id;
+ }
+}
diff --git a/app/src/main/java/com/example/tampopo_client/resources/FriendsResource.java b/app/src/main/java/com/example/tampopo_client/resources/FriendsResource.java
new file mode 100644
index 0000000..c390536
--- /dev/null
+++ b/app/src/main/java/com/example/tampopo_client/resources/FriendsResource.java
@@ -0,0 +1,34 @@
+package com.example.tampopo_client.resources;
+
+import com.example.tampopo_client.models.FriendPair;
+
+import retrofit2.Call;
+import retrofit2.http.DELETE;
+import retrofit2.http.Field;
+import retrofit2.http.FormUrlEncoded;
+import retrofit2.http.GET;
+import retrofit2.http.POST;
+import retrofit2.http.Path;
+import retrofit2.http.Query;
+
+public interface FriendsResource {
+ @FormUrlEncoded
+ @POST("friends")
+ Call postFriends(
+ @Field("token") String token,
+ @Field("user0-id") String user0Id,
+ @Field("user1-id") String user1Id
+ );
+
+ @GET("friends/{pair_id}/")
+ Call getFriend(
+ @Query("token") String token,
+ @Path("pair_id") String pairId
+ );
+
+ @DELETE("friends/{pair_id}/")
+ void deleteFriend(
+ @Query("token") String token,
+ @Path("pair_id") String pair_id
+ );
+}
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
new file mode 100644
index 0000000..b85f756
--- /dev/null
+++ b/app/src/main/java/com/example/tampopo_client/viewmodels/FriendViewModel.java
@@ -0,0 +1,22 @@
+package com.example.tampopo_client.viewmodels;
+
+import androidx.lifecycle.ViewModel;
+
+import com.example.tampopo_client.resources.FriendsResource;
+
+import retrofit2.Retrofit;
+import retrofit2.converter.jackson.JacksonConverterFactory;
+
+public class FriendViewModel extends ViewModel {
+
+ private final Retrofit retrofit;
+ private final FriendsResource friendsResource;
+
+ public FriendViewModel(){
+ this.retrofit = new Retrofit.Builder()
+ .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/tampopo-server/")
+ .addConverterFactory(JacksonConverterFactory.create())
+ .build();
+ this.friendsResource = retrofit.create(FriendsResource.class);
+ }
+}
diff --git a/app/src/main/java/com/example/tampopo_client/views/FriendListFragment.java b/app/src/main/java/com/example/tampopo_client/views/FriendListFragment.java
new file mode 100644
index 0000000..b616b19
--- /dev/null
+++ b/app/src/main/java/com/example/tampopo_client/views/FriendListFragment.java
@@ -0,0 +1,72 @@
+package com.example.tampopo_client.views;
+
+import android.content.Context;
+import android.os.Bundle;
+
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.example.tampopo_client.R;
+import com.example.tampopo_client.views.placeholder.PlaceholderContent;
+
+/**
+ * A fragment representing a list of Items.
+ */
+public class FriendListFragment extends Fragment {
+
+ // TODO: Customize parameter argument names
+ private static final String ARG_COLUMN_COUNT = "column-count";
+ // TODO: Customize parameters
+ private int mColumnCount = 1;
+
+ /**
+ * Mandatory empty constructor for the fragment manager to instantiate the
+ * fragment (e.g. upon screen orientation changes).
+ */
+ public FriendListFragment() {
+ }
+
+ // TODO: Customize parameter initialization
+ @SuppressWarnings("unused")
+ public static FriendListFragment newInstance(int columnCount) {
+ FriendListFragment fragment = new FriendListFragment();
+ Bundle args = new Bundle();
+ args.putInt(ARG_COLUMN_COUNT, columnCount);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if (getArguments() != null) {
+ mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT);
+ }
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.fragment_friend_list_list, container, false);
+
+ // Set the adapter
+ if (view instanceof RecyclerView) {
+ Context context = view.getContext();
+ RecyclerView recyclerView = (RecyclerView) view;
+ if (mColumnCount <= 1) {
+ recyclerView.setLayoutManager(new LinearLayoutManager(context));
+ } else {
+ recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount));
+ }
+ recyclerView.setAdapter(new MyFriendRecyclerViewAdapter(PlaceholderContent.ITEMS));
+ }
+ return view;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/tampopo_client/views/LaunchActivity.java b/app/src/main/java/com/example/tampopo_client/views/LaunchActivity.java
new file mode 100644
index 0000000..ecdf98e
--- /dev/null
+++ b/app/src/main/java/com/example/tampopo_client/views/LaunchActivity.java
@@ -0,0 +1,26 @@
+package com.example.tampopo_client.views;
+
+import android.os.Bundle;
+
+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 com.example.tampopo_client.R;
+
+public class LaunchActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ EdgeToEdge.enable(this);
+ setContentView(R.layout.activity_launch);
+ ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
+ Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
+ v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
+ return insets;
+ });
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..a72efcb
--- /dev/null
+++ b/app/src/main/java/com/example/tampopo_client/views/LoginActivity.java
@@ -0,0 +1,25 @@
+package com.example.tampopo_client.views;
+
+import android.os.Bundle;
+
+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 com.example.tampopo_client.R;
+
+public class LoginActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ EdgeToEdge.enable(this);
+ setContentView(R.layout.activity_login);
+ ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
+ Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
+ v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
+ return insets;
+ });
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/tampopo_client/views/MainActivity.java b/app/src/main/java/com/example/tampopo_client/views/MainActivity.java
new file mode 100644
index 0000000..e9a31b3
--- /dev/null
+++ b/app/src/main/java/com/example/tampopo_client/views/MainActivity.java
@@ -0,0 +1,26 @@
+package com.example.tampopo_client.views;
+
+import android.os.Bundle;
+
+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 com.example.tampopo_client.R;
+
+public class MainActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ EdgeToEdge.enable(this);
+ setContentView(R.layout.activity_main);
+ ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
+ Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
+ v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
+ return insets;
+ });
+ }
+}
\ 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
new file mode 100644
index 0000000..5ee7ffe
--- /dev/null
+++ b/app/src/main/java/com/example/tampopo_client/views/MyFriendRecyclerViewAdapter.java
@@ -0,0 +1,62 @@
+package com.example.tampopo_client.views;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.example.tampopo_client.views.placeholder.PlaceholderContent.PlaceholderItem;
+import com.example.tampopo_client.databinding.FragmentFriendListBinding;
+
+import java.util.List;
+
+/**
+ * {@link RecyclerView.Adapter} that can display a {@link PlaceholderItem}.
+ * TODO: Replace the implementation with code for your data type.
+ */
+public class MyFriendRecyclerViewAdapter extends RecyclerView.Adapter {
+
+ private final List mValues;
+
+ public MyFriendRecyclerViewAdapter(List items) {
+ mValues = items;
+ }
+
+ @Override
+ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+
+ return new ViewHolder(FragmentFriendListBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
+
+ }
+
+ @Override
+ public void onBindViewHolder(final ViewHolder holder, int position) {
+ holder.mItem = mValues.get(position);
+ holder.mIdView.setText(mValues.get(position).id);
+ holder.mContentView.setText(mValues.get(position).content);
+ }
+
+ @Override
+ public int getItemCount() {
+ return mValues.size();
+ }
+
+ public class ViewHolder extends RecyclerView.ViewHolder {
+ public final TextView mIdView;
+ public final TextView mContentView;
+ public PlaceholderItem mItem;
+
+ public ViewHolder(FragmentFriendListBinding binding) {
+ super(binding.getRoot());
+ mIdView = binding.itemNumber;
+ mContentView = binding.content;
+ }
+
+ @Override
+ public String toString() {
+ return super.toString() + " '" + mContentView.getText() + "'";
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/tampopo_client/views/RegisterActivity.java b/app/src/main/java/com/example/tampopo_client/views/RegisterActivity.java
new file mode 100644
index 0000000..16cf924
--- /dev/null
+++ b/app/src/main/java/com/example/tampopo_client/views/RegisterActivity.java
@@ -0,0 +1,26 @@
+package com.example.tampopo_client.views;
+
+import android.os.Bundle;
+
+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 com.example.tampopo_client.R;
+
+public class RegisterActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ EdgeToEdge.enable(this);
+ setContentView(R.layout.activity_register);
+ ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
+ Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
+ v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
+ return insets;
+ });
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_launch.xml b/app/src/main/res/layout/activity_launch.xml
new file mode 100644
index 0000000..2c9d1d3
--- /dev/null
+++ b/app/src/main/res/layout/activity_launch.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..072e326
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_register.xml b/app/src/main/res/layout/activity_register.xml
new file mode 100644
index 0000000..92ac08c
--- /dev/null
+++ b/app/src/main/res/layout/activity_register.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_friend_list.xml b/app/src/main/res/layout/fragment_friend_list.xml
new file mode 100644
index 0000000..1877568
--- /dev/null
+++ b/app/src/main/res/layout/fragment_friend_list.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_friend_list_list.xml b/app/src/main/res/layout/fragment_friend_list_list.xml
new file mode 100644
index 0000000..f9368e4
--- /dev/null
+++ b/app/src/main/res/layout/fragment_friend_list_list.xml
@@ -0,0 +1,13 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d2f85a0..3361ad6 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,3 +1,3 @@
- tampopo-client
+ tampopo-client
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index efc9070..7db8943 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -9,6 +9,9 @@
constraintlayout = "2.2.0"
legacySupportV4 = "1.0.0"
recyclerview = "1.3.2"
+retrofit = "3.1.0-SNAPSHOT"
+retrofitVersion = "3.0.0"
+converterJackson = "3.0.0"
[libraries]
junit = { group = "junit", name = "junit", version.ref = "junit" }
@@ -20,6 +23,9 @@
constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
legacy-support-v4 = { group = "androidx.legacy", name = "legacy-support-v4", version.ref = "legacySupportV4" }
recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerview" }
+retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
+retrofit2-retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofitVersion" }
+converter-jackson = { group = "com.squareup.retrofit2", name = "converter-jackson", version.ref = "converterJackson" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }