Can update group membership

This commit is contained in:
Pierre HUBERT 2018-09-08 16:59:18 +02:00
parent 8cf57d17c6
commit 36a15388cc
16 changed files with 676 additions and 10 deletions

View File

@ -161,6 +161,70 @@ public class GroupsHelper extends BaseHelper {
} }
} }
/**
* Send a group membership request
*
* @param groupID The ID of the target group
* @return Depends of the success of the operation
*/
public boolean sendRequest(int groupID){
APIRequest request = new APIRequest(getContext(), "groups/send_request");
request.addInt("id", groupID);
return performMembershipUpdate(request);
}
/**
* Cancel a group membership request
*
* @param groupID the ID of the target group
* @return TRUE in case of success / FALSE else
*/
public boolean cancelRequest(int groupID){
APIRequest request = new APIRequest(getContext(), "groups/cancel_request");
request.addInt("id", groupID);
return performMembershipUpdate(request);
}
/**
* Respond to a group membership invitation
*
* @param groupID The ID of the target group
* @param accept TRUE to accept invitation / FALSE else
*/
public boolean respondInvitation(int groupID, boolean accept){
APIRequest request = new APIRequest(getContext(), "groups/respond_invitation");
request.addInt("id", groupID);
request.addBoolean("accept", accept);
return performMembershipUpdate(request);
}
/**
* Leave a group
*
* @param groupID The ID of the group to leave
* @return TRUE for a success / FALSE else
*/
public boolean leaveGroup(int groupID){
APIRequest request = new APIRequest(getContext(), "groups/remove_membership");
request.addInt("id", groupID);
return performMembershipUpdate(request);
}
/**
* Perform on the server a membership update
*
* @param request The request to perform
* @return Depends of the success of the operation
*/
private boolean performMembershipUpdate(APIRequest request){
try {
return new APIRequestHelper().exec(request).getResponse_code() == 200;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/** /**
* Parse group information into GroupInfo object * Parse group information into GroupInfo object
* *

View File

@ -10,7 +10,9 @@ import android.widget.TextView;
import org.communiquons.android.comunic.client.R; import org.communiquons.android.comunic.client.R;
import org.communiquons.android.comunic.client.data.models.GroupInfo; import org.communiquons.android.comunic.client.data.models.GroupInfo;
import org.communiquons.android.comunic.client.ui.listeners.OnGroupMembershipUpdateListener;
import org.communiquons.android.comunic.client.ui.views.GroupImageView; import org.communiquons.android.comunic.client.ui.views.GroupImageView;
import org.communiquons.android.comunic.client.ui.views.GroupMembershipStatusView;
import java.util.ArrayList; import java.util.ArrayList;
@ -26,6 +28,8 @@ public class GroupsListAdapter extends BaseRecyclerViewAdapter {
*/ */
private ArrayList<GroupInfo> mList = new ArrayList<>(); private ArrayList<GroupInfo> mList = new ArrayList<>();
private OnGroupMembershipUpdateListener mOnGroupMembershipUpdateListener;
public GroupsListAdapter(Context context) { public GroupsListAdapter(Context context) {
super(context); super(context);
} }
@ -39,6 +43,15 @@ public class GroupsListAdapter extends BaseRecyclerViewAdapter {
this.mList = List; this.mList = List;
} }
/**
* Set the group membership update listener
*
* @param onGroupMembershipUpdateListener The listener
*/
public void setOnGroupMembershipUpdateListener(OnGroupMembershipUpdateListener onGroupMembershipUpdateListener) {
this.mOnGroupMembershipUpdateListener = onGroupMembershipUpdateListener;
}
@Override @Override
public int getItemCount() { public int getItemCount() {
return mList.size(); return mList.size();
@ -57,6 +70,7 @@ public class GroupsListAdapter extends BaseRecyclerViewAdapter {
((GroupHolder)viewHolder).bind(i); ((GroupHolder)viewHolder).bind(i);
} }
/** /**
* Single group holder class * Single group holder class
*/ */
@ -64,12 +78,16 @@ public class GroupsListAdapter extends BaseRecyclerViewAdapter {
private GroupImageView mGroupImageView; private GroupImageView mGroupImageView;
private TextView mGroupName; private TextView mGroupName;
private GroupMembershipStatusView mGroupMembershipStatus;
GroupHolder(@NonNull View itemView) { GroupHolder(@NonNull View itemView) {
super(itemView); super(itemView);
mGroupImageView = itemView.findViewById(R.id.groupImage); mGroupImageView = itemView.findViewById(R.id.groupImage);
mGroupName = itemView.findViewById(R.id.groupName); mGroupName = itemView.findViewById(R.id.groupName);
mGroupMembershipStatus = itemView.findViewById(R.id.groupMembershipStatusView);
mGroupMembershipStatus.setOnGroupMembershipUpdateListener(mOnGroupMembershipUpdateListener);
} }
GroupInfo getGroup(int pos){ GroupInfo getGroup(int pos){
@ -80,6 +98,7 @@ public class GroupsListAdapter extends BaseRecyclerViewAdapter {
GroupInfo groupInfo = getGroup(pos); GroupInfo groupInfo = getGroup(pos);
mGroupImageView.setGroup(groupInfo); mGroupImageView.setGroup(groupInfo);
mGroupName.setText(groupInfo.getDisplayName()); mGroupName.setText(groupInfo.getDisplayName());
mGroupMembershipStatus.setGroup(groupInfo);
} }
} }
} }

View File

@ -0,0 +1,21 @@
package org.communiquons.android.comunic.client.ui.asynctasks;
import android.content.Context;
import org.communiquons.android.comunic.client.data.helpers.GroupsHelper;
/**
* Cancel a group membership request task
*
* @author Pierre HUBERT
*/
public class CancelGroupMembershipRequestTask extends SafeAsyncTask<Integer, Void, Boolean> {
public CancelGroupMembershipRequestTask(Context context) {
super(context);
}
@Override
protected Boolean doInBackground(Integer... integers) {
return new GroupsHelper(getContext()).cancelRequest(integers[0]);
}
}

View File

@ -0,0 +1,21 @@
package org.communiquons.android.comunic.client.ui.asynctasks;
import android.content.Context;
import org.communiquons.android.comunic.client.data.helpers.GroupsHelper;
/**
* Leave group task
*
* @author Pierre HUBERT
*/
public class LeaveGroupTask extends SafeAsyncTask<Integer, Void, Boolean> {
public LeaveGroupTask(Context context) {
super(context);
}
@Override
protected Boolean doInBackground(Integer... integers) {
return new GroupsHelper(getContext()).leaveGroup(integers[0]);
}
}

View File

@ -0,0 +1,27 @@
package org.communiquons.android.comunic.client.ui.asynctasks;
import android.content.Context;
import org.communiquons.android.comunic.client.data.helpers.GroupsHelper;
/**
* Respond to a group membership invitation task
*
* @author Pierre HUBERT
*/
public class RespondGroupInvitationTask extends SafeAsyncTask<Integer, Void, Boolean> {
private boolean mAccept;
public RespondGroupInvitationTask(Context context, boolean accept) {
super(context);
this.mAccept = accept;
}
@Override
protected Boolean doInBackground(Integer... integers) {
return new GroupsHelper(getContext()).respondInvitation(integers[0], mAccept);
}
}

View File

@ -0,0 +1,21 @@
package org.communiquons.android.comunic.client.ui.asynctasks;
import android.content.Context;
import org.communiquons.android.comunic.client.data.helpers.GroupsHelper;
/**
* Send a group membership request task
*
* @author Pierre HUBERT
*/
public class SendGroupMembershipRequestTask extends SafeAsyncTask<Integer, Void, Boolean> {
public SendGroupMembershipRequestTask(Context context) {
super(context);
}
@Override
protected Boolean doInBackground(Integer... integers) {
return new GroupsHelper(getContext()).sendRequest(integers[0]);
}
}

View File

@ -1,8 +1,21 @@
package org.communiquons.android.comunic.client.ui.fragments.groups; package org.communiquons.android.comunic.client.ui.fragments.groups;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.support.annotation.CallSuper;
import android.support.v7.app.AlertDialog;
import android.widget.Toast;
import org.communiquons.android.comunic.client.R; import org.communiquons.android.comunic.client.R;
import org.communiquons.android.comunic.client.data.models.GroupInfo;
import org.communiquons.android.comunic.client.ui.activities.MainActivity; import org.communiquons.android.comunic.client.ui.activities.MainActivity;
import org.communiquons.android.comunic.client.ui.asynctasks.CancelGroupMembershipRequestTask;
import org.communiquons.android.comunic.client.ui.asynctasks.LeaveGroupTask;
import org.communiquons.android.comunic.client.ui.asynctasks.RespondGroupInvitationTask;
import org.communiquons.android.comunic.client.ui.asynctasks.SafeAsyncTask;
import org.communiquons.android.comunic.client.ui.asynctasks.SendGroupMembershipRequestTask;
import org.communiquons.android.comunic.client.ui.fragments.AbstractFragment; import org.communiquons.android.comunic.client.ui.fragments.AbstractFragment;
import org.communiquons.android.comunic.client.ui.listeners.OnGroupMembershipUpdateListener;
import java.util.Objects; import java.util.Objects;
@ -11,7 +24,12 @@ import java.util.Objects;
* *
* @author Pierre HUBERT * @author Pierre HUBERT
*/ */
abstract class AbstractGroupFragment extends AbstractFragment { abstract class AbstractGroupFragment extends AbstractFragment implements OnGroupMembershipUpdateListener {
/**
* Debug tag
*/
private static final String TAG = AbstractGroupFragment.class.getSimpleName();
@Override @Override
public void onResume() { public void onResume() {
@ -20,4 +38,82 @@ abstract class AbstractGroupFragment extends AbstractFragment {
MainActivity.SetNavbarSelectedOption(Objects.requireNonNull(getActivity()), MainActivity.SetNavbarSelectedOption(Objects.requireNonNull(getActivity()),
R.id.action_personal_page); R.id.action_personal_page);
} }
@Override
public void onRespondInvitation(GroupInfo group, boolean accept) {
RespondGroupInvitationTask respondGroupInvitationTask =
new RespondGroupInvitationTask(getContext(), accept);
performGroupMembershipUpdate(group.getId(), respondGroupInvitationTask);
}
@Override
public void onCancelRequest(GroupInfo group) {
CancelGroupMembershipRequestTask task = new CancelGroupMembershipRequestTask(getActivity());
performGroupMembershipUpdate(group.getId(), task);
}
@Override
public void onSendRequest(GroupInfo group) {
SendGroupMembershipRequestTask task = new SendGroupMembershipRequestTask(getActivity());
performGroupMembershipUpdate(group.getId(), task);
}
@Override
public void onLeaveGroup(GroupInfo group) {
final int groupID = group.getId();
new AlertDialog.Builder(getActivity())
.setTitle(R.string.dialog_leave_group_title)
.setMessage(R.string.dialog_leave_group_message)
.setNegativeButton(R.string.dialog_leave_group_cancel, null)
.setPositiveButton(R.string.dialog_leave_group_confirm, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
leaveGroup(groupID);
}
}).show();
}
/**
* Do leave the group for the user
*
* @param groupID The ID of the group to leave
*/
private void leaveGroup(final int groupID) {
LeaveGroupTask leaveGroupTask = new LeaveGroupTask(getActivity());
performGroupMembershipUpdate(groupID, leaveGroupTask);
}
/**
* Perform group membership update
*
* @param groupID The ID of the target group
* @param task Task to execute
*/
private void performGroupMembershipUpdate(final int groupID, SafeAsyncTask<Integer, Void, Boolean> task) {
task.setOnPostExecuteListener(new SafeAsyncTask.OnPostExecuteListener<Boolean>() {
@Override
public void OnPostExecute(Boolean success) {
onGroupMembershipUpdated(success, groupID);
}
});
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, groupID);
getTasksManager().addTask(task);
}
/**
* This method is called when the membership to a group has been updated
*
* @param success TRUE if the operation was a success / FALSE else
* @param groupID Information about the updated group
*/
@CallSuper
public void onGroupMembershipUpdated(boolean success, int groupID) {
//Check for errors
if (!success)
Toast.makeText(getActivity(), R.string.err_update_group_membership,
Toast.LENGTH_SHORT).show();
}
} }

View File

@ -120,17 +120,29 @@ public class UserGroupsFragment extends AbstractGroupFragment {
setProgressBarVisibility(false); setProgressBarVisibility(false);
if(mGroupsAdapter == null) {
mGroupsAdapter = new GroupsListAdapter(getActivity()); mGroupsAdapter = new GroupsListAdapter(getActivity());
mGroupsAdapter.setList(new ArrayList<>(mGroupsList.values()));
mGroupsView.setAdapter(mGroupsAdapter); mGroupsView.setAdapter(mGroupsAdapter);
mGroupsView.setLayoutManager(new LinearLayoutManager(getActivity())); mGroupsView.setLayoutManager(new LinearLayoutManager(getActivity()));
mGroupsView.addItemDecoration(new DividerItemDecoration(getActivity(), mGroupsView.addItemDecoration(new DividerItemDecoration(getActivity(),
DividerItemDecoration.VERTICAL)); DividerItemDecoration.VERTICAL));
}
mGroupsAdapter.setOnGroupMembershipUpdateListener(this);
mGroupsAdapter.setList(new ArrayList<>(mGroupsList.values()));
mGroupsAdapter.notifyDataSetChanged();
setNoGroupNoticeVisibility(mGroupsList.size() == 0); setNoGroupNoticeVisibility(mGroupsList.size() == 0);
} }
@Override
public void onGroupMembershipUpdated(boolean success, int groupID) {
super.onGroupMembershipUpdated(success, groupID);
getGroupsList();
}
/** /**
* Update (set) progressbar visibility * Update (set) progressbar visibility
* *

View File

@ -0,0 +1,35 @@
package org.communiquons.android.comunic.client.ui.listeners;
import org.communiquons.android.comunic.client.data.models.GroupInfo;
public interface OnGroupMembershipUpdateListener {
/**
* Respond to a group membership invitation
*
* @param group Information about the target group
* @param accept TRUE to accept / FALSE else
*/
void onRespondInvitation(GroupInfo group, boolean accept);
/**
* Cancel a group membership request
*
* @param group The target group
*/
void onCancelRequest(GroupInfo group);
/**
* Send a request to join a group
*
* @param group The target group
*/
void onSendRequest(GroupInfo group);
/**
* Send a request to leave a group
*
* @param group The target group
*/
void onLeaveGroup(GroupInfo group);
}

View File

@ -0,0 +1,173 @@
package org.communiquons.android.comunic.client.ui.views;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.constraint.ConstraintLayout;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;
import org.communiquons.android.comunic.client.R;
import org.communiquons.android.comunic.client.data.models.GroupInfo;
import org.communiquons.android.comunic.client.ui.listeners.OnGroupMembershipUpdateListener;
/**
* Group membership button
*
* @author Pierre HUBERT
*/
public class GroupMembershipStatusView extends BaseFrameLayoutView implements View.OnClickListener {
/**
* Views
*/
private ConstraintLayout respondInvitationForm;
private Button rejectButton;
private Button acceptButton;
private ConstraintLayout cancelRequestForm;
private Button cancelButton;
private ConstraintLayout requestForm;
private Button joinButton;
private ConstraintLayout memberForm;
private Button leaveButton;
/**
* Group information
*/
private GroupInfo mInfo;
/**
* Listener
*/
private OnGroupMembershipUpdateListener mOnGroupMembershipUpdateListener;
public GroupMembershipStatusView(@NonNull Context context) {
this(context, null);
}
public GroupMembershipStatusView(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public GroupMembershipStatusView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
View view = inflate(getContext(), R.layout.view_group_membership_status, this);
respondInvitationForm = view.findViewById(R.id.respondInvitationForm);
rejectButton = view.findViewById(R.id.rejectButton);
acceptButton = view.findViewById(R.id.acceptButton);
cancelRequestForm = view.findViewById(R.id.cancelRequestForm);
cancelButton = view.findViewById(R.id.cancelButton);
requestForm = view.findViewById(R.id.requestForm);
joinButton = view.findViewById(R.id.joinButton);
memberForm = view.findViewById(R.id.memberForm);
leaveButton = view.findViewById(R.id.leaveButton);
//Show only one form
showForm(respondInvitationForm);
rejectButton.setOnClickListener(this);
acceptButton.setOnClickListener(this);
cancelButton.setOnClickListener(this);
joinButton.setOnClickListener(this);
leaveButton.setOnClickListener(this);
}
/**
* Set the group membership update listener
*
* @param onGroupMembershipUpdateListener The listener
*/
public void setOnGroupMembershipUpdateListener(OnGroupMembershipUpdateListener onGroupMembershipUpdateListener) {
this.mOnGroupMembershipUpdateListener = onGroupMembershipUpdateListener;
}
/**
* Assign the view to a new group
*
* @param info Information about the group
*/
public void setGroup(GroupInfo info) {
mInfo = info;
showButtons(true);
switch (info.getMembershipLevel()) {
case VISITOR:
showForm(requestForm);
return;
case PENDING:
showForm(cancelRequestForm);
return;
case INVITED:
showForm(respondInvitationForm);
return;
default:
showForm(memberForm);
}
}
/**
* Display the form contained in a specific view and hide the other ones
*
* @param v The container of the form to show
*/
private void showForm(View v) {
respondInvitationForm.setVisibility(v.equals(respondInvitationForm)
? View.VISIBLE : View.GONE);
cancelRequestForm.setVisibility(v.equals(cancelRequestForm)
? View.VISIBLE : View.GONE);
requestForm.setVisibility(v.equals(requestForm)
? View.VISIBLE : View.GONE);
memberForm.setVisibility(v.equals(memberForm) ? View.VISIBLE : View.GONE);
}
/**
* Update buttons visibility
*
* @param visible New visibility for the buttons
*/
private void showButtons(boolean visible){
rejectButton.setVisibility(visible ? View.VISIBLE : View.GONE);
acceptButton.setVisibility(visible ? View.VISIBLE : View.GONE);
cancelButton.setVisibility(visible ? View.VISIBLE : View.GONE);
joinButton.setVisibility(visible ? View.VISIBLE : View.GONE);
leaveButton.setVisibility(View.VISIBLE); //View cannot be hidden
}
@Override
public void onClick(View v) {
if(mOnGroupMembershipUpdateListener == null)
return;
showButtons(false);
if(v.equals(rejectButton)){
mOnGroupMembershipUpdateListener.onRespondInvitation(mInfo, false);
}
else if(v.equals(acceptButton)){
mOnGroupMembershipUpdateListener.onRespondInvitation(mInfo, true);
}
else if(v.equals(cancelButton)){
mOnGroupMembershipUpdateListener.onCancelRequest(mInfo);
}
else if (v.equals(joinButton)){
mOnGroupMembershipUpdateListener.onSendRequest(mInfo);
}
else if(v.equals(leaveButton)){
mOnGroupMembershipUpdateListener.onLeaveGroup(mInfo);
}
}
}

View File

@ -0,0 +1,137 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.constraint.ConstraintLayout
android:id="@+id/respondInvitationForm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/textView9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:text="@string/notice_group_invited"
app:layout_constraintEnd_toEndOf="@+id/acceptButton"
app:layout_constraintStart_toStartOf="@+id/acceptButton" />
<Button
android:id="@+id/rejectButton"
style="@style/GroupMembershipButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:backgroundTint="@android:color/holo_red_dark"
android:text="@string/action_group_reject_request"
android:textColor="@android:color/white"
app:layout_constraintEnd_toEndOf="@+id/acceptButton"
app:layout_constraintStart_toStartOf="@+id/acceptButton"
app:layout_constraintTop_toBottomOf="@+id/acceptButton" />
<Button
android:id="@+id/acceptButton"
style="@style/GroupMembershipButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:backgroundTint="@color/holo_green_dark"
android:text="@string/action_group_accept_request"
android:textColor="@android:color/white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView9" />
</android.support.constraint.ConstraintLayout>
<android.support.constraint.ConstraintLayout
android:id="@+id/cancelRequestForm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/respondInvitationForm">
<TextView
android:id="@+id/textView10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/notice_group_requested"
app:layout_constraintEnd_toEndOf="@+id/cancelButton"
app:layout_constraintStart_toStartOf="@+id/cancelButton"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/cancelButton"
style="@style/GroupMembershipButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:backgroundTint="@android:color/holo_red_dark"
android:text="@string/action_group_cancel_membership_request"
android:textColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView10" />
</android.support.constraint.ConstraintLayout>
<android.support.constraint.ConstraintLayout
android:id="@+id/requestForm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/cancelRequestForm">
<Button
android:id="@+id/joinButton"
style="@style/GroupMembershipButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp"
android:backgroundTint="@color/dark_blue"
android:text="@string/action_join_group"
android:textColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
<android.support.constraint.ConstraintLayout
android:id="@+id/memberForm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/requestForm">
<Button
android:id="@+id/leaveButton"
style="@style/GroupMembershipButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp"
android:backgroundTint="@android:color/holo_red_dark"
android:text="@string/action_leave_group"
android:textColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>

View File

@ -13,10 +13,11 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
tools:text="Group Name"
android:textSize="18sp" android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="@+id/groupImage"
app:layout_constraintStart_toEndOf="@+id/groupImage" app:layout_constraintStart_toEndOf="@+id/groupImage"
app:layout_constraintTop_toTopOf="@+id/groupImage" /> app:layout_constraintTop_toTopOf="@+id/groupImage"
tools:text="Group Name" />
<org.communiquons.android.comunic.client.ui.views.GroupImageView <org.communiquons.android.comunic.client.ui.views.GroupImageView
android:id="@+id/groupImage" android:id="@+id/groupImage"
@ -29,4 +30,13 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_friends" /> app:srcCompat="@drawable/ic_friends" />
<org.communiquons.android.comunic.client.ui.views.GroupMembershipStatusView
android:id="@+id/groupMembershipStatusView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</android.support.constraint.ConstraintLayout> </android.support.constraint.ConstraintLayout>

View File

@ -300,4 +300,16 @@
<string name="action_user_groups">Mes groupes</string> <string name="action_user_groups">Mes groupes</string>
<string name="err_get_user_groups">Une erreur a survenu lors de la récupération de vos groupes !</string> <string name="err_get_user_groups">Une erreur a survenu lors de la récupération de vos groupes !</string>
<string name="notice_no_group">Vous n\'avez aucun groupe pour le moment.</string> <string name="notice_no_group">Vous n\'avez aucun groupe pour le moment.</string>
<string name="notice_group_invited">Invité</string>
<string name="action_group_accept_request">Accepter</string>
<string name="action_group_reject_request">Rejeter</string>
<string name="notice_group_requested">Demande envoyée</string>
<string name="action_group_cancel_membership_request">Annuler</string>
<string name="action_join_group">Rejoindre</string>
<string name="action_leave_group">Quitter</string>
<string name="dialog_leave_group_title">Quitter le groupe</string>
<string name="dialog_leave_group_message">Voulez-vous vraiment quitter ce groupe ? Il se peut que vous ne puissez pas le rejoindre ultérieurement !</string>
<string name="dialog_leave_group_cancel">Annuler</string>
<string name="dialog_leave_group_confirm">Quitter</string>
<string name="err_update_group_membership">Une erreur a survenue lors de la mise à jour de votre appartenance au groupe !</string>
</resources> </resources>

View File

@ -4,7 +4,7 @@
<color name="colorPrimaryDark">#303F9F</color> <color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#ff4081</color> <color name="colorAccent">#ff4081</color>
<color name="holo_green_dark">#ff669900</color> <color name="holo_green_dark">#669900</color>
<color name="darker_gray">#aaa</color> <color name="darker_gray">#aaa</color>
<color name="darker_darker_gray">#5b5b5b</color> <color name="darker_darker_gray">#5b5b5b</color>
<color name="dark_blue">#303f9f</color> <color name="dark_blue">#303f9f</color>

View File

@ -299,4 +299,16 @@
<string name="action_user_groups">My groups</string> <string name="action_user_groups">My groups</string>
<string name="err_get_user_groups">Could not get the groups of the user!</string> <string name="err_get_user_groups">Could not get the groups of the user!</string>
<string name="notice_no_group">You do not have any group yet.</string> <string name="notice_no_group">You do not have any group yet.</string>
<string name="notice_group_invited">Invited</string>
<string name="action_group_accept_request">Accept</string>
<string name="action_group_reject_request">Reject</string>
<string name="notice_group_requested">Requested</string>
<string name="action_group_cancel_membership_request">Cancel</string>
<string name="action_join_group">Join</string>
<string name="action_leave_group">Leave</string>
<string name="dialog_leave_group_title">Leave group</string>
<string name="dialog_leave_group_message">Do you really want to leave this group? You might not be able to join it later!</string>
<string name="dialog_leave_group_cancel">Cancel</string>
<string name="dialog_leave_group_confirm">Leave</string>
<string name="err_update_group_membership">Could not update group membership!</string>
</resources> </resources>

View File

@ -174,4 +174,10 @@
<item name="android:padding">2dp</item> <item name="android:padding">2dp</item>
<item name="android:layout_gravity">center</item> <item name="android:layout_gravity">center</item>
</style> </style>
<!-- Groups membership button -->
<style name="GroupMembershipButton" >
<item name="android:minHeight">40dip</item>
<item name="android:minWidth">80dip</item>
</style>
</resources> </resources>