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 @@ + + + + + +