From 6fb1ee43d3fadb48e69128694220b2047f934956 Mon Sep 17 00:00:00 2001 From: Balaji R Date: Wed, 10 Jul 2019 01:49:02 +0530 Subject: [PATCH 01/16] displays friended users, friend requests and lets adding new friends --- src/main/AndroidManifest.xml | 1 + .../java/org/amahi/anywhere/AmahiModule.java | 6 +- .../anywhere/activity/FriendsActivity.java | 92 ++++++++++++++ .../anywhere/activity/NavigationActivity.java | 18 +++ .../adapter/FriendRequestsListAdapter.java | 54 +++++++++ .../anywhere/adapter/FriendsListAdapter.java | 53 ++++++++ .../anywhere/adapter/FriendsPagerAdapter.java | 36 ++++++ .../bus/AddFriendUserCompletedEvent.java | 15 +++ .../bus/FriendRequestsLoadFailedEvent.java | 5 + .../bus/FriendRequestsLoadedEvent.java | 18 +++ .../bus/FriendUsersLoadFailedEvent.java | 4 + .../anywhere/bus/FriendUsersLoadedEvent.java | 17 +++ .../anywhere/bus/FriendsSelectedEvent.java | 4 + .../fragment/FriendRequestsFragment.java | 114 ++++++++++++++++++ .../anywhere/fragment/FriendsFragment.java | 86 +++++++++++++ .../anywhere/fragment/NavigationFragment.java | 19 +++ .../amahi/anywhere/server/api/ServerApi.java | 17 +++ .../anywhere/server/client/ServerClient.java | 16 +++ .../anywhere/server/model/FriendRequest.java | 65 ++++++++++ .../anywhere/server/model/FriendUser.java | 42 +++++++ .../server/model/NewFriendRequest.java | 27 +++++ .../anywhere/server/model/PrimaryUser.java | 29 +++++ .../response/AddFriendUserResponse.java | 29 +++++ .../response/FriendRequestsResponse.java | 35 ++++++ .../server/response/FriendUsersResponse.java | 40 ++++++ .../java/org/amahi/anywhere/util/Intents.java | 6 + src/main/res/layout/activity_friends.xml | 19 +++ .../res/layout/fragment_friend_requests.xml | 54 +++++++++ src/main/res/layout/fragment_friends.xml | 13 ++ src/main/res/layout/fragment_navigation.xml | 23 ++++ .../res/layout/friend_requests_list_item.xml | 14 +++ src/main/res/layout/friends_list_item.xml | 14 +++ 32 files changed, 984 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/amahi/anywhere/activity/FriendsActivity.java create mode 100644 src/main/java/org/amahi/anywhere/adapter/FriendRequestsListAdapter.java create mode 100644 src/main/java/org/amahi/anywhere/adapter/FriendsListAdapter.java create mode 100644 src/main/java/org/amahi/anywhere/adapter/FriendsPagerAdapter.java create mode 100644 src/main/java/org/amahi/anywhere/bus/AddFriendUserCompletedEvent.java create mode 100644 src/main/java/org/amahi/anywhere/bus/FriendRequestsLoadFailedEvent.java create mode 100644 src/main/java/org/amahi/anywhere/bus/FriendRequestsLoadedEvent.java create mode 100644 src/main/java/org/amahi/anywhere/bus/FriendUsersLoadFailedEvent.java create mode 100644 src/main/java/org/amahi/anywhere/bus/FriendUsersLoadedEvent.java create mode 100644 src/main/java/org/amahi/anywhere/bus/FriendsSelectedEvent.java create mode 100644 src/main/java/org/amahi/anywhere/fragment/FriendRequestsFragment.java create mode 100644 src/main/java/org/amahi/anywhere/fragment/FriendsFragment.java create mode 100644 src/main/java/org/amahi/anywhere/server/model/FriendRequest.java create mode 100644 src/main/java/org/amahi/anywhere/server/model/FriendUser.java create mode 100644 src/main/java/org/amahi/anywhere/server/model/NewFriendRequest.java create mode 100644 src/main/java/org/amahi/anywhere/server/model/PrimaryUser.java create mode 100644 src/main/java/org/amahi/anywhere/server/response/AddFriendUserResponse.java create mode 100644 src/main/java/org/amahi/anywhere/server/response/FriendRequestsResponse.java create mode 100644 src/main/java/org/amahi/anywhere/server/response/FriendUsersResponse.java create mode 100644 src/main/res/layout/activity_friends.xml create mode 100644 src/main/res/layout/fragment_friend_requests.xml create mode 100644 src/main/res/layout/fragment_friends.xml create mode 100644 src/main/res/layout/friend_requests_list_item.xml create mode 100644 src/main/res/layout/friends_list_item.xml diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 7c8fbd0e4..d110c050b 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -222,6 +222,7 @@ + diff --git a/src/main/java/org/amahi/anywhere/AmahiModule.java b/src/main/java/org/amahi/anywhere/AmahiModule.java index 7dbf6598a..feb4effb4 100644 --- a/src/main/java/org/amahi/anywhere/AmahiModule.java +++ b/src/main/java/org/amahi/anywhere/AmahiModule.java @@ -35,6 +35,8 @@ import org.amahi.anywhere.activity.ServerFilesActivity; import org.amahi.anywhere.cache.CacheModule; import org.amahi.anywhere.fragment.AudioListFragment; +import org.amahi.anywhere.fragment.FriendRequestsFragment; +import org.amahi.anywhere.fragment.FriendsFragment; import org.amahi.anywhere.fragment.NavigationFragment; import org.amahi.anywhere.fragment.ServerAppsFragment; import org.amahi.anywhere.fragment.ServerFileAudioFragment; @@ -107,7 +109,9 @@ TvPlaybackVideoActivity.class, TvPlaybackAudioActivity.class, TvPlaybackAudioFragment.class, - AudioMetadataRetrievingTask.class + AudioMetadataRetrievingTask.class, + FriendsFragment.class, + FriendRequestsFragment.class } ) class AmahiModule { diff --git a/src/main/java/org/amahi/anywhere/activity/FriendsActivity.java b/src/main/java/org/amahi/anywhere/activity/FriendsActivity.java new file mode 100644 index 000000000..aba165bbb --- /dev/null +++ b/src/main/java/org/amahi/anywhere/activity/FriendsActivity.java @@ -0,0 +1,92 @@ +package org.amahi.anywhere.activity; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; + +import android.os.Bundle; +import android.view.MenuItem; + +import com.google.android.material.tabs.TabLayout; + +import org.amahi.anywhere.R; +import org.amahi.anywhere.adapter.FriendsPagerAdapter; +import org.amahi.anywhere.fragment.FriendRequestsFragment; +import org.amahi.anywhere.fragment.FriendsFragment; + +import java.util.ArrayList; +import java.util.List; + +public class FriendsActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_friends); + + setUpHomeNavigation(); + + setUpPager(); + + getTabLayout().setupWithViewPager(getPager()); + + } + + private void setUpHomeNavigation() { + getSupportActionBar().setTitle("Friends"); + getSupportActionBar().setHomeButtonEnabled(true); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + + private void setUpPager() { + + List fragmentList = getFragments(); + + List fragmentTitles = getFragmentTitles(); + + FriendsPagerAdapter adapter = new FriendsPagerAdapter(getSupportFragmentManager(), fragmentList, fragmentTitles); + getPager().setAdapter(adapter); + } + + @Override + public boolean onOptionsItemSelected(MenuItem menuItem) { + switch (menuItem.getItemId()) { + case android.R.id.home: + onBackPressed(); + return true; + + default: + return super.onOptionsItemSelected(menuItem); + } + } + + private List getFragments() { + + Fragment friendsFragment = new FriendsFragment(); + Fragment friendRequestsFragment = new FriendRequestsFragment(); + List fragmentList = new ArrayList<>(); + fragmentList.add(friendsFragment); + fragmentList.add(friendRequestsFragment); + + return fragmentList; + } + + private List getFragmentTitles() { + + List fragmentTitles = new ArrayList<>(); + fragmentTitles.add("Friends"); + fragmentTitles.add("Friend Requests"); + + return fragmentTitles; + } + + private ViewPager getPager() { + return findViewById(R.id.pager_friends); + } + + private TabLayout getTabLayout() { + return findViewById(R.id.tablayout_friends); + } + + +} diff --git a/src/main/java/org/amahi/anywhere/activity/NavigationActivity.java b/src/main/java/org/amahi/anywhere/activity/NavigationActivity.java index 20b8d5c89..9a596af23 100644 --- a/src/main/java/org/amahi/anywhere/activity/NavigationActivity.java +++ b/src/main/java/org/amahi/anywhere/activity/NavigationActivity.java @@ -22,6 +22,7 @@ import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; + import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.drawerlayout.widget.DrawerLayout; @@ -30,6 +31,7 @@ import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.widget.Toolbar; import androidx.core.view.GravityCompat; + import android.view.MenuItem; import android.view.View; import android.view.ViewStub; @@ -43,6 +45,7 @@ import org.amahi.anywhere.bus.AppSelectedEvent; import org.amahi.anywhere.bus.AppsSelectedEvent; import org.amahi.anywhere.bus.BusProvider; +import org.amahi.anywhere.bus.FriendsSelectedEvent; import org.amahi.anywhere.bus.OfflineFilesSelectedEvent; import org.amahi.anywhere.bus.RecentFilesSelectedEvent; import org.amahi.anywhere.bus.SettingsSelectedEvent; @@ -345,6 +348,21 @@ private void showRecentFiles() { startActivity(intent); } + @Subscribe + public void onFriendsSelected(FriendsSelectedEvent event) { + + showFriends(); + + if (isNavigationDrawerAvailable()) { + hideNavigationDrawer(); + } + } + + private void showFriends() { + Intent intent = Intents.Builder.with(this).buildFriendsActivity(); + startActivity(intent); + } + @Subscribe public void onShareSelected(ShareSelectedEvent event) { setUpShare(event.getShare()); diff --git a/src/main/java/org/amahi/anywhere/adapter/FriendRequestsListAdapter.java b/src/main/java/org/amahi/anywhere/adapter/FriendRequestsListAdapter.java new file mode 100644 index 000000000..abbb74279 --- /dev/null +++ b/src/main/java/org/amahi/anywhere/adapter/FriendRequestsListAdapter.java @@ -0,0 +1,54 @@ +package org.amahi.anywhere.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import org.amahi.anywhere.R; + +import java.util.List; + +public class FriendRequestsListAdapter extends RecyclerView.Adapter { + private List friendRequestsEmailList; + private Context context; + + public FriendRequestsListAdapter(Context context, List friendRequestsEmailList) { + this.context = context; + this.friendRequestsEmailList = friendRequestsEmailList; + + } + + @NonNull + @Override + public FriendRequestsListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new FriendRequestsListViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.friend_requests_list_item, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull FriendRequestsListViewHolder holder, int position) { + holder.friendEmailText.setText(friendRequestsEmailList.get(position)); + + } + + @Override + public int getItemCount() { + return friendRequestsEmailList.size(); + } + + class FriendRequestsListViewHolder extends RecyclerView.ViewHolder { + TextView friendEmailText; + + FriendRequestsListViewHolder(View itemView) { + super(itemView); + friendEmailText = itemView.findViewById(R.id.text_friend_request_email); + + } + } +} + + diff --git a/src/main/java/org/amahi/anywhere/adapter/FriendsListAdapter.java b/src/main/java/org/amahi/anywhere/adapter/FriendsListAdapter.java new file mode 100644 index 000000000..fa9ee82cd --- /dev/null +++ b/src/main/java/org/amahi/anywhere/adapter/FriendsListAdapter.java @@ -0,0 +1,53 @@ +package org.amahi.anywhere.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import org.amahi.anywhere.R; + +import java.util.List; + +public class FriendsListAdapter extends RecyclerView.Adapter { + private List friendsEmailList; + private Context context; + + public FriendsListAdapter(Context context, List friendsEmailList) { + this.context = context; + this.friendsEmailList = friendsEmailList; + + } + + @NonNull + @Override + public FriendsListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new FriendsListViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.friends_list_item, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull FriendsListViewHolder holder, int position) { + holder.friendEmailText.setText(friendsEmailList.get(position)); + + } + + @Override + public int getItemCount() { + return friendsEmailList.size(); + } + + class FriendsListViewHolder extends RecyclerView.ViewHolder { + TextView friendEmailText; + FriendsListViewHolder(View itemView) { + super(itemView); + friendEmailText = itemView.findViewById(R.id.text_friend_email); + + } + } +} + + diff --git a/src/main/java/org/amahi/anywhere/adapter/FriendsPagerAdapter.java b/src/main/java/org/amahi/anywhere/adapter/FriendsPagerAdapter.java new file mode 100644 index 000000000..fea1093e6 --- /dev/null +++ b/src/main/java/org/amahi/anywhere/adapter/FriendsPagerAdapter.java @@ -0,0 +1,36 @@ +package org.amahi.anywhere.adapter; + +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; + +import java.util.List; + +public class FriendsPagerAdapter extends FragmentStatePagerAdapter { + private List fragmentList; + private List fragmentTitles; + + public FriendsPagerAdapter(FragmentManager fm, List fragmentList, + List fragmentTitles) { + super(fm); + this.fragmentList = fragmentList; + this.fragmentTitles = fragmentTitles; + } + + @Nullable + @Override + public CharSequence getPageTitle(int position) { + return fragmentTitles.get(position); + } + + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/src/main/java/org/amahi/anywhere/bus/AddFriendUserCompletedEvent.java b/src/main/java/org/amahi/anywhere/bus/AddFriendUserCompletedEvent.java new file mode 100644 index 000000000..c4577e3eb --- /dev/null +++ b/src/main/java/org/amahi/anywhere/bus/AddFriendUserCompletedEvent.java @@ -0,0 +1,15 @@ +package org.amahi.anywhere.bus; + +public class AddFriendUserCompletedEvent { + public boolean isSuccessful; + + public boolean isSuccessful() { + return isSuccessful; + } + + public AddFriendUserCompletedEvent(boolean isSuccessful) { + this.isSuccessful = isSuccessful; + } + + +} diff --git a/src/main/java/org/amahi/anywhere/bus/FriendRequestsLoadFailedEvent.java b/src/main/java/org/amahi/anywhere/bus/FriendRequestsLoadFailedEvent.java new file mode 100644 index 000000000..4a213935a --- /dev/null +++ b/src/main/java/org/amahi/anywhere/bus/FriendRequestsLoadFailedEvent.java @@ -0,0 +1,5 @@ +package org.amahi.anywhere.bus; + + +public class FriendRequestsLoadFailedEvent implements BusEvent { +} diff --git a/src/main/java/org/amahi/anywhere/bus/FriendRequestsLoadedEvent.java b/src/main/java/org/amahi/anywhere/bus/FriendRequestsLoadedEvent.java new file mode 100644 index 000000000..a81cf6736 --- /dev/null +++ b/src/main/java/org/amahi/anywhere/bus/FriendRequestsLoadedEvent.java @@ -0,0 +1,18 @@ +package org.amahi.anywhere.bus; + + +import org.amahi.anywhere.server.model.FriendRequest; + +import java.util.List; + +public class FriendRequestsLoadedEvent implements BusEvent { + private final List friendRequests; + + public FriendRequestsLoadedEvent(List friendRequests) { + this.friendRequests = friendRequests; + } + + public List getFriendRequests() { + return friendRequests; + } +} diff --git a/src/main/java/org/amahi/anywhere/bus/FriendUsersLoadFailedEvent.java b/src/main/java/org/amahi/anywhere/bus/FriendUsersLoadFailedEvent.java new file mode 100644 index 000000000..003e6bf57 --- /dev/null +++ b/src/main/java/org/amahi/anywhere/bus/FriendUsersLoadFailedEvent.java @@ -0,0 +1,4 @@ +package org.amahi.anywhere.bus; + +public class FriendUsersLoadFailedEvent implements BusEvent { +} diff --git a/src/main/java/org/amahi/anywhere/bus/FriendUsersLoadedEvent.java b/src/main/java/org/amahi/anywhere/bus/FriendUsersLoadedEvent.java new file mode 100644 index 000000000..e21ce0c78 --- /dev/null +++ b/src/main/java/org/amahi/anywhere/bus/FriendUsersLoadedEvent.java @@ -0,0 +1,17 @@ +package org.amahi.anywhere.bus; + +import org.amahi.anywhere.server.model.PrimaryUser; + +import java.util.List; + +public class FriendUsersLoadedEvent implements BusEvent { + private final List primaryUsers; + + public FriendUsersLoadedEvent(List primaryUsers) { + this.primaryUsers = primaryUsers; + } + + public List getPrimaryUsers() { + return primaryUsers; + } +} diff --git a/src/main/java/org/amahi/anywhere/bus/FriendsSelectedEvent.java b/src/main/java/org/amahi/anywhere/bus/FriendsSelectedEvent.java new file mode 100644 index 000000000..d66e9ab09 --- /dev/null +++ b/src/main/java/org/amahi/anywhere/bus/FriendsSelectedEvent.java @@ -0,0 +1,4 @@ +package org.amahi.anywhere.bus; + +public class FriendsSelectedEvent implements BusEvent { +} diff --git a/src/main/java/org/amahi/anywhere/fragment/FriendRequestsFragment.java b/src/main/java/org/amahi/anywhere/fragment/FriendRequestsFragment.java new file mode 100644 index 000000000..6c5bdc301 --- /dev/null +++ b/src/main/java/org/amahi/anywhere/fragment/FriendRequestsFragment.java @@ -0,0 +1,114 @@ +package org.amahi.anywhere.fragment; + +import android.os.Bundle; + +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +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.Button; +import android.widget.Toast; + +import com.google.android.material.textfield.TextInputEditText; +import com.squareup.otto.Subscribe; + +import org.amahi.anywhere.AmahiApplication; +import org.amahi.anywhere.R; +import org.amahi.anywhere.adapter.FriendRequestsListAdapter; +import org.amahi.anywhere.bus.AddFriendUserCompletedEvent; +import org.amahi.anywhere.bus.FriendRequestsLoadedEvent; +import org.amahi.anywhere.server.client.ServerClient; +import org.amahi.anywhere.server.model.FriendRequest; +import org.amahi.anywhere.server.model.NewFriendRequest; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +/** + * Friend Requests Fragment, shows list of friend requests. + */ +public class FriendRequestsFragment extends Fragment { + + @Inject + ServerClient serverClient; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_friend_requests, container, false); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + setUpInjections(); + + getRecyclerView().setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false)); + + setUpFriendRequestsList(); + + Button btnAddFR = getView().findViewById(R.id.btn_add_fr); + + btnAddFR.setOnClickListener(v -> addFriendRequest()); + } + + private void setUpInjections() { + AmahiApplication.from(getActivity()).inject(this); + } + + private RecyclerView getRecyclerView() { + return getView().findViewById(R.id.list_friend_requests); + } + + private void setUpFriendRequestsList() { + if (serverClient.isConnected()) { + serverClient.getFriendRequests(); + } + } + + @Subscribe + private void onFriendRequestsLoaded(FriendRequestsLoadedEvent event) { + showFriendRequests(event.getFriendRequests()); + } + + private void showFriendRequests(List friendRequests) { + List friendRequestsEmailList = new ArrayList<>(); + + for (FriendRequest friendRequest : friendRequests) { + friendRequestsEmailList.add(friendRequest.getFriendUser().getEmail()); + } + + FriendRequestsListAdapter adapter = new FriendRequestsListAdapter(getContext(), friendRequestsEmailList); + getRecyclerView().setAdapter(adapter); + } + + private void addFriendRequest() { + TextInputEditText etEmailFR = getView().findViewById(R.id.text_email); + + if (etEmailFR != null && etEmailFR.getText() != null) { + NewFriendRequest newFriendRequest = new NewFriendRequest(); + newFriendRequest.setEmail(etEmailFR.getText().toString()); + serverClient.addFriendUser(newFriendRequest); + } + + } + + @Subscribe + private void onAddFriendUser(AddFriendUserCompletedEvent event) { + if (event.isSuccessful()) { + Toast.makeText(getContext(), "friend request success", Toast.LENGTH_LONG).show(); + setUpFriendRequestsList(); + } else { + Toast.makeText(getContext(), "friend request failed", Toast.LENGTH_LONG).show(); + } + + } + +} diff --git a/src/main/java/org/amahi/anywhere/fragment/FriendsFragment.java b/src/main/java/org/amahi/anywhere/fragment/FriendsFragment.java new file mode 100644 index 000000000..b1eaee4f7 --- /dev/null +++ b/src/main/java/org/amahi/anywhere/fragment/FriendsFragment.java @@ -0,0 +1,86 @@ +package org.amahi.anywhere.fragment; + +import android.os.Bundle; + +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.squareup.otto.Subscribe; + +import org.amahi.anywhere.AmahiApplication; +import org.amahi.anywhere.R; +import org.amahi.anywhere.adapter.FriendsListAdapter; +import org.amahi.anywhere.bus.FriendUsersLoadedEvent; +import org.amahi.anywhere.server.client.ServerClient; +import org.amahi.anywhere.server.model.PrimaryUser; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +/** + * Friends Fragment, shows list of friended users. + */ +public class FriendsFragment extends Fragment { + + @Inject + ServerClient serverClient; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + + return inflater.inflate(R.layout.fragment_friends, container, false); + + } + + private void setUpInjections() { + AmahiApplication.from(getActivity()).inject(this); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + setUpInjections(); + + getRecyclerView().setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false)); + + setUpFriendsList(); + } + + private RecyclerView getRecyclerView() { + return (RecyclerView) getView().findViewById(R.id.list_friends); + } + + private void setUpFriendsList() { + serverClient.getFriendUsers(); + + } + + @Subscribe + private void onFriendUsersLoaded(FriendUsersLoadedEvent event) { + showFriendUsers(event.getPrimaryUsers()); + } + + private void showFriendUsers(List primaryUsers) { + List friendsEmailList = new ArrayList<>(); + + for (PrimaryUser primaryUser : primaryUsers) { + friendsEmailList.add(primaryUser.getFriendUser().getEmail()); + } + + FriendsListAdapter adapter = new FriendsListAdapter(getContext(), friendsEmailList); + getRecyclerView().setAdapter(adapter); + + } + + +} diff --git a/src/main/java/org/amahi/anywhere/fragment/NavigationFragment.java b/src/main/java/org/amahi/anywhere/fragment/NavigationFragment.java index d3d2fe9b9..dc6ef38f4 100644 --- a/src/main/java/org/amahi/anywhere/fragment/NavigationFragment.java +++ b/src/main/java/org/amahi/anywhere/fragment/NavigationFragment.java @@ -31,6 +31,7 @@ import android.os.Bundle; import android.os.Parcelable; import android.preference.PreferenceManager; + import androidx.fragment.app.Fragment; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.recyclerview.widget.LinearLayoutManager; @@ -54,6 +55,7 @@ import org.amahi.anywhere.adapter.NavigationDrawerAdapter; import org.amahi.anywhere.bus.AppsSelectedEvent; import org.amahi.anywhere.bus.BusProvider; +import org.amahi.anywhere.bus.FriendsSelectedEvent; import org.amahi.anywhere.bus.OfflineFilesSelectedEvent; import org.amahi.anywhere.bus.RecentFilesSelectedEvent; import org.amahi.anywhere.bus.ServerConnectedEvent; @@ -355,6 +357,7 @@ private void setUpNavigationList() { showServers(); hideOfflineLayout(); hideRecentLayout(); + hideFriendsLayout(); } } @@ -367,6 +370,10 @@ private void hideRecentLayout() { getRecentFilesLayout().setVisibility(View.GONE); } + private void hideFriendsLayout() { + getFriendsLayout().setVisibility(View.GONE); + } + private void setUpNavigationAdapter() { //Setting the layout of a vertical list dynamically. @@ -394,6 +401,10 @@ private LinearLayout getRecentFilesLayout() { return getView().findViewById(R.id.recent_files_layout); } + private LinearLayout getFriendsLayout() { + return getView().findViewById(R.id.friends_layout); + } + private LinearLayout getLinearLayoutSelectedServer() { return getView().findViewById(R.id.server_select_LinearLayout); } @@ -418,6 +429,8 @@ private void setUpNavigationListener() { getOfflineFilesLayout().setOnClickListener(view -> showOfflineFiles()); getRecentFilesLayout().setOnClickListener(view -> showRecentFiles()); + + getFriendsLayout().setOnClickListener(view -> showFriends()); } private void selectedServerListener(int position) { @@ -492,6 +505,7 @@ private void setUpServerSelectListener() { showServers(); hideOfflineLayout(); hideRecentLayout(); + hideFriendsLayout(); } }); } @@ -505,6 +519,7 @@ private void showNavigationItems() { getOfflineFilesLayout().setVisibility(View.VISIBLE); getRecentFilesLayout().setVisibility(View.VISIBLE); + getFriendsLayout().setVisibility(View.VISIBLE); } @Subscribe @@ -613,6 +628,10 @@ private void showRecentFiles() { BusProvider.getBus().post(new RecentFilesSelectedEvent()); } + private void showFriends() { + BusProvider.getBus().post(new FriendsSelectedEvent()); + } + @Subscribe public void onServerConnectionChanged(ServerConnectionChangedEvent event) { areServersVisible = false; diff --git a/src/main/java/org/amahi/anywhere/server/api/ServerApi.java b/src/main/java/org/amahi/anywhere/server/api/ServerApi.java index 937c789f8..50b14133b 100644 --- a/src/main/java/org/amahi/anywhere/server/api/ServerApi.java +++ b/src/main/java/org/amahi/anywhere/server/api/ServerApi.java @@ -19,6 +19,9 @@ package org.amahi.anywhere.server.api; +import org.amahi.anywhere.server.model.FriendRequest; +import org.amahi.anywhere.server.model.NewFriendRequest; +import org.amahi.anywhere.server.model.PrimaryUser; import org.amahi.anywhere.server.model.ServerApp; import org.amahi.anywhere.server.model.ServerFile; import org.amahi.anywhere.server.model.ServerFileMetadata; @@ -29,6 +32,7 @@ import okhttp3.MultipartBody; import okhttp3.ResponseBody; import retrofit2.Call; +import retrofit2.http.Body; import retrofit2.http.DELETE; import retrofit2.http.GET; import retrofit2.http.Header; @@ -74,4 +78,17 @@ Call getFileMetadata( @GET("/apps") Call> getApps( @Header("Session") String session); + + @GET("/frnd/users") + Call> getFriendUsers( + @Header("Session") String session); + + @POST("/frnd/request") + Call addFriendUser( + @Header("Session") String session, + @Body NewFriendRequest friendRequest); + + @GET("/frnd/requests") + Call> getFriendRequests( + @Header("Session") String session); } diff --git a/src/main/java/org/amahi/anywhere/server/client/ServerClient.java b/src/main/java/org/amahi/anywhere/server/client/ServerClient.java index b5dd13282..bd11c0108 100644 --- a/src/main/java/org/amahi/anywhere/server/client/ServerClient.java +++ b/src/main/java/org/amahi/anywhere/server/client/ServerClient.java @@ -38,11 +38,15 @@ import org.amahi.anywhere.server.ApiConnection; import org.amahi.anywhere.server.api.ProxyApi; import org.amahi.anywhere.server.api.ServerApi; +import org.amahi.anywhere.server.model.NewFriendRequest; import org.amahi.anywhere.server.model.Server; import org.amahi.anywhere.server.model.ServerFile; import org.amahi.anywhere.server.model.ServerFileMetadata; import org.amahi.anywhere.server.model.ServerRoute; import org.amahi.anywhere.server.model.ServerShare; +import org.amahi.anywhere.server.response.AddFriendUserResponse; +import org.amahi.anywhere.server.response.FriendRequestsResponse; +import org.amahi.anywhere.server.response.FriendUsersResponse; import org.amahi.anywhere.server.response.ServerAppsResponse; import org.amahi.anywhere.server.response.ServerFileDeleteResponse; import org.amahi.anywhere.server.response.ServerFileUploadResponse; @@ -327,4 +331,16 @@ public void getFileMetadata(ServerShare share, ServerFile file, Callback { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + BusProvider.getBus().post(new AddFriendUserCompletedEvent(true)); + } else + this.onFailure(call, new HttpException(response)); + + } + + @Override + public void onFailure(Call call, Throwable t) { + BusProvider.getBus().post(new AddFriendUserCompletedEvent(false)); + + } +} diff --git a/src/main/java/org/amahi/anywhere/server/response/FriendRequestsResponse.java b/src/main/java/org/amahi/anywhere/server/response/FriendRequestsResponse.java new file mode 100644 index 000000000..74b993dec --- /dev/null +++ b/src/main/java/org/amahi/anywhere/server/response/FriendRequestsResponse.java @@ -0,0 +1,35 @@ +package org.amahi.anywhere.server.response; + +import org.amahi.anywhere.bus.BusProvider; +import org.amahi.anywhere.bus.FriendRequestsLoadFailedEvent; +import org.amahi.anywhere.bus.FriendRequestsLoadedEvent; +import org.amahi.anywhere.server.model.FriendRequest; + +import java.util.Collections; +import java.util.List; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.HttpException; +import retrofit2.Response; + +public class FriendRequestsResponse implements Callback> { + @Override + public void onResponse(Call> call, Response> response) { + if (response.isSuccessful()) { + List friendRequests = response.body(); + if (friendRequests == null) { + friendRequests = Collections.emptyList(); + } + BusProvider.getBus().post(new FriendRequestsLoadedEvent(friendRequests)); + } else + this.onFailure(call, new HttpException(response)); + + } + + @Override + public void onFailure(Call> call, Throwable t) { + BusProvider.getBus().post(new FriendRequestsLoadFailedEvent()); + + } +} diff --git a/src/main/java/org/amahi/anywhere/server/response/FriendUsersResponse.java b/src/main/java/org/amahi/anywhere/server/response/FriendUsersResponse.java new file mode 100644 index 000000000..c2d39c915 --- /dev/null +++ b/src/main/java/org/amahi/anywhere/server/response/FriendUsersResponse.java @@ -0,0 +1,40 @@ +package org.amahi.anywhere.server.response; + +import com.squareup.otto.Bus; + +import org.amahi.anywhere.bus.BusProvider; +import org.amahi.anywhere.bus.FriendUsersLoadFailedEvent; +import org.amahi.anywhere.bus.FriendUsersLoadedEvent; +import org.amahi.anywhere.bus.ServerFilesLoadedEvent; +import org.amahi.anywhere.server.model.FriendUser; +import org.amahi.anywhere.server.model.PrimaryUser; + +import java.util.Collections; +import java.util.List; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.HttpException; +import retrofit2.Response; + + +public class FriendUsersResponse implements Callback> { + @Override + public void onResponse(Call> call, Response> response) { + if (response.isSuccessful()) { + List primaryUsers = response.body(); + if (primaryUsers == null) { + primaryUsers = Collections.emptyList(); + } + BusProvider.getBus().post(new FriendUsersLoadedEvent(primaryUsers)); + } else + this.onFailure(call, new HttpException(response)); + + } + + @Override + public void onFailure(Call> call, Throwable t) { + BusProvider.getBus().post(new FriendUsersLoadFailedEvent()); + + } +} diff --git a/src/main/java/org/amahi/anywhere/util/Intents.java b/src/main/java/org/amahi/anywhere/util/Intents.java index 92b45abaa..b2abb6e18 100644 --- a/src/main/java/org/amahi/anywhere/util/Intents.java +++ b/src/main/java/org/amahi/anywhere/util/Intents.java @@ -27,9 +27,11 @@ import android.net.Uri; import android.os.Parcelable; import android.provider.MediaStore; + import androidx.annotation.NonNull; import org.amahi.anywhere.R; +import org.amahi.anywhere.activity.FriendsActivity; import org.amahi.anywhere.activity.IntroductionActivity; import org.amahi.anywhere.activity.OfflineFilesActivity; import org.amahi.anywhere.activity.RecentFilesActivity; @@ -117,6 +119,10 @@ public Intent buildRecentFilesActivity() { return new Intent(context, RecentFilesActivity.class); } + public Intent buildFriendsActivity() { + return new Intent(context, FriendsActivity.class); + } + public Intent buildServerTvFilesActivity(ServerShare share, ServerFile file) { Intent intent = new Intent(context, ServerFileTvActivity.class); intent.putExtra(Extras.SERVER_FILE, file); diff --git a/src/main/res/layout/activity_friends.xml b/src/main/res/layout/activity_friends.xml new file mode 100644 index 000000000..7833a70eb --- /dev/null +++ b/src/main/res/layout/activity_friends.xml @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/src/main/res/layout/fragment_friend_requests.xml b/src/main/res/layout/fragment_friend_requests.xml new file mode 100644 index 000000000..be6077f4b --- /dev/null +++ b/src/main/res/layout/fragment_friend_requests.xml @@ -0,0 +1,54 @@ + + + + + + + + +