Can get and display information about groups in notification fragment.

This commit is contained in:
Pierre HUBERT 2018-08-01 09:29:21 +02:00
parent 2f4621c0e5
commit 9a2520efd5
10 changed files with 469 additions and 8 deletions

View File

@ -3,6 +3,7 @@ package org.communiquons.android.comunic.client.data.arrays;
import android.support.annotation.Nullable;
import android.util.ArrayMap;
import org.communiquons.android.comunic.client.data.models.GroupInfo;
import org.communiquons.android.comunic.client.data.models.UserInfo;
import org.communiquons.android.comunic.client.data.enums.NotifElemType;
import org.communiquons.android.comunic.client.data.models.Notif;
@ -23,6 +24,11 @@ public class NotifsList extends ArrayList<Notif> {
*/
private ArrayMap<Integer, UserInfo> mUsersInfo;
/**
* Information about the groups related to the notifications
*/
private ArrayMap<Integer, GroupInfo> mGroupsInfo;
/**
* Get and return the IDs of the users related to the notifications
*
@ -62,6 +68,29 @@ public class NotifsList extends ArrayList<Notif> {
return IDs;
}
/**
* Get and return the IDs of the groups related to the notificatoin
*
* @return The ID of the groups related to the notification
*/
public ArrayList<Integer> getGroupsID(){
ArrayList<Integer> IDs = new ArrayList<>();
for(Notif notif : this){
if(notif.getOn_elem_type() == NotifElemType.GROUP_PAGE
&& !IDs.contains(notif.getOn_elem_id()))
IDs.add(notif.getOn_elem_id());
if(notif.getFrom_container_type() == NotifElemType.GROUP_PAGE
&& !IDs.contains(notif.getFrom_container_id()))
IDs.add(notif.getFrom_container_id());
}
return IDs;
}
/**
* Set information about the users related to the notifications
*
@ -80,4 +109,22 @@ public class NotifsList extends ArrayList<Notif> {
public ArrayMap<Integer, UserInfo> getUsersInfo() {
return mUsersInfo;
}
/**
* Get information about the related groups
*
* @return Information about the related groups
*/
public ArrayMap<Integer, GroupInfo> getGroupsInfo() {
return mGroupsInfo;
}
/**
* Set information about the related groups
*
* @param mGroupsInfo Information about the groups
*/
public void setGroupsInfo(ArrayMap<Integer, GroupInfo> mGroupsInfo) {
this.mGroupsInfo = mGroupsInfo;
}
}

View File

@ -0,0 +1,11 @@
package org.communiquons.android.comunic.client.data.enums;
/**
* Posts creations levels
*
* @author Pierre HUBERT
*/
public enum GroupPostsCreationLevel {
MODERATORS,
MEMBERS
}

View File

@ -0,0 +1,12 @@
package org.communiquons.android.comunic.client.data.enums;
/**
* Group registration levels
*
* @author Pierre HUBERT
*/
public enum GroupRegistrationLevel {
OPEN,
MODERATED,
CLOSED
}

View File

@ -0,0 +1,12 @@
package org.communiquons.android.comunic.client.data.enums;
/**
* Groups visibility levels
*
* @author Pierre HUBERT
*/
public enum GroupVisibility {
OPEN,
PRIVATE,
SECRETE
}

View File

@ -0,0 +1,17 @@
package org.communiquons.android.comunic.client.data.enums;
/**
* Groups membership levels
*
* @author Pierre HUBERT
*/
public enum GroupsMembershipLevels {
ADMINISTRATOR,
MODERATOR,
MEMBER,
INVITED,
PENDING,
VISITOR
}

View File

@ -0,0 +1,220 @@
package org.communiquons.android.comunic.client.data.helpers;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.ArrayMap;
import org.communiquons.android.comunic.client.data.enums.GroupPostsCreationLevel;
import org.communiquons.android.comunic.client.data.enums.GroupRegistrationLevel;
import org.communiquons.android.comunic.client.data.enums.GroupVisibility;
import org.communiquons.android.comunic.client.data.enums.GroupsMembershipLevels;
import org.communiquons.android.comunic.client.data.models.APIRequest;
import org.communiquons.android.comunic.client.data.models.APIResponse;
import org.communiquons.android.comunic.client.data.models.GroupInfo;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
/**
* Groups helper
*/
public class GroupsHelper extends BaseHelper {
/**
* Groups constructor
*
* @param context The context of the application
*/
public GroupsHelper(Context context) {
super(context);
}
/**
* Get information about multiple groups
*
* @param IDs The ID of the target groups
* @return Information about the related groups
*/
@Nullable
public ArrayMap<Integer, GroupInfo> getInfoMultiple(ArrayList<Integer> IDs){
return downloadMultiple(IDs);
}
/**
* Download information of multiple groups from the server
*
* @param IDs The IDs of the groups to get
* @return Information about the groups / null in case of failure
*/
@Nullable
private ArrayMap<Integer, GroupInfo> downloadMultiple(ArrayList<Integer> IDs){
//Make a request over the server
APIRequest request = new APIRequest(getContext(), "groups/get_multiple_info");
//Process the list of groups to get
StringBuilder reqList = new StringBuilder();
for(Integer id : IDs) {
reqList.append(id);
reqList.append(",");
}
request.addString("list", reqList.toString());
try {
APIResponse response = new APIRequestHelper().exec(request);
JSONObject object = response.getJSONObject();
ArrayMap<Integer, GroupInfo> list = new ArrayMap<>();
if(object == null) return null;
//Parse the list of keys
for(Integer id : IDs){
//Get raw information about the group
JSONObject info = object.getJSONObject(id + "");
//Check if we did not get anything
if(info == null)
return null;
list.put(id, parse_group_info(info));
}
return list;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* Parse group information into GroupInfo object
*
* @param object The object to parse
* @return Generated group object
* @throws JSONException In case of failure
*/
private GroupInfo parse_group_info(@NonNull JSONObject object) throws JSONException {
GroupInfo info = new GroupInfo();
info.setId(object.getInt("id"));
info.setName(object.getString("name"));
info.setIcon_url(object.getString("icon_url"));
info.setNumber_members(object.getInt("number_members"));
info.setMembershipLevel(parse_membership_level(object.getString("membership")));
info.setVisibility(parse_group_visibility(object.getString("visibility")));
info.setRegistrationLevel(parse_group_registration_level(object.getString("registration_level")));
info.setPostCreationLevel(parse_post_creation_level(object.getString("posts_level")));
info.setVirtualDirectory(object.getString("virtual_directory"));
info.setFollowing(object.getBoolean("following"));
return info;
}
/**
* Parse membership level
*
* @param level Membership level to parse as string
* @return Equivalent membership level
*/
private GroupsMembershipLevels parse_membership_level(String level){
switch (level){
case "administrator":
return GroupsMembershipLevels.ADMINISTRATOR;
case "moderator":
return GroupsMembershipLevels.MODERATOR;
case "member":
return GroupsMembershipLevels.MEMBER;
case "invited":
return GroupsMembershipLevels.INVITED;
case "pending":
return GroupsMembershipLevels.PENDING;
case "visitor":
return GroupsMembershipLevels.VISITOR;
default:
throw new RuntimeException("Unsupported membership level: " + level);
}
}
/**
* Parse group visibility level
*
* @param level The level to parse
* @return Equivalent visibility level
*/
private GroupVisibility parse_group_visibility(String level){
switch (level){
case "open":
return GroupVisibility.OPEN;
case "private":
return GroupVisibility.PRIVATE;
case "secrete":
return GroupVisibility.SECRETE;
default:
throw new RuntimeException("Unsupported group visibility level: " + level);
}
}
/**
* Parse group registration level
*
* @param level The level to parse
* @return Equivalent registration level
*/
private GroupRegistrationLevel parse_group_registration_level(String level){
switch (level){
case "open":
return GroupRegistrationLevel.OPEN;
case "moderated":
return GroupRegistrationLevel.MODERATED;
case "closed":
return GroupRegistrationLevel.CLOSED;
default:
throw new RuntimeException("Unsupported group registration level: " + level);
}
}
/**
* Parse post creation level
*
* @param level The level to parse
* @return Equivalent post creation post level
*/
private GroupPostsCreationLevel parse_post_creation_level(String level){
switch (level){
case "moderators":
return GroupPostsCreationLevel.MODERATORS;
case "members":
return GroupPostsCreationLevel.MEMBERS;
default:
throw new RuntimeException("Unsupported group post creation level: " + level);
}
}
}

View File

@ -0,0 +1,119 @@
package org.communiquons.android.comunic.client.data.models;
import android.support.annotation.Nullable;
import org.communiquons.android.comunic.client.data.enums.GroupRegistrationLevel;
import org.communiquons.android.comunic.client.data.enums.GroupVisibility;
import org.communiquons.android.comunic.client.data.enums.GroupsMembershipLevels;
import org.communiquons.android.comunic.client.data.enums.GroupPostsCreationLevel;
/**
* Group information base model
*
* @author Pierre HUBERT
*/
public class GroupInfo {
//Private fields
private int id;
private String name;
private String icon_url;
private int number_members;
private GroupsMembershipLevels membershipLevel;
private GroupVisibility visibility;
private GroupRegistrationLevel registrationLevel;
private GroupPostsCreationLevel postCreationLevel;
private String virtualDirectory;
private boolean following;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIcon_url() {
return icon_url;
}
public void setIcon_url(String icon_url) {
this.icon_url = icon_url;
}
public int getNumber_members() {
return number_members;
}
public void setNumber_members(int number_members) {
this.number_members = number_members;
}
public GroupsMembershipLevels getMembershipLevel() {
return membershipLevel;
}
public void setMembershipLevel(GroupsMembershipLevels membershipLevel) {
this.membershipLevel = membershipLevel;
}
public GroupVisibility getVisibility() {
return visibility;
}
public void setVisibility(GroupVisibility visibility) {
this.visibility = visibility;
}
public GroupRegistrationLevel getRegistrationLevel() {
return registrationLevel;
}
public void setRegistrationLevel(GroupRegistrationLevel registrationLevel) {
this.registrationLevel = registrationLevel;
}
public GroupPostsCreationLevel getPostCreationLevel() {
return postCreationLevel;
}
public void setPostCreationLevel(GroupPostsCreationLevel creationLevel) {
this.postCreationLevel = creationLevel;
}
@Nullable
public String getVirtualDirectory() {
return virtualDirectory;
}
public boolean hasVirtualDirectory(){
return virtualDirectory != null;
}
public void setVirtualDirectory(@Nullable String virtualDirectory) {
this.virtualDirectory = virtualDirectory;
if(virtualDirectory != null){
if(virtualDirectory.equals("null"))
this.virtualDirectory = null;
}
}
public boolean isFollowing() {
return following;
}
public void setFollowing(boolean following) {
this.following = following;
}
}

View File

@ -6,10 +6,13 @@ import android.util.ArrayMap;
import org.communiquons.android.comunic.client.R;
import org.communiquons.android.comunic.client.data.enums.NotifElemType;
import org.communiquons.android.comunic.client.data.enums.NotificationTypes;
import org.communiquons.android.comunic.client.data.models.GroupInfo;
import org.communiquons.android.comunic.client.data.models.Notif;
import org.communiquons.android.comunic.client.data.models.UserInfo;
import org.communiquons.android.comunic.client.ui.utils.UiUtils;
import java.security.acl.Group;
/**
* Notifications utilities
*
@ -25,10 +28,12 @@ public class NotifsUtils {
* @param context The context of the application
* @param notif The target notification
* @param userInfos Information about the user of the notification
* @param groupsInfo Information about related groups
* @return The message associated to the notification
*/
public static String getNotificationMessage(Context context, Notif notif,
ArrayMap<Integer, UserInfo> userInfos){
ArrayMap<Integer, UserInfo> userInfos,
ArrayMap<Integer, GroupInfo> groupsInfo){
//First, put the name of the user
String message = userInfos.get(notif.getFrom_user_id()).getDisplayFullName();
@ -74,7 +79,8 @@ public class NotifsUtils {
//Group page
else if(notif.getFrom_container_type() == NotifElemType.GROUP_PAGE){
message += UiUtils.getString(context, R.string.notif_on_group_page);
message += UiUtils.getString(context, R.string.notif_on_group_page,
groupsInfo.get(notif.getFrom_container_id()).getName());
}
//Return the message

View File

@ -13,12 +13,15 @@ import android.widget.TextView;
import org.communiquons.android.comunic.client.R;
import org.communiquons.android.comunic.client.data.helpers.ImageLoadHelper;
import org.communiquons.android.comunic.client.data.models.GroupInfo;
import org.communiquons.android.comunic.client.data.models.UserInfo;
import org.communiquons.android.comunic.client.data.models.Notif;
import org.communiquons.android.comunic.client.data.arrays.NotifsList;
import org.communiquons.android.comunic.client.data.utils.NotifsUtils;
import org.communiquons.android.comunic.client.data.utils.Utilities;
import java.lang.reflect.Array;
/**
* Notifications list adapter
*
@ -38,6 +41,11 @@ public class NotificationsAdapter extends ArrayAdapter<Notif>{
*/
private ArrayMap<Integer, UserInfo> mUsersInfo;
/**
* Information about the groups related to the notifications
*/
private ArrayMap<Integer, GroupInfo> mGroupsInfo;
/**
* Public adapter constructor
*
@ -47,8 +55,9 @@ public class NotificationsAdapter extends ArrayAdapter<Notif>{
public NotificationsAdapter(Context context, NotifsList list){
super(context, 0, list);
//Save user information
//Save users and groups information
mUsersInfo = list.getUsersInfo();
mGroupsInfo = list.getGroupsInfo();
mUtils = new Utilities(context);
}
@ -75,7 +84,8 @@ public class NotificationsAdapter extends ArrayAdapter<Notif>{
//Update the message of the notification
TextView message = convertView.findViewById(R.id.notification_message);
message.setText(NotifsUtils.getNotificationMessage(getContext(), notif, mUsersInfo));
message.setText(NotifsUtils.getNotificationMessage(getContext(), notif,
mUsersInfo, mGroupsInfo));
//Update the date of the notification
TextView date = convertView.findViewById(R.id.notification_date);

View File

@ -22,6 +22,7 @@ import android.widget.Toast;
import org.communiquons.android.comunic.client.R;
import org.communiquons.android.comunic.client.data.enums.NotifElemType;
import org.communiquons.android.comunic.client.data.helpers.GetUsersHelper;
import org.communiquons.android.comunic.client.data.helpers.GroupsHelper;
import org.communiquons.android.comunic.client.data.helpers.NotificationsHelper;
import org.communiquons.android.comunic.client.data.arrays.NotifsList;
import org.communiquons.android.comunic.client.data.models.Notif;
@ -50,6 +51,11 @@ public class NotificationsFragment extends Fragment implements View.OnCreateCont
*/
private GetUsersHelper mUsersInfoHelper;
/**
* Groups heper
*/
private GroupsHelper mGroupsHelper;
/**
* Notifications list
*/
@ -94,11 +100,10 @@ public class NotificationsFragment extends Fragment implements View.OnCreateCont
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Create notifications helper
//Initialize helpers
mNotificationsHelper = new NotificationsHelper(getActivity());
//Create get users helper
mUsersInfoHelper = new GetUsersHelper(getActivity());
mGroupsHelper = new GroupsHelper(getActivity());
}
@Nullable
@ -228,8 +233,10 @@ public class NotificationsFragment extends Fragment implements View.OnCreateCont
NotifsList list = mNotificationsHelper.getListUnread();
//If we got the list of notifications, fetch users information
if(list != null)
if(list != null) {
list.setUsersInfo(mUsersInfoHelper.getMultiple(list.getUsersID()));
list.setGroupsInfo(mGroupsHelper.getInfoMultiple(list.getGroupsID()));
}
return list;