Display group access denied page.

This commit is contained in:
Pierre HUBERT 2018-12-02 12:34:15 +01:00
parent fcf31fdae1
commit 5ee02aea0a
11 changed files with 341 additions and 29 deletions

View File

@ -24,6 +24,11 @@ import java.util.ArrayList;
*/ */
public class GroupsHelper extends BaseHelper { public class GroupsHelper extends BaseHelper {
/**
* Debug tag
*/
private static final String TAG = GroupsHelper.class.getSimpleName();
/** /**
* Groups information cache * Groups information cache
*/ */
@ -64,6 +69,28 @@ public class GroupsHelper extends BaseHelper {
} }
/**
* Get information about a single group
*
* @param groupID Target group ID
* @param force Specify whether the request should be forced or not
* @return null in case of failure / Group information else
*/
@Nullable
public GroupInfo getInfoSingle(int groupID, boolean force){
//Prepare request
ArrayList<Integer> ids = new ArrayList<>();
ids.add(groupID);
//Execute request
ArrayMap<Integer, GroupInfo> list = getInfoMultiple(ids, force);
if(list == null || !list.containsKey(groupID))
return null;
return list.get(groupID);
}
/** /**
* Get information about multiple groups * Get information about multiple groups
* *
@ -172,11 +199,27 @@ public class GroupsHelper extends BaseHelper {
public AdvancedGroupInfo getAdvancedInformation(int groupID){ public AdvancedGroupInfo getAdvancedInformation(int groupID){
APIRequest request = new APIRequest(getContext(), "groups/get_advanced_info"); APIRequest request = new APIRequest(getContext(), "groups/get_advanced_info");
request.addInt("id", groupID); request.addInt("id", groupID);
request.setTryContinueOnError(true);
try { try {
//Execute request and get result //Execute request and get result
JSONObject object = new APIRequestHelper().exec(request).getJSONObject(); APIResponse response = new APIRequestHelper().exec(request);
if (response.getResponse_code() != 200) {
if(response.getResponse_code() == 401){
//Access was explicitly denied to the group
AdvancedGroupInfo groupInfo = new AdvancedGroupInfo();
groupInfo.setAccess_forbidden(true);
return groupInfo;
}
//Could not get group information
return null;
}
//Parse and return result
JSONObject object = response.getJSONObject();
return parse_advanced_group_info(object); return parse_advanced_group_info(object);
} catch (Exception e) { } catch (Exception e) {

View File

@ -10,12 +10,21 @@ package org.communiquons.android.comunic.client.data.models;
public class AdvancedGroupInfo extends GroupInfo { public class AdvancedGroupInfo extends GroupInfo {
//Private fields //Private fields
private boolean access_forbidden = false;
private int time_create; private int time_create;
private String url; private String url;
private String description; private String description;
private int number_likes; private int number_likes;
private boolean is_liking; private boolean is_liking;
public boolean isAccess_forbidden() {
return access_forbidden;
}
public void setAccess_forbidden(boolean access_forbidden) {
this.access_forbidden = access_forbidden;
}
public int getTime_create() { public int getTime_create() {
return time_create; return time_create;
} }

View File

@ -11,6 +11,7 @@ import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction; import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.LocalBroadcastManager; import android.support.v4.content.LocalBroadcastManager;
import android.util.Log; import android.util.Log;
@ -43,10 +44,12 @@ import org.communiquons.android.comunic.client.ui.fragments.LatestPostsFragment;
import org.communiquons.android.comunic.client.ui.fragments.NotificationsFragment; import org.communiquons.android.comunic.client.ui.fragments.NotificationsFragment;
import org.communiquons.android.comunic.client.ui.fragments.SinglePostFragment; import org.communiquons.android.comunic.client.ui.fragments.SinglePostFragment;
import org.communiquons.android.comunic.client.ui.fragments.UpdateConversationFragment; import org.communiquons.android.comunic.client.ui.fragments.UpdateConversationFragment;
import org.communiquons.android.comunic.client.ui.fragments.groups.GroupAccessDeniedFragment;
import org.communiquons.android.comunic.client.ui.fragments.groups.GroupPageMainFragment; import org.communiquons.android.comunic.client.ui.fragments.groups.GroupPageMainFragment;
import org.communiquons.android.comunic.client.ui.fragments.groups.UserGroupsFragment; import org.communiquons.android.comunic.client.ui.fragments.groups.UserGroupsFragment;
import org.communiquons.android.comunic.client.ui.fragments.userpage.UserAccessDeniedFragment; import org.communiquons.android.comunic.client.ui.fragments.userpage.UserAccessDeniedFragment;
import org.communiquons.android.comunic.client.ui.fragments.userpage.UserPageFragment; import org.communiquons.android.comunic.client.ui.fragments.userpage.UserPageFragment;
import org.communiquons.android.comunic.client.ui.listeners.OnOpenGroupListener;
import org.communiquons.android.comunic.client.ui.listeners.onOpenUsersPageListener; import org.communiquons.android.comunic.client.ui.listeners.onOpenUsersPageListener;
import org.communiquons.android.comunic.client.ui.listeners.onPostOpenListener; import org.communiquons.android.comunic.client.ui.listeners.onPostOpenListener;
import org.communiquons.android.comunic.client.ui.listeners.openConversationListener; import org.communiquons.android.comunic.client.ui.listeners.openConversationListener;
@ -64,7 +67,7 @@ import static org.communiquons.android.comunic.client.ui.Constants.IntentRequest
*/ */
public class MainActivity extends BaseActivity implements public class MainActivity extends BaseActivity implements
openConversationListener, updateConversationListener, onOpenUsersPageListener, openConversationListener, updateConversationListener, onOpenUsersPageListener,
onPostOpenListener, NavigationBar.OnNavigationItemSelectedListener { onPostOpenListener, NavigationBar.OnNavigationItemSelectedListener, OnOpenGroupListener {
/** /**
* Debug tag * Debug tag
@ -757,28 +760,13 @@ public class MainActivity extends BaseActivity implements
} }
/**
* Request the page of a group to be opened
*
* @param activity Current activity (MUST BE THIS ACTIVITY)
* @param groupID Group ID to open
*/
public static void OpenGroup(@NonNull Activity activity, int groupID){
if(!(activity instanceof MainActivity))
throw new RuntimeException("Specified activity is not an instance of MainActivity!");
((MainActivity)activity).openGroupPage(groupID);
}
/** /**
* Open group page * Open group page
* *
* @param groupID The ID of the group to open * @param groupID The ID of the group to open
*/ */
private void openGroupPage(int groupID){ @Override
public void onOpenGroup(int groupID) {
//Specify fragment arguments //Specify fragment arguments
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putInt(GroupPageMainFragment.ARGUMENT_GROUP_ID, groupID); args.putInt(GroupPageMainFragment.ARGUMENT_GROUP_ID, groupID);
@ -792,6 +780,26 @@ public class MainActivity extends BaseActivity implements
transaction.addToBackStack(null); transaction.addToBackStack(null);
transaction.replace(R.id.main_fragment, fragment); transaction.replace(R.id.main_fragment, fragment);
transaction.commit(); transaction.commit();
}
@Override
public void onOpenGroupAccessDenied(int groupID) {
//Add arguments
Bundle args = new Bundle();
args.putInt(GroupAccessDeniedFragment.ARGUMENT_GROUP_ID, groupID);
//Create fragment
Fragment fragment = new GroupAccessDeniedFragment();
fragment.setArguments(args);
//Remove last transaction from list
getSupportFragmentManager().popBackStackImmediate();
//Perform fragment transaction
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.addToBackStack(null);
transaction.replace(R.id.main_fragment, fragment);
transaction.commit();
} }
} }

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;
import org.communiquons.android.comunic.client.data.models.GroupInfo;
public class GetGroupInfoTask extends SafeAsyncTask<Integer, Void, GroupInfo> {
public GetGroupInfoTask(Context context) {
super(context);
}
@Override
protected GroupInfo doInBackground(Integer... integers) {
//By default, we force the request
return new GroupsHelper(getContext()).getInfoSingle(integers[0], true);
}
}

View File

@ -0,0 +1,137 @@
package org.communiquons.android.comunic.client.ui.fragments.groups;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import org.communiquons.android.comunic.client.R;
import org.communiquons.android.comunic.client.data.enums.GroupsMembershipLevels;
import org.communiquons.android.comunic.client.data.models.GroupInfo;
import org.communiquons.android.comunic.client.ui.asynctasks.GetGroupInfoTask;
import org.communiquons.android.comunic.client.ui.asynctasks.SafeAsyncTask;
import org.communiquons.android.comunic.client.ui.listeners.OnOpenGroupListener;
import org.communiquons.android.comunic.client.ui.views.GroupImageView;
import org.communiquons.android.comunic.client.ui.views.GroupMembershipStatusView;
import java.util.Objects;
/**
* Group access denied fragment
*
* This fragment appears when the user was explicitly denied
* access to a group advanced information
*
* @author Pierre HUBERT
*/
public class GroupAccessDeniedFragment extends AbstractGroupFragment {
/**
* Debug tag
*/
private static final String TAG = GroupAccessDeniedFragment.class.getSimpleName();
/**
* Mandatory argument to use this fragment : target group id
*/
public static final String ARGUMENT_GROUP_ID = "group_id";
/**
* Current group ID
*/
private int mGroupID;
/**
* Views
*/
private GroupImageView mGroupImageView;
private TextView mGroupNameView;
private GroupMembershipStatusView mGroupMembershipView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.layout_group_access_denied, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mGroupImageView = view.findViewById(R.id.groupImageView);
mGroupNameView = view.findViewById(R.id.groupName);
mGroupMembershipView = view.findViewById(R.id.groupMembershipStatusView);
}
@Override
public void onStart() {
super.onStart();
assert getArguments() != null;
mGroupID = getArguments().getInt(ARGUMENT_GROUP_ID);
getGroupInfo();
}
@Override
public void onGroupMembershipUpdated(boolean success, int groupID) {
super.onGroupMembershipUpdated(success, groupID);
getGroupInfo();
}
/**
* Get and return information about the group
*/
private void getGroupInfo(){
getTasksManager().unsetSpecificTasks(GetGroupInfoTask.class);
GetGroupInfoTask task = new GetGroupInfoTask(getActivity());
task.setOnPostExecuteListener(new SafeAsyncTask.OnPostExecuteListener<GroupInfo>() {
@Override
public void OnPostExecute(GroupInfo groupInfo) {
onGotGroupInfo(groupInfo);
}
});
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, mGroupID);
getTasksManager().addTask(task);
}
/**
* Method called once we have got group information
*
* @param info Information about the group
*/
private void onGotGroupInfo(@Nullable GroupInfo info){
//Check for errors
if(info == null){
Toast.makeText(getActivity(), R.string.err_get_group_info, Toast.LENGTH_SHORT).show();
return;
}
//Check if the user is now at least a member of the group
if(info.getMembershipLevel() == GroupsMembershipLevels.MEMBER
|| info.getMembershipLevel() == GroupsMembershipLevels.MODERATOR
|| info.getMembershipLevel() == GroupsMembershipLevels.ADMINISTRATOR){
//Go back to the group
Objects.requireNonNull(getActivity())
.getSupportFragmentManager().popBackStack();
((OnOpenGroupListener)getActivity()).onOpenGroup(info.getId());
}
//Apply group information
mGroupImageView.setGroup(info);
mGroupNameView.setText(info.getDisplayName());
mGroupMembershipView.setGroup(info);
mGroupMembershipView.setOnGroupMembershipUpdateListener(this);
}
}

View File

@ -15,9 +15,12 @@ import org.communiquons.android.comunic.client.R;
import org.communiquons.android.comunic.client.data.models.AdvancedGroupInfo; import org.communiquons.android.comunic.client.data.models.AdvancedGroupInfo;
import org.communiquons.android.comunic.client.ui.asynctasks.GetGroupAdvancedInfoTask; import org.communiquons.android.comunic.client.ui.asynctasks.GetGroupAdvancedInfoTask;
import org.communiquons.android.comunic.client.ui.asynctasks.SafeAsyncTask; import org.communiquons.android.comunic.client.ui.asynctasks.SafeAsyncTask;
import org.communiquons.android.comunic.client.ui.listeners.OnOpenGroupListener;
import org.communiquons.android.comunic.client.ui.utils.UiUtils; import org.communiquons.android.comunic.client.ui.utils.UiUtils;
import org.communiquons.android.comunic.client.ui.views.GroupImageView; import org.communiquons.android.comunic.client.ui.views.GroupImageView;
import java.util.Objects;
/** /**
* Group main page * Group main page
* *
@ -121,6 +124,13 @@ public class GroupPageMainFragment extends AbstractGroupFragment {
return; return;
} }
//Check if access to the group was denied
if(info.isAccess_forbidden()){
((OnOpenGroupListener) Objects.requireNonNull(getActivity()))
.onOpenGroupAccessDenied(mGroupID);
return;
}
mAdvancedGroupInfo = info; mAdvancedGroupInfo = info;
applyGroupInfo(); applyGroupInfo();
} }

View File

@ -23,6 +23,7 @@ import org.communiquons.android.comunic.client.ui.adapters.GroupsListAdapter;
import org.communiquons.android.comunic.client.ui.asynctasks.GetUserGroupsTask; import org.communiquons.android.comunic.client.ui.asynctasks.GetUserGroupsTask;
import org.communiquons.android.comunic.client.ui.asynctasks.SafeAsyncTask; import org.communiquons.android.comunic.client.ui.asynctasks.SafeAsyncTask;
import org.communiquons.android.comunic.client.ui.listeners.OnGroupActionListener; import org.communiquons.android.comunic.client.ui.listeners.OnGroupActionListener;
import org.communiquons.android.comunic.client.ui.listeners.OnOpenGroupListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Objects; import java.util.Objects;
@ -134,7 +135,7 @@ public class UserGroupsFragment extends AbstractGroupFragment implements OnGroup
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(Objects.requireNonNull(getActivity()),
DividerItemDecoration.VERTICAL)); DividerItemDecoration.VERTICAL));
@ -173,6 +174,12 @@ public class UserGroupsFragment extends AbstractGroupFragment implements OnGroup
@Override @Override
public void onOpenGroup(int groupID) { public void onOpenGroup(int groupID) {
Log.v(TAG, "Open group " + groupID); Log.v(TAG, "Open group " + groupID);
MainActivity.OpenGroup(Objects.requireNonNull(getActivity()), groupID); ((OnOpenGroupListener)Objects.requireNonNull(getActivity())).onOpenGroup(groupID);
}
@Override
public void onOpenGroupAccessDenied(int groupID) {
((OnOpenGroupListener)Objects.requireNonNull(getActivity()))
.onOpenGroupAccessDenied(groupID);
} }
} }

View File

@ -5,13 +5,7 @@ package org.communiquons.android.comunic.client.ui.listeners;
* *
* @author Pierre HUBERT * @author Pierre HUBERT
*/ */
public interface OnGroupActionListener extends OnGroupMembershipUpdateListener { public interface OnGroupActionListener
extends OnGroupMembershipUpdateListener, OnOpenGroupListener {
/**
* Open a group page
*
* @param groupID The ID of the group to open
*/
void onOpenGroup(int groupID);
} }

View File

@ -0,0 +1,24 @@
package org.communiquons.android.comunic.client.ui.listeners;
/**
* This interface is implemented by all classes that have to relay
* the opening of a group
*
* @author Pierre HUBERT
*/
public interface OnOpenGroupListener {
/**
* Open a group page
*
* @param groupID The ID of the group to open
*/
void onOpenGroup(int groupID);
/**
* Open a group access denied fragment page
*
* @param groupID The ID of the group to open
*/
void onOpenGroupAccessDenied(int groupID);
}

View File

@ -0,0 +1,58 @@
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<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"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView12" />
<org.communiquons.android.comunic.client.ui.views.GroupImageView
android:id="@+id/groupImageView"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_friends" />
<TextView
android:id="@+id/groupName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
tools:text="Group name"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/groupImageView" />
<TextView
android:id="@+id/textView12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="@string/notice_group_access_denied"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/groupName" />
</android.support.constraint.ConstraintLayout>

View File

@ -312,4 +312,5 @@
<string name="dialog_leave_group_confirm">Leave</string> <string name="dialog_leave_group_confirm">Leave</string>
<string name="err_update_group_membership">Could not update group membership!</string> <string name="err_update_group_membership">Could not update group membership!</string>
<string name="err_get_group_info">Could not get group information!</string> <string name="err_get_group_info">Could not get group information!</string>
<string name="notice_group_access_denied">Access to the group denied.</string>
</resources> </resources>