Friends List is displayed

This commit is contained in:
Pierre 2017-11-15 18:29:58 +01:00
parent 81c2e390c2
commit 3a54768224
8 changed files with 351 additions and 13 deletions

View File

@ -0,0 +1,69 @@
package org.communiquons.android.comunic.client.data.friendsList;
import org.communiquons.android.comunic.client.data.UsersInfo.UserInfo;
/**
* This class contains information about a friend but also about user himself
*
* @author Pierre Hubert
* Created by pierre on 11/15/17.
*/
public class FriendUser {
/**
* Friendship informations
*/
private Friend friend;
/**
* Informations about the user
*/
private UserInfo userInfo;
/**
* Create a FriendUser object
*
* @param friend Informations about the friend
*/
public FriendUser(Friend friend){
this.friend = friend;
}
/**
* Set a new user informations
*
* @param userInfo Informations about the user
*/
public void setUserInfo(UserInfo userInfo) {
this.userInfo = userInfo;
}
/**
* Get informations about the user
*
* @return User informations
*/
public UserInfo getUserInfo() {
return userInfo;
}
/**
* Get informations about the friendship
*
* @return Informations about the friendship
*/
public Friend getFriend() {
return friend;
}
/**
* Set friendship informations
*
* @param friend New friendship informations
*/
public void setFriend(Friend friend) {
this.friend = friend;
}
}

View File

@ -0,0 +1,64 @@
package org.communiquons.android.comunic.client.data.friendsList;
import android.app.Activity;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import org.communiquons.android.comunic.client.R;
import org.communiquons.android.comunic.client.data.ImageLoadTask;
import java.util.ArrayList;
/**
* Adapter that render the list of friend on the friends list fragment
*
* @author Pierre Hubert
* Created by pierre on 11/15/17.
*/
public class FriendsAdapter extends ArrayAdapter<FriendUser> {
/**
* Class constructor
*
* @param context The context of execution of the application
* @param friendsList The list of friends to display (with user information)
*/
public FriendsAdapter(Activity context, ArrayList<FriendUser> friendsList){
super(context, 0, friendsList);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View listItemView = convertView;
//Check if the view has to be created
if(listItemView == null){
listItemView = LayoutInflater.from(getContext())
.inflate(R.layout.fragment_friends_list_friend_item, parent, false);
}
//Get friend information
FriendUser friendUser = getItem(position);
//Update user account image
ImageView user_image = listItemView.findViewById(R.id.fragment_friendslist_item_accountimage);
new ImageLoadTask(getContext(), friendUser.getUserInfo().getAcountImageURL(), user_image)
.execute();
//Update user name
TextView user_name = listItemView.findViewById(R.id.fragment_friendslist_item_fullname);
user_name.setText(friendUser.getUserInfo().getFullName());
return listItemView;
}
}

View File

@ -0,0 +1,61 @@
package org.communiquons.android.comunic.client.data.friendsList;
import android.util.ArrayMap;
import org.communiquons.android.comunic.client.data.UsersInfo.UserInfo;
import java.util.ArrayList;
/**
* Friends utilities
*
* @author Pierre Hubert
* Created by pierre on 11/15/17.
*/
public class FriendsUtils {
/**
* Given a friend list, it will return the IDs of the friends
*
* @param friendsList the friends list to process
* @return The list of the id of the friend
*/
public static ArrayList<Integer> getFriendsIDs(ArrayList<Friend> friendsList){
ArrayList<Integer> IDs = new ArrayList<>();
for(Friend friend : friendsList)
IDs.add(friend.getId());
return IDs;
}
/**
* Merge a friends user list with a user info list, return the result by a FriendUser list
*
* @param friendsList The list of friend of the user
* @param userInfos Informations about the user
* @return The result of the operation
*/
public static ArrayList<FriendUser> merge_friends_user_infos_list(ArrayList<Friend> friendsList,
ArrayMap<Integer, UserInfo> userInfos){
ArrayList<FriendUser> list = new ArrayList<>();
//Process the list
for(Friend friend : friendsList){
UserInfo userInfo;
if((userInfo = userInfos.get(friend.getId())) != null){
FriendUser item = new FriendUser(friend);
item.setUserInfo(userInfo);
list.add(item);
}
}
return list;
}
}

View File

@ -1,13 +1,14 @@
package org.communiquons.android.comunic.client.fragments; package org.communiquons.android.comunic.client.fragments;
import android.app.Fragment; import android.app.Fragment;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.Toast; import android.widget.Toast;
import org.communiquons.android.comunic.client.R; import org.communiquons.android.comunic.client.R;
@ -15,6 +16,9 @@ import org.communiquons.android.comunic.client.data.DatabaseHelper;
import org.communiquons.android.comunic.client.data.UsersInfo.GetUsersInfos; import org.communiquons.android.comunic.client.data.UsersInfo.GetUsersInfos;
import org.communiquons.android.comunic.client.data.UsersInfo.UserInfo; import org.communiquons.android.comunic.client.data.UsersInfo.UserInfo;
import org.communiquons.android.comunic.client.data.friendsList.Friend; import org.communiquons.android.comunic.client.data.friendsList.Friend;
import org.communiquons.android.comunic.client.data.friendsList.FriendUser;
import org.communiquons.android.comunic.client.data.friendsList.FriendsAdapter;
import org.communiquons.android.comunic.client.data.friendsList.FriendsUtils;
import org.communiquons.android.comunic.client.data.friendsList.GetFriendsListTask; import org.communiquons.android.comunic.client.data.friendsList.GetFriendsListTask;
import java.util.ArrayList; import java.util.ArrayList;
@ -28,16 +32,38 @@ import java.util.ArrayList;
public class FriendsListFragment extends Fragment { public class FriendsListFragment extends Fragment {
/**
* The root view of the fragment
*/
View rootView;
/**
* Application context
*/
Context mContext;
/**
* Database helper
*/
DatabaseHelper mDbHelper;
@Nullable @Nullable
@Override @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
//Save application context
mContext = getActivity().getApplicationContext();
//Create database helper
mDbHelper = new DatabaseHelper(mContext);
//Retain the fragment //Retain the fragment
//setRetainInstance(true); //setRetainInstance(true);
//Inflate the layout for this fragment //Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_friendslist, container, false); rootView = inflater.inflate(R.layout.fragment_friendslist, container, false);
return rootView;
} }
@ -53,21 +79,78 @@ public class FriendsListFragment extends Fragment {
* Refresh the friend list * Refresh the friend list
*/ */
void refresh_friend_list(){ void refresh_friend_list(){
//Display loading bar
display_progress_bar(true);
new GetFriendsListTask(getActivity().getApplicationContext()){ new GetFriendsListTask(getActivity().getApplicationContext()){
@Override @Override
protected void onPostExecute(ArrayList<Friend> friendsList) { protected void onPostExecute(ArrayList<Friend> friendsList) {
//Display informations in the console //Remote progress bar
for(Friend friend : friendsList){ display_progress_bar(false);
Log.v("FriendsListFragment", "Friend: " + friend.getId() + " " +
(friend.isAccepted() ? 1 : 0 ) + " " + (friend.isFollowing() ? 1 : 0) +
" " + friend.getLast_activity() + " "
);
}
//Check for errors
if(friendsList == null){
Toast.makeText(mContext, R.string.fragment_friendslist_err_refresh,
Toast.LENGTH_LONG).show();
return;
}
else
//Update the friends list
update_friends_list(friendsList);
} }
}.execute(); }.execute();
} }
/**
* Set the the list of friend attached to the list adapter
*
* @param friendsList The friends list to apply
*/
private void update_friends_list(final ArrayList<Friend> friendsList){
//Get user informations
new GetUsersInfos(mContext, mDbHelper).
getMultiple(FriendsUtils.getFriendsIDs(friendsList), new GetUsersInfos.getMultipleUserInfosCallback() {
@Override
public void callback(ArrayMap<Integer, UserInfo> info) {
//Check for errors
if(info == null){
Toast.makeText(mContext, R.string.fragment_friendslist_err_get_userinfos,
Toast.LENGTH_SHORT).show();
return;
}
//Merge the user informations list and friends List into FriendInfo list
ArrayList<FriendUser> friendsUserList = FriendsUtils.merge_friends_user_infos_list(
friendsList,
info
);
//Set the adapter
FriendsAdapter friendsAdapter = new FriendsAdapter(getActivity(), friendsUserList);
ListView listView = rootView.findViewById(R.id.fragment_friendslist_listview);
listView.setAdapter(friendsAdapter);
}
});
}
/**
* Hide (or display) progress bar
*
* @param display Specify whether the loading bar has to be shown or not
*/
private void display_progress_bar(boolean display){
//Get the view
rootView.findViewById(R.id.fragment_friendslist_progressbar).setVisibility(
display ? View.VISIBLE : View.GONE
);
}
} }

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="8dp"
android:paddingEnd="8dp">
<ImageView
android:id="@+id/fragment_friendslist_item_accountimage"
android:layout_width="@dimen/account_image_default_width"
android:layout_height="@dimen/account_image_default_height"
android:src="@drawable/default_account_image"
android:contentDescription="User account image"
android:layout_gravity="center"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="8dp"
android:paddingEnd="4dp"
android:layout_gravity="center"
>
<TextView
android:id="@+id/fragment_friendslist_item_fullname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Full user name"
android:textSize="16sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Online"
android:textColor="@android:color/holo_green_dark"/>
</LinearLayout>
</LinearLayout>

View File

@ -1,11 +1,20 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent" android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<TextView <!-- Progress bar - when loading the list of friends -->
<ProgressBar
android:id="@+id/fragment_friendslist_progressbar"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Hello from friends list"/> android:layout_centerHorizontal="true" />
</LinearLayout> <ListView
android:id="@+id/fragment_friendslist_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:numColumns="auto_fit" />
</RelativeLayout>

View File

@ -0,0 +1,7 @@
<resources>
<!-- The default size of an account image -->
<dimen name="account_image_default_width">64dp</dimen>
<dimen name="account_image_default_height">64dp</dimen>
</resources>

View File

@ -16,4 +16,6 @@
<string name="popup_signout_cancel_button">Cancel</string> <string name="popup_signout_cancel_button">Cancel</string>
<string name="navigation_bottom_friends_item">Friends</string> <string name="navigation_bottom_friends_item">Friends</string>
<string name="navigation_bottom_me_item">Me</string> <string name="navigation_bottom_me_item">Me</string>
<string name="fragment_friendslist_err_refresh">Couldn\'t refresh friends list !</string>
<string name="fragment_friendslist_err_get_userinfos">Couldn\'t get information about your friends!</string>
</resources> </resources>