1package eu.siacs.conversations.ui.util;
  2
  3import android.content.Context;
  4import androidx.annotation.StringRes;
  5import com.google.common.collect.ImmutableMap;
  6import eu.siacs.conversations.R;
  7import eu.siacs.conversations.entities.MucOptions;
  8import java.util.Map;
  9
 10public class MucConfiguration {
 11
 12    public final @StringRes int title;
 13    public final String[] names;
 14    public final boolean[] values;
 15    public final Option[] options;
 16
 17    private MucConfiguration(
 18            @StringRes int title, String[] names, boolean[] values, Option[] options) {
 19        this.title = title;
 20        this.names = names;
 21        this.values = values;
 22        this.options = options;
 23    }
 24
 25    public static MucConfiguration get(Context context, boolean advanced, MucOptions mucOptions) {
 26        if (mucOptions.isPrivateAndNonAnonymous()) {
 27            String[] names =
 28                    new String[] {
 29                        context.getString(R.string.allow_participants_to_edit_subject),
 30                        context.getString(R.string.allow_participants_to_invite_others)
 31                    };
 32            boolean[] values =
 33                    new boolean[] {
 34                        mucOptions.participantsCanChangeSubject(), mucOptions.allowInvites()
 35                    };
 36            final Option[] options =
 37                    new Option[] {
 38                        new Option("muc#roomconfig_changesubject"),
 39                        new Option("muc#roomconfig_allowinvites")
 40                    };
 41            return new MucConfiguration(R.string.conference_options, names, values, options);
 42        } else {
 43            final String[] names;
 44            final boolean[] values;
 45            final Option[] options;
 46            if (advanced) {
 47                names =
 48                        new String[] {
 49                            context.getString(R.string.non_anonymous),
 50                            context.getString(R.string.allow_participants_to_edit_subject),
 51                            context.getString(R.string.moderated),
 52                            context.getString(R.string.allow_private_messages)
 53                        };
 54                values =
 55                        new boolean[] {
 56                            mucOptions.nonanonymous(),
 57                            mucOptions.participantsCanChangeSubject(),
 58                            mucOptions.moderated(),
 59                            mucOptions.allowPmRaw()
 60                        };
 61                options =
 62                        new Option[] {
 63                            new Option("muc#roomconfig_whois", "anyone", "moderators"),
 64                            new Option("muc#roomconfig_changesubject"),
 65                            new Option("muc#roomconfig_moderatedroom"),
 66                            new Option("muc#roomconfig_allowpm", "anyone", "moderators"),
 67                        };
 68            } else {
 69                names =
 70                        new String[] {
 71                            context.getString(R.string.non_anonymous),
 72                            context.getString(R.string.allow_participants_to_edit_subject),
 73                        };
 74                values =
 75                        new boolean[] {
 76                            mucOptions.nonanonymous(), mucOptions.participantsCanChangeSubject()
 77                        };
 78                options =
 79                        new Option[] {
 80                            new Option("muc#roomconfig_whois", "anyone", "moderators"),
 81                            new Option("muc#roomconfig_changesubject")
 82                        };
 83            }
 84            return new MucConfiguration(R.string.channel_options, names, values, options);
 85        }
 86    }
 87
 88    public static String describe(final Context context, final MucOptions mucOptions) {
 89        final StringBuilder builder = new StringBuilder();
 90        if (mucOptions.isPrivateAndNonAnonymous()) {
 91            if (mucOptions.participantsCanChangeSubject()) {
 92                builder.append(context.getString(R.string.anyone_can_edit_subject));
 93            } else {
 94                builder.append(context.getString(R.string.owners_can_edit_subject));
 95            }
 96            builder.append(' ');
 97            if (mucOptions.allowInvites()) {
 98                builder.append(context.getString(R.string.anyone_can_invite_others));
 99            } else {
100                builder.append(context.getString(R.string.owners_can_invite_others));
101            }
102        } else {
103            if (mucOptions.nonanonymous()) {
104                builder.append(context.getString(R.string.jabber_ids_are_visible_to_anyone));
105            } else {
106                builder.append(context.getString(R.string.jabber_ids_are_visible_to_admins));
107            }
108            builder.append(' ');
109            if (mucOptions.participantsCanChangeSubject()) {
110                builder.append(context.getString(R.string.anyone_can_edit_subject));
111            } else {
112                builder.append(context.getString(R.string.admins_can_edit_subject));
113            }
114        }
115        return builder.toString();
116    }
117
118    public Map<String, Object> toBundle(boolean[] values) {
119        final var builder = new ImmutableMap.Builder<String, Object>();
120        for (int i = 0; i < values.length; ++i) {
121            final Option option = options[i];
122            builder.put(option.name, option.values[values[i] ? 0 : 1]);
123        }
124        builder.put("muc#roomconfig_persistentroom", true);
125        return builder.buildOrThrow();
126    }
127
128    private static class Option {
129        public final String name;
130        public final Object[] values;
131
132        private Option(String name) {
133            this.name = name;
134            this.values = new Boolean[] {true, false};
135        }
136
137        private Option(String name, String on, String off) {
138            this.name = name;
139            this.values = new String[] {on, off};
140        }
141    }
142}