diff --git a/app/src/main/java/com/dowerx/quack/activity/SwitcherActivity.java b/app/src/main/java/com/dowerx/quack/activity/SwitcherActivity.java index adda24f..6cb0e29 100644 --- a/app/src/main/java/com/dowerx/quack/activity/SwitcherActivity.java +++ b/app/src/main/java/com/dowerx/quack/activity/SwitcherActivity.java @@ -15,10 +15,13 @@ import com.dowerx.quack.fragment.FeedFragment; import com.dowerx.quack.fragment.NewPostFragment; import com.dowerx.quack.fragment.ProfileFragment; import com.dowerx.quack.R; +import com.dowerx.quack.fragment.SearchFragment; import com.google.android.material.navigation.NavigationBarView; public class SwitcherActivity extends AppCompatActivity implements NavigationBarView.OnItemSelectedListener, NavigationBarView.OnItemReselectedListener { + private String userId = ""; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -38,6 +41,7 @@ public class SwitcherActivity extends AppCompatActivity implements NavigationBar @Override public void onNavigationItemReselected(@NonNull MenuItem menuItem) { + this.userId = ""; this.onNavigationItemSelected(menuItem); } @@ -45,10 +49,12 @@ public class SwitcherActivity extends AppCompatActivity implements NavigationBar public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { if (menuItem.getItemId() == R.id.nav_feed) { loadFragment(new FeedFragment()); + } else if (menuItem.getItemId() == R.id.nav_search) { + loadFragment(new SearchFragment()); } else if (menuItem.getItemId() == R.id.nav_post) { loadFragment(new NewPostFragment()); } else if (menuItem.getItemId() == R.id.nav_profile) { - loadFragment(new ProfileFragment()); + loadFragment(ProfileFragment.newInstance(userId)); } return true; } @@ -61,4 +67,8 @@ public class SwitcherActivity extends AppCompatActivity implements NavigationBar .commit(); } } + + public void setUser(String id) { + this.userId = id; + } } \ No newline at end of file diff --git a/app/src/main/java/com/dowerx/quack/fragment/ProfileFragment.java b/app/src/main/java/com/dowerx/quack/fragment/ProfileFragment.java index c17749c..f7285b9 100644 --- a/app/src/main/java/com/dowerx/quack/fragment/ProfileFragment.java +++ b/app/src/main/java/com/dowerx/quack/fragment/ProfileFragment.java @@ -40,7 +40,7 @@ public class ProfileFragment extends Fragment implements LoaderManager.LoaderCal @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (getArguments() != null) { + if (getArguments() != null && !getArguments().getString(ID).isEmpty()) { id = getArguments().getString(ID); } else { id = AuthService.getId(); diff --git a/app/src/main/java/com/dowerx/quack/fragment/SearchFragment.java b/app/src/main/java/com/dowerx/quack/fragment/SearchFragment.java new file mode 100644 index 0000000..030f0ab --- /dev/null +++ b/app/src/main/java/com/dowerx/quack/fragment/SearchFragment.java @@ -0,0 +1,85 @@ +package com.dowerx.quack.fragment; + +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.loader.app.LoaderManager; +import androidx.loader.content.Loader; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; + +import com.dowerx.quack.R; +import com.dowerx.quack.activity.SwitcherActivity; +import com.dowerx.quack.model.User; +import com.dowerx.quack.service.UserService; + +import java.util.List; + +public class SearchFragment extends Fragment implements LoaderManager.LoaderCallbacks> { + + private RecyclerView recyclerView; + private EditText query; + + public SearchFragment() { + } + + + public static SearchFragment newInstance() { + SearchFragment fragment = new SearchFragment(); + Bundle args = new Bundle(); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (getArguments() != null) { + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_search_list, container, false); + + Context context = view.getContext(); + recyclerView = view.findViewById(R.id.list); + recyclerView.setLayoutManager(new LinearLayoutManager(context)); + + query = view.findViewById(R.id.query); + LoaderManager.getInstance(this).initLoader(1, null, this); + view.findViewById(R.id.search).setOnClickListener(v -> { + LoaderManager.getInstance(this).destroyLoader(1); + LoaderManager.getInstance(this).initLoader(1, null, this); + }); + + return view; + } + + @NonNull + @Override + public Loader> onCreateLoader(int id, @Nullable Bundle args) { + return new UserService.SearchUsername(query.getText().toString(), getContext()); + } + + @Override + public void onLoadFinished(@NonNull Loader> loader, List data) { + recyclerView.setAdapter(new UserRecyclerViewAdapter(data, (SwitcherActivity) getContext())); + } + + @Override + public void onLoaderReset(@NonNull Loader> loader) { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dowerx/quack/fragment/UserRecyclerViewAdapter.java b/app/src/main/java/com/dowerx/quack/fragment/UserRecyclerViewAdapter.java new file mode 100644 index 0000000..12118aa --- /dev/null +++ b/app/src/main/java/com/dowerx/quack/fragment/UserRecyclerViewAdapter.java @@ -0,0 +1,66 @@ +package com.dowerx.quack.fragment; + +import androidx.recyclerview.widget.RecyclerView; + +import android.app.Activity; +import android.view.LayoutInflater; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import com.dowerx.quack.R; +import com.dowerx.quack.activity.SwitcherActivity; +import com.dowerx.quack.databinding.FragmentUserBinding; +import com.dowerx.quack.model.User; +import androidx.fragment.app.Fragment; + + +import java.util.List; + +public class UserRecyclerViewAdapter extends RecyclerView.Adapter { + + private final List mValues; + private final SwitcherActivity activity; + + public UserRecyclerViewAdapter(List items, SwitcherActivity activity) { + this.mValues = items; + this.activity = activity; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + return new ViewHolder(FragmentUserBinding.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.getUsername()); + holder.profile_button.setOnClickListener(v -> { + activity.setUser(holder.mItem.getId()); + activity.findViewById(R.id.nav_profile).performClick(); + }); + } + + @Override + public int getItemCount() { + return mValues.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + public final TextView username; + public final Button profile_button; + public User mItem; + + public ViewHolder(FragmentUserBinding binding) { + super(binding.getRoot()); + username = binding.username; + profile_button = binding.profileButton; + } + + @Override + public String toString() { + return super.toString() + " '" + username.getText() + "'"; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dowerx/quack/service/UserService.java b/app/src/main/java/com/dowerx/quack/service/UserService.java index 0560d04..40b8585 100644 --- a/app/src/main/java/com/dowerx/quack/service/UserService.java +++ b/app/src/main/java/com/dowerx/quack/service/UserService.java @@ -5,6 +5,7 @@ import android.content.Context; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.loader.content.AsyncTaskLoader; +import androidx.loader.content.Loader; import com.dowerx.quack.model.Post; import com.dowerx.quack.model.User; @@ -78,4 +79,43 @@ public class UserService { forceLoad(); } } + + public static class SearchUsername extends AsyncTaskLoader> { + private final String username; + + public SearchUsername(String username, Context context) { + super(context); + this.username = username; + } + + @Nullable + @Override + public List loadInBackground() { + List users = new LinkedList<>(); + try { + FirebaseFirestore db = FirebaseFirestore.getInstance(); + // firestore doesn't have full-string search + // ugly, but i have to filter it myself + QuerySnapshot result = Tasks.await(db.collection("user").get()); + + for (DocumentSnapshot doc : result) { + if (doc.getString("username").contains(username)) { + users.add(new User( + doc.getString("username"), + doc.getString("email"), + doc.getString("id") + )); + } + } + } catch (Exception e) { + } + + return users; + } + + @Override + protected void onStartLoading() { + forceLoad(); + } + } } diff --git a/app/src/main/res/layout/fragment_search_list.xml b/app/src/main/res/layout/fragment_search_list.xml new file mode 100644 index 0000000..3e21b27 --- /dev/null +++ b/app/src/main/res/layout/fragment_search_list.xml @@ -0,0 +1,42 @@ + + + + + +