Can add conversation members

This commit is contained in:
Pierre 2018-01-02 12:20:21 +01:00
parent 1818db46ab
commit 703142df5b
5 changed files with 283 additions and 3 deletions

View File

@ -108,6 +108,26 @@ public class GetUsersHelper {
} }
/**
* Get the list of missing users ID in a set of users informations
*
* @param IDs The reference IDs list
* @param usersInfo Informations about the users
* @return
*/
public static ArrayList<Integer> get_missing_ids(@NonNull ArrayList<Integer> IDs,
@NonNull ArrayMap<Integer, UserInfo> usersInfo){
ArrayList<Integer> missingIds = new ArrayList<>();
//Process the list of IDs
for(int user_id : IDs){
if(!usersInfo.containsKey(user_id))
missingIds.add(user_id);
}
return missingIds;
}
/** /**
* Get information about multiple users from the database or from the server * Get information about multiple users from the database or from the server
* *

View File

@ -0,0 +1,100 @@
package org.communiquons.android.comunic.client.data.UsersInfo;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.ArrayMap;
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.ImageLoad.ImageLoadManager;
import org.communiquons.android.comunic.client.data.utils.UiUtils;
import java.util.ArrayList;
/**
* User async infos adapter
*
* Similar to UsersBasicAdapter, but the information about users can be given after the users
* themselve
*
* @author Pierre HUBERT
* Created by pierre on 1/2/18.
*/
public class UsersAsysncInfoAdapter extends ArrayAdapter<Integer> {
/**
* Informations about the members of the conversation
*/
private ArrayMap<Integer, UserInfo> usersInfos;
/**
* Constructor
* @param context The context of the application
* @param IDs The list of IDs of users
* @param usersInfos Informations about the users (can be updated asynchronously with the list
* of users ID)
*/
public UsersAsysncInfoAdapter(Context context, @NonNull ArrayList<Integer> IDs,
@NonNull ArrayMap<Integer, UserInfo> usersInfos){
super(context, 0, IDs);
//Save user information array map
this.usersInfos = usersInfos;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
if(convertView == null)
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.user_basic_adapter_item, parent, false);
//Get the views
ImageView account_image = convertView.findViewById(R.id.user_account_image);
TextView account_name = convertView.findViewById(R.id.user_name);
//Empty the entry
ImageLoadManager.remove(account_image);
account_image.setImageDrawable(UiUtils.getDrawable(getContext(),
R.drawable.default_account_image));
account_name.setText("");
//Get user ID
int userID = getItem(position);
//Check if we go user informations
if(usersInfos.containsKey(userID)){
UserInfo user = usersInfos.get(userID);
account_name.setText(user.getDisplayFullName());
ImageLoadManager.load(getContext(), user.getAcountImageURL(), account_image);
}
return convertView;
}
/**
* Get the ID of a position
*
* This method is overriden in order to remove the @Nullable tag
*
* @param position The position of the item
* @return The ID of the personn or -1 in case of failure
*/
@NonNull
@Override
public Integer getItem(int position) {
Integer ID = super.getItem(position);
return ID == null ? -1 : ID;
}
}

View File

@ -3,20 +3,29 @@ package org.communiquons.android.comunic.client.fragments;
import android.app.Activity; import android.app.Activity;
import android.app.Fragment; import android.app.Fragment;
import android.content.Intent; import android.content.Intent;
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.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.Button; import android.widget.Button;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.ListView; import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import org.communiquons.android.comunic.client.MainActivity; import org.communiquons.android.comunic.client.MainActivity;
import org.communiquons.android.comunic.client.R; import org.communiquons.android.comunic.client.R;
import org.communiquons.android.comunic.client.SearchUserActivity; import org.communiquons.android.comunic.client.SearchUserActivity;
import org.communiquons.android.comunic.client.data.DatabaseHelper;
import org.communiquons.android.comunic.client.data.UsersInfo.GetUsersHelper;
import org.communiquons.android.comunic.client.data.UsersInfo.UserInfo;
import org.communiquons.android.comunic.client.data.UsersInfo.UsersAsysncInfoAdapter;
import java.util.ArrayList;
/** /**
* Create and / or update a conversation fragment * Create and / or update a conversation fragment
@ -62,6 +71,42 @@ public class UpdateConversationFragment extends Fragment {
*/ */
private Button submitButton; private Button submitButton;
/**
* Loading progress bar
*/
private ProgressBar progressBar;
/**
* Users members ID list
*/
private ArrayList<Integer> membersID = null;
/**
* Members informations
*/
private ArrayMap<Integer, UserInfo> membersInfo = null;
/**
* Members list adapter
*/
private UsersAsysncInfoAdapter membersAdapter;
/**
* Users information helper
*/
private GetUsersHelper usersHelper;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Get database helper instance
DatabaseHelper dbHelper = DatabaseHelper.getInstance(getActivity());
//Get User helper
usersHelper = new GetUsersHelper(getActivity(), dbHelper);
}
@Nullable @Nullable
@Override @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
@ -72,7 +117,8 @@ public class UpdateConversationFragment extends Fragment {
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
//Get the view //Get the views
progressBar = view.findViewById(R.id.progress_bar);
nameView = view.findViewById(R.id.fragment_update_conversation_name); nameView = view.findViewById(R.id.fragment_update_conversation_name);
followCheckbox = view.findViewById(R.id.fragment_update_conversation_follow); followCheckbox = view.findViewById(R.id.fragment_update_conversation_follow);
membersList = view.findViewById(R.id.fragment_update_conversation_members); membersList = view.findViewById(R.id.fragment_update_conversation_members);
@ -86,6 +132,10 @@ public class UpdateConversationFragment extends Fragment {
requestAddMember(); requestAddMember();
} }
}); });
//Initialize the form
init_form();
} }
@Override @Override
@ -115,7 +165,108 @@ public class UpdateConversationFragment extends Fragment {
//Check if it is a success //Check if it is a success
if(resultCode == Activity.RESULT_OK){ if(resultCode == Activity.RESULT_OK){
Toast.makeText(getActivity(), "Request success", Toast.LENGTH_SHORT).show();
switch(requestCode){
case FIND_USER_ID_INTENT:
addMemberID(Integer.decode(data.getData().getQueryParameter("userID")));
}
} }
} }
/**
* Initialize the form
*/
private void init_form(){
//Hide progress bar
set_progressbar_visibility(false);
//Initialize the list of members
membersID = new ArrayList<>();
membersInfo = new ArrayMap<>();
membersAdapter = new UsersAsysncInfoAdapter(getActivity(), membersID, membersInfo);
membersList.setAdapter(membersAdapter);
}
/**
* Add a member to the list, specified by its ID
*
* @param memberID The ID of the member to add
*/
private void addMemberID(int memberID){
//Check if the member is already on the list
if(membersID.contains(memberID)) {
Toast.makeText(getActivity(), R.string.err_add_member_double, Toast.LENGTH_SHORT).show();
return;
}
//Push the member into the list
membersID.add(memberID);
membersAdapter.notifyDataSetChanged();
//Refresh members information
refresh_members_information();
}
/**
* Refresh members informations
*
* Fetch informations about the users for which we don't know anything yet
*/
private void refresh_members_information(){
//Get the list of the required IDs
final ArrayList<Integer> missingIDs = GetUsersHelper.get_missing_ids(membersID, membersInfo);
//Continue only if required
if(missingIDs.size() == 0)
return; //Do nothing
//Search informations about them
new AsyncTask<Void, Void, ArrayMap<Integer, UserInfo>>(){
@Override
protected ArrayMap<Integer, UserInfo> doInBackground(Void... params) {
return usersHelper.getMultiple(missingIDs);
}
@Override
protected void onPostExecute(ArrayMap<Integer, UserInfo> result) {
append_new_members_info(result);
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
/**
* Append new information about members
*
* @param usersInfo Information about the members
*/
private void append_new_members_info(@Nullable ArrayMap<Integer, UserInfo> usersInfo){
//Check for errors
if(usersInfo == null){
Toast.makeText(getActivity(), R.string.err_get_users_info, Toast.LENGTH_SHORT).show();
return;
}
//Add the list of user information
membersInfo.putAll(usersInfo);
//Notify data set update
membersAdapter.notifyDataSetChanged();
}
/**
* Update progressbar visibility
*
* @param visible TRUE to make the progressbar visible
*/
private void set_progressbar_visibility(boolean visible){
progressBar.setVisibility(visible ? View.VISIBLE : View.GONE);
}
} }

View File

@ -3,6 +3,13 @@
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">
<!-- Progres bar -->
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
<!-- Conversation name --> <!-- Conversation name -->
<android.support.design.widget.TextInputLayout <android.support.design.widget.TextInputLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -22,7 +29,7 @@
<!-- Conversation members --> <!-- Conversation members -->
<ListView <ListView
android:id="@+id/fragment_update_conversation_members" android:id="@+id/fragment_update_conversation_members"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1"/> android:layout_weight="1"/>

View File

@ -82,4 +82,6 @@
<string name="activity_searchuser_title">Search user</string> <string name="activity_searchuser_title">Search user</string>
<string name="activity_searchuser_text_placeholder">User name</string> <string name="activity_searchuser_text_placeholder">User name</string>
<string name="err_search_user">Could not search user !</string> <string name="err_search_user">Could not search user !</string>
<string name="err_add_member_double">This user is already a member of the conversation!</string>
<string name="err_get_users_info">Could not get information about users !</string>
</resources> </resources>