From 87c76e2614fa75d6dfb45de95c3450e00c52806f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedek=20L=C3=A1szl=C3=B3?= Date: Sat, 4 May 2024 18:02:41 +0200 Subject: [PATCH] basic feed --- app/build.gradle | 3 + .../java/com/dowerx/quack/FeedFragment.java | 72 +++++++++++++++++ .../java/com/dowerx/quack/MainActivity.java | 2 + .../dowerx/quack/PostRecyclerViewAdapter.java | 57 +++++++++++++ .../com/dowerx/quack/RegisterActivity.java | 1 + .../com/dowerx/quack/SwitcherActivity.java | 31 ++++++- .../java/com/dowerx/quack/model/Post.java | 81 +++++++++++++++++++ .../java/com/dowerx/quack/model/User.java | 37 +++++++++ app/src/main/res/drawable/feed.xml | 9 +++ app/src/main/res/drawable/post.xml | 13 +++ app/src/main/res/drawable/profile.xml | 5 ++ app/src/main/res/drawable/search.xml | 5 ++ app/src/main/res/layout/activity_switcher.xml | 21 +++++ .../main/res/layout/fragment_feed_list.xml | 13 +++ app/src/main/res/layout/fragment_post.xml | 27 +++++++ app/src/main/res/menu/switcher_menu.xml | 19 +++++ app/src/main/res/values/dimens.xml | 4 + app/src/main/res/values/strings.xml | 5 ++ gradle/libs.versions.toml | 4 + 19 files changed, 408 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/dowerx/quack/FeedFragment.java create mode 100644 app/src/main/java/com/dowerx/quack/PostRecyclerViewAdapter.java create mode 100644 app/src/main/java/com/dowerx/quack/model/Post.java create mode 100644 app/src/main/java/com/dowerx/quack/model/User.java create mode 100644 app/src/main/res/drawable/feed.xml create mode 100644 app/src/main/res/drawable/post.xml create mode 100644 app/src/main/res/drawable/profile.xml create mode 100644 app/src/main/res/drawable/search.xml create mode 100644 app/src/main/res/layout/fragment_feed_list.xml create mode 100644 app/src/main/res/layout/fragment_post.xml create mode 100644 app/src/main/res/menu/switcher_menu.xml create mode 100644 app/src/main/res/values/dimens.xml diff --git a/app/build.gradle b/app/build.gradle index 38e12b7..da0ff45 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -35,6 +35,7 @@ android { } buildFeatures { compose true + viewBinding true } composeOptions { kotlinCompilerExtensionVersion '1.5.1' @@ -59,6 +60,8 @@ dependencies { implementation libs.ui.graphics implementation libs.ui.tooling.preview implementation libs.material3 + implementation libs.legacy.support.v4 + implementation libs.recyclerview testImplementation libs.junit androidTestImplementation libs.ext.junit androidTestImplementation libs.espresso.core diff --git a/app/src/main/java/com/dowerx/quack/FeedFragment.java b/app/src/main/java/com/dowerx/quack/FeedFragment.java new file mode 100644 index 0000000..97dd694 --- /dev/null +++ b/app/src/main/java/com/dowerx/quack/FeedFragment.java @@ -0,0 +1,72 @@ +package com.dowerx.quack; + +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.dowerx.quack.model.Post; + +/** + * A fragment representing a list of Items. + */ +public class FeedFragment 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 FeedFragment() { + } + + // TODO: Customize parameter initialization + @SuppressWarnings("unused") + public static FeedFragment newInstance(int columnCount) { + FeedFragment fragment = new FeedFragment(); + 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_feed_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)); + } + // TODO: get posts + recyclerView.setAdapter(new PostRecyclerViewAdapter(Post.ITEMS)); + } + return view; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dowerx/quack/MainActivity.java b/app/src/main/java/com/dowerx/quack/MainActivity.java index 92f6896..9736130 100644 --- a/app/src/main/java/com/dowerx/quack/MainActivity.java +++ b/app/src/main/java/com/dowerx/quack/MainActivity.java @@ -25,6 +25,8 @@ public class MainActivity extends AppCompatActivity { } public void login(View view) { + // TODO: login + startActivity(new Intent(this, SwitcherActivity.class)); } public void redirect_register(View view) { diff --git a/app/src/main/java/com/dowerx/quack/PostRecyclerViewAdapter.java b/app/src/main/java/com/dowerx/quack/PostRecyclerViewAdapter.java new file mode 100644 index 0000000..a949aae --- /dev/null +++ b/app/src/main/java/com/dowerx/quack/PostRecyclerViewAdapter.java @@ -0,0 +1,57 @@ +package com.dowerx.quack; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import android.view.LayoutInflater; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.dowerx.quack.databinding.FragmentPostBinding; +import com.dowerx.quack.model.Post; +import java.util.List; + +public class PostRecyclerViewAdapter extends RecyclerView.Adapter { + + private final List mValues; + + public PostRecyclerViewAdapter(List items) { + mValues = items; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(FragmentPostBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + @Override + public void onBindViewHolder(final ViewHolder holder, int position) { + holder.mItem = mValues.get(position); + holder.username.setText(holder.mItem.getUser().getUsername()); + holder.content.setText(holder.mItem.getContent()); + } + + @Override + public int getItemCount() { + return mValues.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + public final TextView username; + public final TextView content; + public Post mItem; + + public ViewHolder(@NonNull FragmentPostBinding binding) { + super(binding.getRoot()); + username = binding.username; + content = binding.content; + } + + @NonNull + @Override + public String toString() { + return super.toString() + " '" + content.getText() + "'"; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dowerx/quack/RegisterActivity.java b/app/src/main/java/com/dowerx/quack/RegisterActivity.java index aa608ab..e2f5aec 100644 --- a/app/src/main/java/com/dowerx/quack/RegisterActivity.java +++ b/app/src/main/java/com/dowerx/quack/RegisterActivity.java @@ -25,6 +25,7 @@ public class RegisterActivity extends AppCompatActivity { } public void register(View view) { + // TODO: register } public void redirect_login(View view) { diff --git a/app/src/main/java/com/dowerx/quack/SwitcherActivity.java b/app/src/main/java/com/dowerx/quack/SwitcherActivity.java index 420fca1..4214373 100644 --- a/app/src/main/java/com/dowerx/quack/SwitcherActivity.java +++ b/app/src/main/java/com/dowerx/quack/SwitcherActivity.java @@ -1,14 +1,19 @@ package com.dowerx.quack; import android.os.Bundle; +import android.view.MenuItem; import androidx.activity.EdgeToEdge; +import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import androidx.fragment.app.Fragment; -public class SwitcherActivity extends AppCompatActivity { +import com.google.android.material.navigation.NavigationBarView; + +public class SwitcherActivity extends AppCompatActivity implements NavigationBarView.OnItemSelectedListener, NavigationBarView.OnItemReselectedListener { @Override protected void onCreate(Bundle savedInstanceState) { @@ -20,5 +25,29 @@ public class SwitcherActivity extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + ((NavigationBarView)findViewById(R.id.bottom_nav_bar)).setOnItemSelectedListener(this); + ((NavigationBarView)findViewById(R.id.bottom_nav_bar)).setOnItemReselectedListener(this); + + loadFragment(new FeedFragment()); + } + + @Override + public void onNavigationItemReselected(@NonNull MenuItem menuItem) { + + } + + @Override + public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { + return false; + } + + private void loadFragment(Fragment fragment) { + if (fragment != null) { + getSupportFragmentManager() + .beginTransaction() + .replace(R.id.main_fragment_holder, fragment) + .commit(); + } } } \ No newline at end of file diff --git a/app/src/main/java/com/dowerx/quack/model/Post.java b/app/src/main/java/com/dowerx/quack/model/Post.java new file mode 100644 index 0000000..c88b8df --- /dev/null +++ b/app/src/main/java/com/dowerx/quack/model/Post.java @@ -0,0 +1,81 @@ +package com.dowerx.quack.model; + +import java.sql.Array; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Post { + public static final List ITEMS; + + static { + ITEMS = Arrays.asList( + new Post(new User("username 1", "exmaple@example.com", "random_id"), "some content", null, 69, false, "random post id"), + new Post(new User("username 1", "exmaple@example.com", "random_id"), "some content", null, 69, false, "random post id") + ); + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public int getLikes() { + return likes; + } + + public void setLikes(int likes) { + this.likes = likes; + } + + public boolean isLiked() { + return liked; + } + + public void setLiked(boolean liked) { + this.liked = liked; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Post(User user, String content, String image, int likes, boolean liked, String id) { + this.user = user; + this.content = content; + this.image = image; + this.likes = likes; + this.liked = liked; + this.id = id; + } + + private User user; + private String content; + private String image; + private int likes; + private boolean liked; + private String id; +} diff --git a/app/src/main/java/com/dowerx/quack/model/User.java b/app/src/main/java/com/dowerx/quack/model/User.java new file mode 100644 index 0000000..4f4f476 --- /dev/null +++ b/app/src/main/java/com/dowerx/quack/model/User.java @@ -0,0 +1,37 @@ +package com.dowerx.quack.model; + +public class User { + public User(String username, String email, String id) { + this.username = username; + this.email = email; + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + private String username; + private String email; + private String id; +} diff --git a/app/src/main/res/drawable/feed.xml b/app/src/main/res/drawable/feed.xml new file mode 100644 index 0000000..f33c525 --- /dev/null +++ b/app/src/main/res/drawable/feed.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/post.xml b/app/src/main/res/drawable/post.xml new file mode 100644 index 0000000..480ee4c --- /dev/null +++ b/app/src/main/res/drawable/post.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/profile.xml b/app/src/main/res/drawable/profile.xml new file mode 100644 index 0000000..060ee46 --- /dev/null +++ b/app/src/main/res/drawable/profile.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/search.xml b/app/src/main/res/drawable/search.xml new file mode 100644 index 0000000..d29c6ea --- /dev/null +++ b/app/src/main/res/drawable/search.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/activity_switcher.xml b/app/src/main/res/layout/activity_switcher.xml index f3a6aca..ca69303 100644 --- a/app/src/main/res/layout/activity_switcher.xml +++ b/app/src/main/res/layout/activity_switcher.xml @@ -7,4 +7,25 @@ android:layout_height="match_parent" tools:context=".SwitcherActivity"> + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_feed_list.xml b/app/src/main/res/layout/fragment_feed_list.xml new file mode 100644 index 0000000..43ca9fb --- /dev/null +++ b/app/src/main/res/layout/fragment_feed_list.xml @@ -0,0 +1,13 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_post.xml b/app/src/main/res/layout/fragment_post.xml new file mode 100644 index 0000000..86057f2 --- /dev/null +++ b/app/src/main/res/layout/fragment_post.xml @@ -0,0 +1,27 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/switcher_menu.xml b/app/src/main/res/menu/switcher_menu.xml new file mode 100644 index 0000000..037cd44 --- /dev/null +++ b/app/src/main/res/menu/switcher_menu.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..ca514d8 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,4 @@ + + + 16dp + \ 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 de77f09..0322550 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,4 +7,9 @@ RegisterActivity Username Repeat Password + Feed + Post + Profile + Search + placeholder_name \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9040c81..fd915f4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,6 +11,8 @@ kotlin = "1.9.0" lifecycleRuntimeKtx = "2.7.0" activityCompose = "1.9.0" composeBom = "2023.08.00" +legacySupportV4 = "1.0.0" +recyclerview = "1.3.0" [libraries] junit = { group = "junit", name = "junit", version.ref = "junit" } @@ -30,6 +32,8 @@ ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } material3 = { group = "androidx.compose.material3", name = "material3" } +legacy-support-v4 = { group = "androidx.legacy", name = "legacy-support-v4", version.ref = "legacySupportV4" } +recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerview" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }