diff --git a/app/src/main/java/org/communiquons/android/comunic/client/data/UsersInfo/GetUsersInfos.java b/app/src/main/java/org/communiquons/android/comunic/client/data/UsersInfo/GetUsersInfos.java index c64797a..0d9b775 100644 --- a/app/src/main/java/org/communiquons/android/comunic/client/data/UsersInfo/GetUsersInfos.java +++ b/app/src/main/java/org/communiquons/android/comunic/client/data/UsersInfo/GetUsersInfos.java @@ -1,6 +1,7 @@ package org.communiquons.android.comunic.client.data.UsersInfo; import android.content.Context; +import android.util.ArrayMap; import org.communiquons.android.comunic.client.api.APIRequestParameters; import org.communiquons.android.comunic.client.api.APIRequestTask; @@ -9,6 +10,8 @@ import org.communiquons.android.comunic.client.data.DatabaseHelper; import org.json.JSONException; import org.json.JSONObject; +import java.util.ArrayList; + /** * This class handles informations requests about user informations * @@ -58,6 +61,19 @@ public class GetUsersInfos { } + /** + * This interface must be implemented to perform an API request + */ + public interface getMultipleUserInfosCallback{ + + /** + * Callback function called when we got informations about user + * + * @param info Information about the user + */ + void callback(ArrayMap info); + } + /** * Get and return informations about a user * @@ -82,6 +98,39 @@ public class GetUsersInfos { } + /** + * Get informations about multiple users + * + * @param IDs The ID of the user to get + * @param callback The result once we got all the users + */ + public void getMultiple(ArrayList IDs, getMultipleUserInfosCallback callback){ + + //Initializate variables + ArrayList usersToGet = new ArrayList<>(); + ArrayMap usersInfo = new ArrayMap<>(); + + //Process each given user to check if they are available locally or not + for(Integer id : IDs){ + //Check if the user exist or not + if(!udbHelper.exists(id)) + usersToGet.add(id); + else { + //Get and save user informations + usersInfo.put(id, udbHelper.get(id)); + } + } + + //Check if there are user informations to get on the server + if(usersToGet.size() > 0){ + getMultipleOnServer(usersToGet, usersInfo, callback); + } + else { + //Call the callback now with the cached user informations + callback.callback(usersInfo); + } + } + /** * Get and return the informations about a user on the server * @@ -140,6 +189,79 @@ public class GetUsersInfos { } + /** + * Get and return the informations about mutliple users on the server + * + * @param IDs The ID of the user to get informations from + * @param uInfos Informations about the other users (users that were already available in the db) + * @param callback What to do once the request is done + */ + private void getMultipleOnServer(final ArrayList IDs, final ArrayMap uInfos, + final getMultipleUserInfosCallback callback){ + + //Determine IDs list + String IDs_list = ""; + for(int id : IDs){ + IDs_list += id + ","; + } + + //Perform a request on the API server + //Setup the request + APIRequestParameters requestParameters = new APIRequestParameters(context, "user/getInfosMultiple"); + requestParameters.addParameter("usersID", IDs_list); + + //Do it. + new APIRequestTask(){ + + @Override + protected void onPostExecute(APIResponse result) { + + try { + if(result != null) { + + //Try to extract user informations + JSONObject userObjectContainer = result.getJSONObject(); + + if (userObjectContainer != null) { + + //Process each user ID + for(int userID : IDs) { + + UserInfo userInfos = null; + + //Extract user object + JSONObject userObject = userObjectContainer.getJSONObject(""+userID); + + //Continue only if we could extract required informations + if (userObject != null) { + //Parse user informations + userInfos = parse_user_json(userObject); + } + + //Save user information in the local database in case of success + if (userInfos != null) + udbHelper.insertOrUpdate(userInfos); + + //Add the user to the list + uInfos.put(userID, userInfos); + } + } + + } + + } catch (JSONException e){ + e.printStackTrace(); + } + + //Perform callback action + callback.callback(uInfos); + + } + + }.execute(requestParameters); + + } + /** * Parse a JSON object into a user object * diff --git a/app/src/main/java/org/communiquons/android/comunic/client/fragments/FriendsListFragment.java b/app/src/main/java/org/communiquons/android/comunic/client/fragments/FriendsListFragment.java index beb5304..bfdf9e3 100644 --- a/app/src/main/java/org/communiquons/android/comunic/client/fragments/FriendsListFragment.java +++ b/app/src/main/java/org/communiquons/android/comunic/client/fragments/FriendsListFragment.java @@ -3,11 +3,19 @@ package org.communiquons.android.comunic.client.fragments; import android.app.Fragment; import android.os.Bundle; import android.support.annotation.Nullable; +import android.util.ArrayMap; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Toast; import org.communiquons.android.comunic.client.R; +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.UserInfo; + +import java.util.ArrayList; /** * Friends list fragment @@ -24,10 +32,38 @@ public class FriendsListFragment extends Fragment { Bundle savedInstanceState) { //Retain the fragment - setRetainInstance(true); + //setRetainInstance(true); //Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_friendslist, container, false); } + + @Override + public void onStart() { + super.onStart(); + + final ArrayList list = new ArrayList<>(); + list.add(2); + list.add(3); + new GetUsersInfos(getActivity(), new DatabaseHelper(getActivity())).getMultiple(list, new GetUsersInfos.getMultipleUserInfosCallback() { + @Override + public void callback(ArrayMap info) { + Log.v("FriendsListFragment", "User infos callback"); + if(info == null) + Toast.makeText(getActivity(), "Failure", Toast.LENGTH_LONG).show(); + else + Toast.makeText(getActivity(), "Success", Toast.LENGTH_LONG).show(); + + for(int ID : list){ + UserInfo infos = info.get(ID); + + if(infos == null) + Log.e("FriendsListFragment", "Error with user infos for ID " + ID); + else + Log.v("FriendsListFragment", ID + " is " + infos.getFullName() + " !"); + } + } + }); + } }