Friend can be delete and friendship request accepted

This commit is contained in:
Pierre 2017-12-06 18:23:34 +01:00
parent e8fd331c7d
commit b89221ab94
6 changed files with 231 additions and 34 deletions

View File

@ -7,6 +7,7 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
@ -14,6 +15,7 @@ import org.communiquons.android.comunic.client.BuildConfig;
import org.communiquons.android.comunic.client.R; import org.communiquons.android.comunic.client.R;
import org.communiquons.android.comunic.client.data.ImageLoad.ImageLoadManager; import org.communiquons.android.comunic.client.data.ImageLoad.ImageLoadManager;
import org.communiquons.android.comunic.client.data.Utilities; import org.communiquons.android.comunic.client.data.Utilities;
import org.communiquons.android.comunic.client.fragments.FriendsListFragment;
import java.util.ArrayList; import java.util.ArrayList;
@ -26,20 +28,27 @@ import java.util.ArrayList;
public class FriendsAdapter extends ArrayAdapter<FriendUser> { public class FriendsAdapter extends ArrayAdapter<FriendUser> {
/**
* The fragment creating the adapter
*/
private FriendsListFragment mFLfragment;
/** /**
* Class constructor * Class constructor
* *
* @param friendsListFragment Friends list fragment object
* @param context The context of execution of the application * @param context The context of execution of the application
* @param friendsList The list of friends to display (with user information) * @param friendsList The list of friends to display (with user information)
*/ */
public FriendsAdapter(Activity context, ArrayList<FriendUser> friendsList){ public FriendsAdapter(FriendsListFragment friendsListFragment,
Activity context, ArrayList<FriendUser> friendsList){
super(context, 0, friendsList); super(context, 0, friendsList);
mFLfragment = friendsListFragment;
} }
@NonNull @NonNull
@Override @Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View listItemView = convertView; View listItemView = convertView;
//Check if the view has to be created //Check if the view has to be created
@ -71,7 +80,7 @@ public class FriendsAdapter extends ArrayAdapter<FriendUser> {
); );
//Set the color //Set the color
int status_color = 0; int status_color;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
status_color = getContext().getResources().getColor(signed_in ? R.color.holo_green_dark : R.color.darker_gray, null); status_color = getContext().getResources().getColor(signed_in ? R.color.holo_green_dark : R.color.darker_gray, null);
} }
@ -80,6 +89,36 @@ public class FriendsAdapter extends ArrayAdapter<FriendUser> {
} }
statusView.setTextColor(status_color); statusView.setTextColor(status_color);
//Action button
Button action = listItemView.findViewById(R.id.fragment_friendslist_item_action);
//Define the action of the accept request button
if(!friendUser.getFriend().isAccepted()){
//Update the button
action.setVisibility(View.VISIBLE);
action.setText(R.string.action_friends_accept_request);
//Make the button lives
action.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Hide the view
v.setVisibility(View.GONE);
mFLfragment.acceptRequest(position);
}
});
}
else {
//Remove button actions and hide it
action.setVisibility(View.GONE);
action.setOnClickListener(null);
}
return listItemView; return listItemView;
} }

View File

@ -1,7 +1,10 @@
package org.communiquons.android.comunic.client.data.friendsList; package org.communiquons.android.comunic.client.data.friendsList;
import android.content.Context; import android.content.Context;
import android.util.Log;
import org.communiquons.android.comunic.client.api.APIRequest;
import org.communiquons.android.comunic.client.api.APIRequestParameters;
import org.communiquons.android.comunic.client.data.DatabaseHelper; import org.communiquons.android.comunic.client.data.DatabaseHelper;
/** /**
@ -15,6 +18,9 @@ import org.communiquons.android.comunic.client.data.DatabaseHelper;
public class FriendsList { public class FriendsList {
//Debug tag
private static final String TAG = "FriendsList";
private FriendsListDbHelper fdbHelper; private FriendsListDbHelper fdbHelper;
private Context mContext; private Context mContext;
@ -35,11 +41,44 @@ public class FriendsList {
* @param friend The friend to delete * @param friend The friend to delete
*/ */
public void remove(Friend friend){ public void remove(Friend friend){
try {
//Remove the friend online //Remove the friend online
//TODO : Remove the friend form online APIRequestParameters delparams = new APIRequestParameters(mContext, "friends/remove");
delparams.addParameter("friendID", ""+friend.getId());
new APIRequest().exec(delparams);
//Remove the friend from the local database //Remove the friend from the local database
//TODO : Remove the friend from the local database fdbHelper.delete_friend(friend);
} catch (Exception e){
Log.e(TAG, "Couldn't delete friend !");
e.printStackTrace();
}
}
/**
* Respond to a friendship request
*
* @param friend The friend to update
* @param accept The new status for the request
*/
public void respondRequest(Friend friend, boolean accept){
try {
//Perform a request to update the satus online
APIRequestParameters reqParams = new APIRequestParameters(mContext,
"friends/respondRequest");
reqParams.addParameter("friendID", ""+friend.getId());
reqParams.addParameter("accept", accept ? "true" : "false");
new APIRequest().exec(reqParams);
//Update the friend in the local database
friend.setAccepted(accept);
fdbHelper.update_friend(friend);
} catch(Exception e){
Log.e(TAG, "Couldn't respond to friendship request !");
e.printStackTrace();
}
} }
} }

View File

@ -143,11 +143,7 @@ public class FriendsListDbHelper {
String nullColumnHack = null; String nullColumnHack = null;
//Set the values //Set the values
ContentValues values = new ContentValues(); ContentValues values = createContentValue(friend);
values.put(FriendsListSchema.COLUMN_NAME_FRIEND_ID, friend.getId());
values.put(FriendsListSchema.COLUMN_NAME_FRIEND_ACCEPTED, friend.isAccepted() ? 1 : 0);
values.put(FriendsListSchema.COLUMN_NAME_FRIEND_FOLLOWING, friend.isFollowing() ? 1 : 0);
values.put(FriendsListSchema.COLUMN_NAME_FRIEND_LAST_ACTIVITY, friend.getLast_activity());
//Perform the query //Perform the query
return db.insert(table_name, nullColumnHack, values) > -1; return db.insert(table_name, nullColumnHack, values) > -1;
@ -175,4 +171,70 @@ public class FriendsListDbHelper {
return result; return result;
} }
/**
* Remove a friend from the list
*
* @param friend The friend to delete
*/
boolean delete_friend(Friend friend){
//Get access to the database
SQLiteDatabase db = dbHelper.getWritableDatabase();
//Prepare the request
String table_name = FriendsListSchema.TABLE_NAME;
String whereClause = FriendsListSchema.COLUMN_NAME_FRIEND_ID + " = ?";
String[] whereValues = {""+friend.getId()};
int result = db.delete(table_name, whereClause, whereValues);
//Close access to the database
db.close();
return result > 0;
}
/**
* Update a specified user in the database with specified information
*
* @param friend The friend to update on the databse
* @return The result of the operation
*/
boolean update_friend(Friend friend){
//Get access to the database
SQLiteDatabase db = dbHelper.getWritableDatabase();
//Prepare the request
String table = FriendsListSchema.TABLE_NAME;
ContentValues values = createContentValue(friend);
String whereClause = FriendsListSchema.COLUMN_NAME_FRIEND_ID + " = ?";
String[] whereArgs = {""+friend.getId()};
//Perform it
int result = db.update(table, values, whereClause, whereArgs);
//Close access to the database
db.close();
return result > 0;
}
/**
* Create a full content value based on user informations in order to make operation on
* the database easier
*
* @param friend The friend which will be turned into a contentvalue
* @return The generated content value
*/
private ContentValues createContentValue(Friend friend){
ContentValues values = new ContentValues();
values.put(FriendsListSchema.COLUMN_NAME_FRIEND_ID, friend.getId());
values.put(FriendsListSchema.COLUMN_NAME_FRIEND_ACCEPTED, friend.isAccepted() ? 1 : 0);
values.put(FriendsListSchema.COLUMN_NAME_FRIEND_FOLLOWING, friend.isFollowing() ? 1 : 0);
values.put(FriendsListSchema.COLUMN_NAME_FRIEND_LAST_ACTIVITY, friend.getLast_activity());
return values;
}
} }

View File

@ -4,9 +4,11 @@ import android.app.AlertDialog;
import android.app.Fragment; import android.app.Fragment;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.os.AsyncTask;
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.ContextMenu; import android.view.ContextMenu;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuInflater; import android.view.MenuInflater;
@ -39,6 +41,11 @@ import java.util.ArrayList;
public class FriendsListFragment extends Fragment { public class FriendsListFragment extends Fragment {
/**
* Debug tag
*/
private String TAG = "FriendsListFragment";
/** /**
* The root view of the fragment * The root view of the fragment
*/ */
@ -64,6 +71,11 @@ public class FriendsListFragment extends Fragment {
*/ */
FriendsList flist; FriendsList flist;
/**
* Friend adapter
*/
private FriendsAdapter fAdapter;
@Nullable @Nullable
@Override @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@ -156,9 +168,9 @@ public class FriendsListFragment extends Fragment {
this.friendsList = friendsList; this.friendsList = friendsList;
//Set the adapter //Set the adapter
FriendsAdapter friendsAdapter = new FriendsAdapter(getActivity(), friendsList); fAdapter = new FriendsAdapter(this, getActivity(), friendsList);
ListView listView = rootView.findViewById(R.id.fragment_friendslist_listview); ListView listView = rootView.findViewById(R.id.fragment_friendslist_listview);
listView.setAdapter(friendsAdapter); listView.setAdapter(fAdapter);
//Register the view for the context menu //Register the view for the context menu
registerForContextMenu(listView); registerForContextMenu(listView);
@ -207,11 +219,24 @@ public class FriendsListFragment extends Fragment {
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
//Delete the friend from the list //Get the friend to delete
flist.remove(friendsList.get(pos).getFriend()); final Friend toDelete = friendsList.get(pos).getFriend();
//Refresh the current friend list //Apply new list version
refresh_friend_list(); friendsList.remove(pos);
fAdapter.notifyDataSetChanged();
//Remove the friend list on a parallel thread
new AsyncTask<Integer, Void, Void>(){
@Override
protected Void doInBackground(Integer[] params) {
//Delete the friend from the list
flist.remove(toDelete);
return null;
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, pos);
} }
}); });
builder.setNegativeButton(R.string.popup_deletefriend_button_cancel, null); builder.setNegativeButton(R.string.popup_deletefriend_button_cancel, null);
@ -220,6 +245,29 @@ public class FriendsListFragment extends Fragment {
} }
/**
* Accept friendship request
*
* @param pos The position of the friend accepting the request
*/
public void acceptRequest(int pos){
//Get the Friend object
Friend targetFriend = friendsList.get(pos).getFriend();
//Mark the friend as accepted
targetFriend.setAccepted(true);
//Accept the request on a separate thread
new AsyncTask<Friend, Void, Void>(){
@Override
protected Void doInBackground(Friend... params) {
flist.respondRequest(params[0], true);
return null;
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, targetFriend);
}
/** /**
* Hide (or display) progress bar * Hide (or display) progress bar
* *

View File

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

View File

@ -25,4 +25,6 @@
<string name="popup_deletefriend_message">Are you sure do you want to remove this friend from your friend list ? You will have to make a new friendship request to get this friend back !</string> <string name="popup_deletefriend_message">Are you sure do you want to remove this friend from your friend list ? You will have to make a new friendship request to get this friend back !</string>
<string name="popup_deletefriend_button_confirm">Delete</string> <string name="popup_deletefriend_button_confirm">Delete</string>
<string name="popup_deletefriend_button_cancel">Cancel</string> <string name="popup_deletefriend_button_cancel">Cancel</string>
<string name="action_friends_accept_request">Accept</string>
<string name="user_image_description">User Image Account</string>
</resources> </resources>