Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding Upcoming Events Feature - FIX #199

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package me.grishka.houseclub.api.methods;

import java.util.List;

import me.grishka.houseclub.api.ClubhouseAPIRequest;
import me.grishka.houseclub.api.model.Event;

public class GetEvents extends ClubhouseAPIRequest<GetEvents.Response> {
public GetEvents(){
super("GET", "get_events", Response.class);
}

public static class Response{
public List<Event> events;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package me.grishka.houseclub.api.methods;

import java.util.List;

import me.grishka.houseclub.api.ClubhouseAPIRequest;
import me.grishka.houseclub.api.model.FullUser;

public class SearchPeople extends ClubhouseAPIRequest<SearchPeople.Resp> {
public SearchPeople(String query) {
super("POST", "search_users", Resp.class);
requestBody = new Body(query);
}

private static class Body {
public String query;

public Body(String query) {
this.query = query;
}
}

public static class Resp {
public List<FullUser> users;
public int count;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,4 @@ public class Event{
public int eventId;
public boolean isMemberOnly;
public List<FullUser> hosts;
public boolean clubIsMember, clubIsFollower;
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package me.grishka.houseclub.api.model;

import java.util.Date;
import java.util.List;

public class FullUser extends User{
public String dsplayname, bio, twitter, instagram;
public int numFollowers, numFollowing;
public boolean followsMe, isBlockedByNetwork;
public Date timeCreated;
public User invitedByUserProfile;
public List<FullUser> mutualFollows;

// null = not following
// 2 = following
// other values = ?
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,226 @@
package me.grishka.houseclub.fragments;

import android.app.Activity;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Outline;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.stream.Collectors;

import me.grishka.appkit.api.SimpleCallback;
import me.grishka.appkit.fragments.BaseRecyclerFragment;
import me.grishka.appkit.imageloader.ImageLoaderRecyclerAdapter;
import me.grishka.appkit.imageloader.ImageLoaderViewHolder;
import me.grishka.appkit.utils.BindableViewHolder;
import me.grishka.appkit.utils.V;
import me.grishka.houseclub.R;
import me.grishka.houseclub.api.methods.GetEvents;
import me.grishka.houseclub.api.model.Event;

public class EventsFragment extends BaseRecyclerFragment<Event>{

private EventsAdapter adapter;
private ViewOutlineProvider roundedCornersOutline =new ViewOutlineProvider(){
@Override
public void getOutline(View view, Outline outline){
outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), V.dp(8));
}
};

public EventsFragment(){
super(20);
}

@Override
public void onAttach(Activity activity){
super.onAttach(activity);
setTitle(R.string.event_title);
loadData();
setHasOptionsMenu(true);
}

@Override
protected void doLoadData(int offset, int count){
currentRequest=new GetEvents()
.setCallback(new SimpleCallback<GetEvents.Response>(this){
@Override
public void onSuccess(GetEvents.Response result){
currentRequest=null;
onDataLoaded(result.events, false);
}
}).exec();
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
list.addItemDecoration(new RecyclerView.ItemDecoration(){
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state){
outRect.bottom=outRect.top=V.dp(8);
outRect.left=outRect.right=V.dp(16);
}
});
getToolbar().setElevation(0);
}

@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
getToolbar().setElevation(0);
}

@Override
protected RecyclerView.Adapter getAdapter(){
if(adapter==null){
adapter=new EventsAdapter();
adapter.setHasStableIds(true);
}
return adapter;
}

@Override
public boolean wantsLightNavigationBar(){
return true;
}

@Override
public boolean wantsLightStatusBar(){
return true;
}

private class EventsAdapter extends RecyclerView.Adapter<EventViewHolder> implements ImageLoaderRecyclerAdapter{

@NonNull
@Override
public EventViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
return new EventViewHolder();
}

@Override
public void onBindViewHolder(@NonNull EventViewHolder holder, int position){
holder.bind(data.get(position));
}

@Override
public int getItemCount(){
return data.size();
}

@Override
public long getItemId(int position){
return data.get(position).eventId;
}

@Override
public int getImageCountForItem(int position){
Event eve= data.get(position);
int count=0;
for(int i=0;i<Math.min(2, eve.hosts.size());i++){
if(eve.hosts.get(i).photoUrl!=null)
count++;
}
return count;
}

@Override
public String getImageURL(int position, int image){
Event eve=data.get(position);
for(int i=0;i<Math.min(2, eve.hosts.size());i++){
if(eve.hosts.get(i).photoUrl!=null){
if(image==0)
return eve.hosts.get(i).photoUrl;
else
image--;
}
}
return null;
}
}

private class EventViewHolder extends BindableViewHolder<Event> implements View.OnClickListener, ImageLoaderViewHolder{

private TextView start_at , topic, hosts,description;
private ImageView pic1, pic2;
private Drawable placeholder=new ColorDrawable(getResources().getColor(R.color.grey));


public EventViewHolder() {
super(getActivity(), R.layout.event_row);
start_at=findViewById(R.id.event_start_time);
topic=findViewById(R.id.topic);
description=findViewById(R.id.description);
hosts=findViewById(R.id.hosts);
pic1=findViewById(R.id.pic1);
pic2=findViewById(R.id.pic2);

itemView.setOutlineProvider(roundedCornersOutline);
itemView.setClipToOutline(true);
itemView.setElevation(V.dp(2));
itemView.setOnClickListener(this);

}



@Override
public void onBind(Event item){

DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy hh:mm");
String strDate = dateFormat.format(item.timeStart);
start_at.setText(strDate);

topic.setText(item.name);

description.setText(item.description);

hosts.setText(

item.hosts.stream()
.map(hosts-> hosts.name)
.collect(Collectors.joining("\n"))
);

imgLoader.bindViewHolder(adapter, this, getAdapterPosition());
}

@Override
public void onClick(View view) {

}

private ImageView imgForIndex(int index){
if(index==0)
return pic1;
return pic2;
}

@Override
public void setImage(int index, Bitmap bitmap) {
if(index==0 && item.hosts.get(0).photoUrl==null)
index=1;
imgForIndex(index).setImageBitmap(bitmap);
}

@Override
public void clearImage(int index){
imgForIndex(index).setImageDrawable(placeholder);
}


}
}
Original file line number Diff line number Diff line change
Expand Up @@ -113,20 +113,41 @@ public boolean wantsLightStatusBar(){

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
menu.add(0,0,0,"").setIcon(R.drawable.ic_notifications).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
menu.add(0,1,0,"").setIcon(R.drawable.ic_baseline_person_24).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
// menu.add(0,0,0,"").setIcon(R.drawable.ic_notifications).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
// menu.add(0,1,0,"").setIcon(R.drawable.ic_baseline_person_24).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

inflater.inflate(R.menu.menu_home, menu);


}

@Override
public boolean onOptionsItemSelected(MenuItem item){
Bundle args=new Bundle();
args.putInt("id", Integer.parseInt(ClubhouseSession.userID));
if(item.getItemId()==0) {
Nav.go(getActivity(), NotificationListFragment.class, args);
} else if(item.getItemId()==1){
if (item.getItemId() == R.id.homeMenuProfile) {
Bundle args=new Bundle();
args.putInt("id", Integer.parseInt(ClubhouseSession.userID));
Nav.go(getActivity(), ProfileFragment.class, args);
return true;
}
return true;
else if (item.getItemId() == R.id.homeMenuSearchPeople) {
Bundle args = new Bundle();
Nav.go(getActivity(), SearchListFragment.class, args);
return true;
}
else if (item.getItemId() == R.id.homeMenuNotifications) {
Bundle args = new Bundle();
args.putInt("id", Integer.parseInt(ClubhouseSession.userID));
Nav.go(getActivity(), NotificationListFragment.class, args);
return true;
}
else if (item.getItemId() == R.id.homeMenuEvents) {
Bundle args = new Bundle();
args.putInt("id", Integer.parseInt(ClubhouseSession.userID));
Nav.go(getActivity(), EventsFragment.class, args);
return true;
}
return super.onOptionsItemSelected(item);

}

private class ChannelAdapter extends RecyclerView.Adapter<ChannelViewHolder> implements ImageLoaderRecyclerAdapter{
Expand Down Expand Up @@ -204,7 +225,7 @@ public void onBind(Channel item){
topic.setText(item.topic);
numMembers.setText(""+item.numAll);
numSpeakers.setText(""+item.numSpeakers);
speakers.setText(item.users.stream().map(user->user.isSpeaker ? (user.name+" 💬") : user.name).collect(Collectors.joining("\n")));
speakers.setText(item.users.stream().map(user->user.isSpeaker ? (user.name+" 💬") : user.name).collect(Collectors.joining("\n")) );

imgLoader.bindViewHolder(adapter, this, getAdapterPosition());
}
Expand Down
Loading