njomeau/zuluzulu

View on GitHub
app/src/main/java/ch/epfl/sweng/zuluzulu/adapters/UserRoleArrayAdapter.java

Summary

Maintainability
A
35 mins
Test Coverage
package ch.epfl.sweng.zuluzulu.adapters;

import android.app.Activity;
import android.content.Context;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.TextView;

import com.google.common.collect.Sets;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

import ch.epfl.sweng.zuluzulu.firebase.DatabaseFactory;
import ch.epfl.sweng.zuluzulu.OnFragmentInteractionListener;
import ch.epfl.sweng.zuluzulu.R;
import ch.epfl.sweng.zuluzulu.structure.user.UserRole;

public class UserRoleArrayAdapter extends ArrayAdapter<Map<String, Object>> {
    private static final int layout_resource_id = R.layout.card_user_role;

    private final Context context;
    private final List<Map<String, Object>> data;
    private final OnFragmentInteractionListener mListener;

    /**
     * Basic constructor of an AssociationArrayAdapter
     *
     * @param context Context of the Fragment
     * @param data    List of Associations to view
     */
    public UserRoleArrayAdapter(Context context, List<Map<String, Object>> data, OnFragmentInteractionListener mListener) {
        super(context, layout_resource_id, data);
        this.mListener = mListener;
        this.context = context;
        this.data = data;
    }

    /**
     * Return a View of an Association in a GroupView in a form of a card with the
     * Association's name, short description and icon image
     *
     * @param position    position in the GroupView
     * @param convertView View where to put the Association's view
     * @param parent      the ListView to put the view
     * @return the Association card view
     */
    @NonNull
    @Override
    public View getView(int position, View convertView, @NonNull ViewGroup parent) {
        View user_view = convertView;
        UserRoleHolder holder = user_view == null ? new UserRoleHolder() : (UserRoleHolder) user_view.getTag();

        if (user_view == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            user_view = inflater.inflate(layout_resource_id, parent, false);
            holder.sciper = user_view.findViewById(R.id.card_user_role_sciper);
            holder.adminCheckbox = user_view.findViewById(R.id.card_user_role_is_admin);
            user_view.setTag(holder);
        }

        final Map<String, Object> map = data.get(position);
        holder.sciper.setText((String) map.get("sciper"));

        Set<String> roles = Sets.newHashSet((List<String>) Objects.requireNonNull(map.get("roles")));
        if (roles.contains(UserRole.ADMIN.toString()))
            holder.adminCheckbox.setChecked(true);

        holder.adminCheckbox.setOnClickListener(v -> {
            if (holder.adminCheckbox.isChecked()) {
                roles.add("ADMIN");
                DatabaseFactory.getDependency().updateUserRole((String) map.get("sciper"), new ArrayList<>(roles));
            } else {
                roles.remove("ADMIN");
                DatabaseFactory.getDependency().updateUserRole((String) map.get("sciper"), new ArrayList<>(roles));
            }
            holder.adminCheckbox.clearFocus();
        });

        return user_view;
    }


    /**
     * Static class to easily create an Association's specific View
     */
    private class UserRoleHolder {
        TextView sciper;
        CheckBox adminCheckbox;
    }
}