Add some polish to the groups V2 manager UI.
This commit is contained in:
parent
88a40be901
commit
b191341c57
25 changed files with 445 additions and 220 deletions
|
@ -421,9 +421,8 @@
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
|
||||||
|
|
||||||
<activity android:name=".profiles.edit.EditProfileActivity"
|
<activity android:name=".profiles.edit.EditProfileActivity"
|
||||||
android:theme="@style/TextSecure.LightRegistrationTheme"
|
android:theme="@style/TextSecure.LightRegistrationTheme"
|
||||||
android:windowSoftInputMode="stateVisible"
|
android:windowSoftInputMode="adjustResize" />
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
|
|
||||||
|
|
||||||
<activity android:name=".lock.v2.CreateKbsPinActivity"
|
<activity android:name=".lock.v2.CreateKbsPinActivity"
|
||||||
android:theme="@style/TextSecure.LightRegistrationTheme"
|
android:theme="@style/TextSecure.LightRegistrationTheme"
|
||||||
|
|
|
@ -10,6 +10,7 @@ import android.widget.TextView;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.recyclerview.widget.DiffUtil;
|
import androidx.recyclerview.widget.DiffUtil;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.R;
|
import org.thoughtcrime.securesms.R;
|
||||||
import org.thoughtcrime.securesms.components.AvatarImageView;
|
import org.thoughtcrime.securesms.components.AvatarImageView;
|
||||||
|
@ -137,13 +138,17 @@ final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberL
|
||||||
}
|
}
|
||||||
|
|
||||||
void bindRecipientClick(@NonNull Recipient recipient) {
|
void bindRecipientClick(@NonNull Recipient recipient) {
|
||||||
View.OnClickListener onClickListener = v -> {
|
if (recipient.equals(Recipient.self())) {
|
||||||
if (recipientClickListener != null) {
|
this.itemView.setEnabled(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.itemView.setEnabled(true);
|
||||||
|
this.itemView.setOnClickListener(v -> {
|
||||||
|
if (recipientClickListener != null && getAdapterPosition() != RecyclerView.NO_POSITION) {
|
||||||
recipientClickListener.onClick(recipient);
|
recipientClickListener.onClick(recipient);
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
this.avatar.setOnClickListener(onClickListener);
|
|
||||||
this.recipient.setOnClickListener(onClickListener);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void bind(@NonNull GroupMemberEntry memberEntry) {
|
void bind(@NonNull GroupMemberEntry memberEntry) {
|
||||||
|
@ -151,8 +156,7 @@ final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberL
|
||||||
admin.setVisibility(View.GONE);
|
admin.setVisibility(View.GONE);
|
||||||
hideMenu();
|
hideMenu();
|
||||||
|
|
||||||
avatar.setOnClickListener(null);
|
itemView.setOnClickListener(null);
|
||||||
recipient.setOnClickListener(null);
|
|
||||||
|
|
||||||
memberEntry.getBusy().observe(this, busy -> {
|
memberEntry.getBusy().observe(this, busy -> {
|
||||||
busyProgress.setVisibility(busy ? View.VISIBLE : View.GONE);
|
busyProgress.setVisibility(busy ? View.VISIBLE : View.GONE);
|
||||||
|
|
|
@ -34,7 +34,10 @@ public final class GroupMemberListView extends RecyclerView {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initialize(@NonNull Context context, @Nullable AttributeSet attrs) {
|
private void initialize(@NonNull Context context, @Nullable AttributeSet attrs) {
|
||||||
setHasFixedSize(true);
|
if (maxHeight > 0) {
|
||||||
|
setHasFixedSize(true);
|
||||||
|
}
|
||||||
|
|
||||||
setLayoutManager(new LinearLayoutManager(context));
|
setLayoutManager(new LinearLayoutManager(context));
|
||||||
setAdapter(membersAdapter);
|
setAdapter(membersAdapter);
|
||||||
|
|
||||||
|
|
|
@ -10,14 +10,12 @@ import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.CompoundButton;
|
import android.widget.CompoundButton;
|
||||||
import android.widget.Switch;
|
import android.widget.Switch;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.constraintlayout.widget.Group;
|
|
||||||
import androidx.core.view.ViewCompat;
|
import androidx.core.view.ViewCompat;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
@ -31,6 +29,8 @@ import org.thoughtcrime.securesms.R;
|
||||||
import org.thoughtcrime.securesms.components.AvatarImageView;
|
import org.thoughtcrime.securesms.components.AvatarImageView;
|
||||||
import org.thoughtcrime.securesms.components.ThreadPhotoRailView;
|
import org.thoughtcrime.securesms.components.ThreadPhotoRailView;
|
||||||
import org.thoughtcrime.securesms.contacts.ContactsCursorLoader;
|
import org.thoughtcrime.securesms.contacts.ContactsCursorLoader;
|
||||||
|
import org.thoughtcrime.securesms.contacts.avatars.FallbackContactPhoto;
|
||||||
|
import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto;
|
||||||
import org.thoughtcrime.securesms.groups.GroupId;
|
import org.thoughtcrime.securesms.groups.GroupId;
|
||||||
import org.thoughtcrime.securesms.groups.ui.GroupMemberListView;
|
import org.thoughtcrime.securesms.groups.ui.GroupMemberListView;
|
||||||
import org.thoughtcrime.securesms.groups.ui.LeaveGroupDialog;
|
import org.thoughtcrime.securesms.groups.ui.LeaveGroupDialog;
|
||||||
|
@ -42,6 +42,7 @@ import org.thoughtcrime.securesms.mediaoverview.MediaOverviewActivity;
|
||||||
import org.thoughtcrime.securesms.mms.GlideApp;
|
import org.thoughtcrime.securesms.mms.GlideApp;
|
||||||
import org.thoughtcrime.securesms.notifications.NotificationChannels;
|
import org.thoughtcrime.securesms.notifications.NotificationChannels;
|
||||||
import org.thoughtcrime.securesms.profiles.edit.EditProfileActivity;
|
import org.thoughtcrime.securesms.profiles.edit.EditProfileActivity;
|
||||||
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||||
import org.thoughtcrime.securesms.recipients.ui.bottomsheet.RecipientBottomSheetDialogFragment;
|
import org.thoughtcrime.securesms.recipients.ui.bottomsheet.RecipientBottomSheetDialogFragment;
|
||||||
import org.thoughtcrime.securesms.util.DateUtils;
|
import org.thoughtcrime.securesms.util.DateUtils;
|
||||||
|
@ -71,16 +72,28 @@ public class ManageGroupFragment extends Fragment {
|
||||||
private View pendingMembersCard;
|
private View pendingMembersCard;
|
||||||
private ManageGroupViewModel.CursorFactory cursorFactory;
|
private ManageGroupViewModel.CursorFactory cursorFactory;
|
||||||
private View photoRailLabel;
|
private View photoRailLabel;
|
||||||
private Button editGroupAccessValue;
|
private View editGroupAccessRow;
|
||||||
private Button editGroupMembershipValue;
|
private TextView editGroupAccessValue;
|
||||||
private Button disappearingMessages;
|
private View editGroupMembershipRow;
|
||||||
private Button blockGroup;
|
private TextView editGroupMembershipValue;
|
||||||
private Button leaveGroup;
|
private View disappearingMessagesRow;
|
||||||
private Button addMembers;
|
private TextView disappearingMessages;
|
||||||
|
private TextView blockGroup;
|
||||||
|
private TextView leaveGroup;
|
||||||
|
private TextView addMembers;
|
||||||
private Switch muteNotificationsSwitch;
|
private Switch muteNotificationsSwitch;
|
||||||
|
private View muteNotificationsRow;
|
||||||
private TextView muteNotificationsUntilLabel;
|
private TextView muteNotificationsUntilLabel;
|
||||||
private TextView customNotificationsButton;
|
private TextView customNotificationsButton;
|
||||||
private Group customNotificationsControls;
|
private View customNotificationsRow;
|
||||||
|
private View toggleAllMembers;
|
||||||
|
|
||||||
|
private final Recipient.FallbackPhotoProvider fallbackPhotoProvider = new Recipient.FallbackPhotoProvider() {
|
||||||
|
@Override
|
||||||
|
public @NonNull FallbackContactPhoto getPhotoForGroup() {
|
||||||
|
return new ResourceContactPhoto(R.drawable.ic_group_80);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
static ManageGroupFragment newInstance(@NonNull String groupId) {
|
static ManageGroupFragment newInstance(@NonNull String groupId) {
|
||||||
ManageGroupFragment fragment = new ManageGroupFragment();
|
ManageGroupFragment fragment = new ManageGroupFragment();
|
||||||
|
@ -116,16 +129,21 @@ public class ManageGroupFragment extends Fragment {
|
||||||
accessControlCard = view.findViewById(R.id.group_access_control_card);
|
accessControlCard = view.findViewById(R.id.group_access_control_card);
|
||||||
pendingMembersCard = view.findViewById(R.id.group_pending_card);
|
pendingMembersCard = view.findViewById(R.id.group_pending_card);
|
||||||
photoRailLabel = view.findViewById(R.id.rail_label);
|
photoRailLabel = view.findViewById(R.id.rail_label);
|
||||||
|
editGroupAccessRow = view.findViewById(R.id.edit_group_access_row);
|
||||||
editGroupAccessValue = view.findViewById(R.id.edit_group_access_value);
|
editGroupAccessValue = view.findViewById(R.id.edit_group_access_value);
|
||||||
|
editGroupMembershipRow = view.findViewById(R.id.edit_group_membership_row);
|
||||||
editGroupMembershipValue = view.findViewById(R.id.edit_group_membership_value);
|
editGroupMembershipValue = view.findViewById(R.id.edit_group_membership_value);
|
||||||
|
disappearingMessagesRow = view.findViewById(R.id.disappearing_messages_row);
|
||||||
disappearingMessages = view.findViewById(R.id.disappearing_messages);
|
disappearingMessages = view.findViewById(R.id.disappearing_messages);
|
||||||
blockGroup = view.findViewById(R.id.blockGroup);
|
blockGroup = view.findViewById(R.id.blockGroup);
|
||||||
leaveGroup = view.findViewById(R.id.leaveGroup);
|
leaveGroup = view.findViewById(R.id.leaveGroup);
|
||||||
addMembers = view.findViewById(R.id.add_members);
|
addMembers = view.findViewById(R.id.add_members);
|
||||||
muteNotificationsUntilLabel = view.findViewById(R.id.group_mute_notifications_until);
|
muteNotificationsUntilLabel = view.findViewById(R.id.group_mute_notifications_until);
|
||||||
muteNotificationsSwitch = view.findViewById(R.id.group_mute_notifications_switch);
|
muteNotificationsSwitch = view.findViewById(R.id.group_mute_notifications_switch);
|
||||||
|
muteNotificationsRow = view.findViewById(R.id.group_mute_notifications_row);
|
||||||
customNotificationsButton = view.findViewById(R.id.group_custom_notifications_button);
|
customNotificationsButton = view.findViewById(R.id.group_custom_notifications_button);
|
||||||
customNotificationsControls = view.findViewById(R.id.group_custom_notifications_controls);
|
customNotificationsRow = view.findViewById(R.id.group_custom_notifications_row);
|
||||||
|
toggleAllMembers = view.findViewById(R.id.toggle_all_members);
|
||||||
|
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
@ -142,6 +160,15 @@ public class ManageGroupFragment extends Fragment {
|
||||||
|
|
||||||
viewModel.getMembers().observe(getViewLifecycleOwner(), members -> groupMemberList.setMembers(members));
|
viewModel.getMembers().observe(getViewLifecycleOwner(), members -> groupMemberList.setMembers(members));
|
||||||
|
|
||||||
|
viewModel.getCanCollapseMemberList().observe(getViewLifecycleOwner(), canCollapseMemberList -> {
|
||||||
|
if (canCollapseMemberList) {
|
||||||
|
toggleAllMembers.setVisibility(View.VISIBLE);
|
||||||
|
toggleAllMembers.setOnClickListener(v -> viewModel.revealCollapsedMembers());
|
||||||
|
} else {
|
||||||
|
toggleAllMembers.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
viewModel.getPendingMemberCount().observe(getViewLifecycleOwner(),
|
viewModel.getPendingMemberCount().observe(getViewLifecycleOwner(),
|
||||||
members -> {
|
members -> {
|
||||||
if (members > 0) {
|
if (members > 0) {
|
||||||
|
@ -156,6 +183,8 @@ public class ManageGroupFragment extends Fragment {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
avatar.setFallbackPhotoProvider(fallbackPhotoProvider);
|
||||||
|
|
||||||
viewModel.getTitle().observe(getViewLifecycleOwner(), groupTitle::setText);
|
viewModel.getTitle().observe(getViewLifecycleOwner(), groupTitle::setText);
|
||||||
viewModel.getMemberCountSummary().observe(getViewLifecycleOwner(), memberCountUnderAvatar::setText);
|
viewModel.getMemberCountSummary().observe(getViewLifecycleOwner(), memberCountUnderAvatar::setText);
|
||||||
viewModel.getFullMemberCountSummary().observe(getViewLifecycleOwner(), memberCountAboveList::setText);
|
viewModel.getFullMemberCountSummary().observe(getViewLifecycleOwner(), memberCountAboveList::setText);
|
||||||
|
@ -173,7 +202,6 @@ public class ManageGroupFragment extends Fragment {
|
||||||
ViewCompat.getLayoutDirection(threadPhotoRailView) == ViewCompat.LAYOUT_DIRECTION_LTR),
|
ViewCompat.getLayoutDirection(threadPhotoRailView) == ViewCompat.LAYOUT_DIRECTION_LTR),
|
||||||
RETURN_FROM_MEDIA));
|
RETURN_FROM_MEDIA));
|
||||||
|
|
||||||
accessControlCard.setVisibility(vs.getGroupRecipient().requireGroupId().isV2() ? View.VISIBLE : View.GONE);
|
|
||||||
pendingMembersCard.setVisibility(vs.getGroupRecipient().requireGroupId().isV2() ? View.VISIBLE : View.GONE);
|
pendingMembersCard.setVisibility(vs.getGroupRecipient().requireGroupId().isV2() ? View.VISIBLE : View.GONE);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -185,7 +213,7 @@ public class ManageGroupFragment extends Fragment {
|
||||||
|
|
||||||
viewModel.getDisappearingMessageTimer().observe(getViewLifecycleOwner(), string -> disappearingMessages.setText(string));
|
viewModel.getDisappearingMessageTimer().observe(getViewLifecycleOwner(), string -> disappearingMessages.setText(string));
|
||||||
|
|
||||||
disappearingMessages.setOnClickListener(v -> viewModel.handleExpirationSelection());
|
disappearingMessagesRow.setOnClickListener(v -> viewModel.handleExpirationSelection());
|
||||||
blockGroup.setOnClickListener(v -> viewModel.blockAndLeave(requireActivity()));
|
blockGroup.setOnClickListener(v -> viewModel.blockAndLeave(requireActivity()));
|
||||||
|
|
||||||
addMembers.setOnClickListener(v -> {
|
addMembers.setOnClickListener(v -> {
|
||||||
|
@ -197,7 +225,7 @@ public class ManageGroupFragment extends Fragment {
|
||||||
viewModel.getMembershipRights().observe(getViewLifecycleOwner(), r -> {
|
viewModel.getMembershipRights().observe(getViewLifecycleOwner(), r -> {
|
||||||
if (r != null) {
|
if (r != null) {
|
||||||
editGroupMembershipValue.setText(r.getString());
|
editGroupMembershipValue.setText(r.getString());
|
||||||
editGroupMembershipValue.setOnClickListener(v -> new GroupRightsDialog(context, GroupRightsDialog.Type.MEMBERSHIP, r, (from, to) -> viewModel.applyMembershipRightsChange(to)).show());
|
editGroupMembershipRow.setOnClickListener(v -> new GroupRightsDialog(context, GroupRightsDialog.Type.MEMBERSHIP, r, (from, to) -> viewModel.applyMembershipRightsChange(to)).show());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -205,13 +233,16 @@ public class ManageGroupFragment extends Fragment {
|
||||||
viewModel.getEditGroupAttributesRights().observe(getViewLifecycleOwner(), r -> {
|
viewModel.getEditGroupAttributesRights().observe(getViewLifecycleOwner(), r -> {
|
||||||
if (r != null) {
|
if (r != null) {
|
||||||
editGroupAccessValue.setText(r.getString());
|
editGroupAccessValue.setText(r.getString());
|
||||||
editGroupAccessValue.setOnClickListener(v -> new GroupRightsDialog(context, GroupRightsDialog.Type.ATTRIBUTES, r, (from, to) -> viewModel.applyAttributesRightsChange(to)).show());
|
editGroupAccessRow.setOnClickListener(v -> new GroupRightsDialog(context, GroupRightsDialog.Type.ATTRIBUTES, r, (from, to) -> viewModel.applyAttributesRightsChange(to)).show());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
viewModel.getIsAdmin().observe(getViewLifecycleOwner(), admin -> {
|
viewModel.getIsAdmin().observe(getViewLifecycleOwner(), admin -> {
|
||||||
|
accessControlCard.setVisibility(admin ? View.VISIBLE : View.GONE);
|
||||||
|
editGroupMembershipRow.setEnabled(admin);
|
||||||
editGroupMembershipValue.setEnabled(admin);
|
editGroupMembershipValue.setEnabled(admin);
|
||||||
|
editGroupAccessRow.setEnabled(admin);
|
||||||
editGroupAccessValue.setEnabled(admin);
|
editGroupAccessValue.setEnabled(admin);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -228,6 +259,12 @@ public class ManageGroupFragment extends Fragment {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
muteNotificationsRow.setOnClickListener(v -> {
|
||||||
|
if (muteNotificationsSwitch.isEnabled()) {
|
||||||
|
muteNotificationsSwitch.toggle();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
viewModel.getMuteState().observe(getViewLifecycleOwner(), muteState -> {
|
viewModel.getMuteState().observe(getViewLifecycleOwner(), muteState -> {
|
||||||
if (muteNotificationsSwitch.isChecked() != muteState.isMuted()) {
|
if (muteNotificationsSwitch.isChecked() != muteState.isMuted()) {
|
||||||
muteNotificationsSwitch.setOnCheckedChangeListener(null);
|
muteNotificationsSwitch.setOnCheckedChangeListener(null);
|
||||||
|
@ -247,10 +284,10 @@ public class ManageGroupFragment extends Fragment {
|
||||||
});
|
});
|
||||||
|
|
||||||
if (NotificationChannels.supported()) {
|
if (NotificationChannels.supported()) {
|
||||||
customNotificationsControls.setVisibility(View.VISIBLE);
|
customNotificationsRow.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
customNotificationsButton.setOnClickListener(v -> CustomNotificationsDialogFragment.create(groupId)
|
customNotificationsRow.setOnClickListener(v -> CustomNotificationsDialogFragment.create(groupId)
|
||||||
.show(requireFragmentManager(), "CUSTOM_NOTIFICATIONS"));
|
.show(requireFragmentManager(), "CUSTOM_NOTIFICATIONS"));
|
||||||
|
|
||||||
//noinspection CodeBlock2Expr
|
//noinspection CodeBlock2Expr
|
||||||
viewModel.hasCustomNotifications().observe(getViewLifecycleOwner(), hasCustomNotifications -> {
|
viewModel.hasCustomNotifications().observe(getViewLifecycleOwner(), hasCustomNotifications -> {
|
||||||
|
@ -258,7 +295,7 @@ public class ManageGroupFragment extends Fragment {
|
||||||
: R.string.ManageGroupActivity_off);
|
: R.string.ManageGroupActivity_off);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
customNotificationsControls.setVisibility(View.GONE);
|
customNotificationsRow.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -308,7 +345,7 @@ public class ManageGroupFragment extends Fragment {
|
||||||
super.onActivityResult(requestCode, resultCode, data);
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
if (requestCode == RETURN_FROM_MEDIA) {
|
if (requestCode == RETURN_FROM_MEDIA) {
|
||||||
applyMediaCursorFactory();
|
applyMediaCursorFactory();
|
||||||
} else if (requestCode == PICK_CONTACT) {
|
} else if (requestCode == PICK_CONTACT && data != null) {
|
||||||
List<RecipientId> selected = data.getParcelableArrayListExtra(PushContactSelectionActivity.KEY_SELECTED_RECIPIENTS);
|
List<RecipientId> selected = data.getParcelableArrayListExtra(PushContactSelectionActivity.KEY_SELECTED_RECIPIENTS);
|
||||||
viewModel.onAddMembers(selected);
|
viewModel.onAddMembers(selected);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package org.thoughtcrime.securesms.groups.ui.managegroup;
|
package org.thoughtcrime.securesms.groups.ui.managegroup;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
@ -15,11 +14,7 @@ import androidx.lifecycle.ViewModel;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.BlockUnblockDialog;
|
import org.thoughtcrime.securesms.BlockUnblockDialog;
|
||||||
import org.thoughtcrime.securesms.ContactSelectionListFragment;
|
|
||||||
import org.thoughtcrime.securesms.ExpirationDialog;
|
import org.thoughtcrime.securesms.ExpirationDialog;
|
||||||
import org.thoughtcrime.securesms.GroupCreateActivity;
|
|
||||||
import org.thoughtcrime.securesms.PushContactSelectionActivity;
|
|
||||||
import org.thoughtcrime.securesms.contacts.ContactsCursorLoader;
|
|
||||||
import org.thoughtcrime.securesms.database.MediaDatabase;
|
import org.thoughtcrime.securesms.database.MediaDatabase;
|
||||||
import org.thoughtcrime.securesms.database.loaders.MediaLoader;
|
import org.thoughtcrime.securesms.database.loaders.MediaLoader;
|
||||||
import org.thoughtcrime.securesms.database.loaders.ThreadMediaLoader;
|
import org.thoughtcrime.securesms.database.loaders.ThreadMediaLoader;
|
||||||
|
@ -30,13 +25,17 @@ import org.thoughtcrime.securesms.groups.ui.GroupMemberEntry;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientUtil;
|
import org.thoughtcrime.securesms.recipients.RecipientUtil;
|
||||||
|
import org.thoughtcrime.securesms.util.DefaultValueLiveData;
|
||||||
import org.thoughtcrime.securesms.util.ExpirationUtil;
|
import org.thoughtcrime.securesms.util.ExpirationUtil;
|
||||||
import org.thoughtcrime.securesms.util.Util;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
|
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class ManageGroupViewModel extends ViewModel {
|
public class ManageGroupViewModel extends ViewModel {
|
||||||
|
|
||||||
|
private static final int MAX_COLLAPSED_MEMBERS = 5;
|
||||||
|
|
||||||
private final Context context;
|
private final Context context;
|
||||||
private final ManageGroupRepository manageGroupRepository;
|
private final ManageGroupRepository manageGroupRepository;
|
||||||
private final LiveData<String> title;
|
private final LiveData<String> title;
|
||||||
|
@ -54,6 +53,8 @@ public class ManageGroupViewModel extends ViewModel {
|
||||||
private final MutableLiveData<GroupViewState> groupViewState = new MutableLiveData<>(null);
|
private final MutableLiveData<GroupViewState> groupViewState = new MutableLiveData<>(null);
|
||||||
private final LiveData<MuteState> muteState;
|
private final LiveData<MuteState> muteState;
|
||||||
private final LiveData<Boolean> hasCustomNotifications;
|
private final LiveData<Boolean> hasCustomNotifications;
|
||||||
|
private final LiveData<Boolean> canCollapseMemberList;
|
||||||
|
private final DefaultValueLiveData<CollapseState> memberListCollapseState = new DefaultValueLiveData<>(CollapseState.COLLAPSED);
|
||||||
|
|
||||||
private ManageGroupViewModel(@NonNull Context context, @NonNull ManageGroupRepository manageGroupRepository) {
|
private ManageGroupViewModel(@NonNull Context context, @NonNull ManageGroupRepository manageGroupRepository) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
|
@ -65,7 +66,12 @@ public class ManageGroupViewModel extends ViewModel {
|
||||||
|
|
||||||
this.title = liveGroup.getTitle();
|
this.title = liveGroup.getTitle();
|
||||||
this.isAdmin = liveGroup.isSelfAdmin();
|
this.isAdmin = liveGroup.isSelfAdmin();
|
||||||
this.members = liveGroup.getFullMembers();
|
this.canCollapseMemberList = LiveDataUtil.combineLatest(memberListCollapseState,
|
||||||
|
Transformations.map(liveGroup.getFullMembers(), m -> m.size() > MAX_COLLAPSED_MEMBERS),
|
||||||
|
(state, hasEnoughMembers) -> state != CollapseState.OPEN && hasEnoughMembers);
|
||||||
|
this.members = LiveDataUtil.combineLatest(liveGroup.getFullMembers(),
|
||||||
|
memberListCollapseState,
|
||||||
|
this::filterMemberList);
|
||||||
this.pendingMemberCount = liveGroup.getPendingMemberCount();
|
this.pendingMemberCount = liveGroup.getPendingMemberCount();
|
||||||
this.memberCountSummary = liveGroup.getMembershipCountDescription(context.getResources());
|
this.memberCountSummary = liveGroup.getMembershipCountDescription(context.getResources());
|
||||||
this.fullMemberCountSummary = liveGroup.getFullMembershipCountDescription(context.getResources());
|
this.fullMemberCountSummary = liveGroup.getFullMembershipCountDescription(context.getResources());
|
||||||
|
@ -148,6 +154,10 @@ public class ManageGroupViewModel extends ViewModel {
|
||||||
return hasCustomNotifications;
|
return hasCustomNotifications;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LiveData<Boolean> getCanCollapseMemberList() {
|
||||||
|
return canCollapseMemberList;
|
||||||
|
}
|
||||||
|
|
||||||
void handleExpirationSelection() {
|
void handleExpirationSelection() {
|
||||||
manageGroupRepository.getRecipient(groupRecipient ->
|
manageGroupRepository.getRecipient(groupRecipient ->
|
||||||
ExpirationDialog.show(context,
|
ExpirationDialog.show(context,
|
||||||
|
@ -180,6 +190,20 @@ public class ManageGroupViewModel extends ViewModel {
|
||||||
manageGroupRepository.setMuteUntil(0);
|
manageGroupRepository.setMuteUntil(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void revealCollapsedMembers() {
|
||||||
|
memberListCollapseState.setValue(CollapseState.OPEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
private @NonNull List<GroupMemberEntry.FullMember> filterMemberList(@NonNull List<GroupMemberEntry.FullMember> members,
|
||||||
|
@NonNull CollapseState collapseState)
|
||||||
|
{
|
||||||
|
if (collapseState == CollapseState.COLLAPSED && members.size() > MAX_COLLAPSED_MEMBERS) {
|
||||||
|
return members.subList(0, MAX_COLLAPSED_MEMBERS);
|
||||||
|
} else {
|
||||||
|
return members;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
private void showErrorToast(@NonNull ManageGroupRepository.FailureReason e) {
|
private void showErrorToast(@NonNull ManageGroupRepository.FailureReason e) {
|
||||||
Util.runOnMain(() -> Toast.makeText(context, e.getToastMessage(), Toast.LENGTH_LONG).show());
|
Util.runOnMain(() -> Toast.makeText(context, e.getToastMessage(), Toast.LENGTH_LONG).show());
|
||||||
|
@ -230,6 +254,11 @@ public class ManageGroupViewModel extends ViewModel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private enum CollapseState {
|
||||||
|
OPEN,
|
||||||
|
COLLAPSED
|
||||||
|
}
|
||||||
|
|
||||||
interface CursorFactory {
|
interface CursorFactory {
|
||||||
Cursor create();
|
Cursor create();
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,16 +9,14 @@ import androidx.annotation.VisibleForTesting;
|
||||||
|
|
||||||
import com.annimon.stream.Stream;
|
import com.annimon.stream.Stream;
|
||||||
|
|
||||||
|
import org.thoughtcrime.securesms.util.StringUtil;
|
||||||
import org.thoughtcrime.securesms.util.cjkv.CJKVUtil;
|
import org.thoughtcrime.securesms.util.cjkv.CJKVUtil;
|
||||||
import org.whispersystems.signalservice.api.crypto.ProfileCipher;
|
import org.whispersystems.signalservice.api.crypto.ProfileCipher;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
|
|
||||||
public final class ProfileName implements Parcelable {
|
public final class ProfileName implements Parcelable {
|
||||||
|
|
||||||
public static final ProfileName EMPTY = new ProfileName("", "");
|
public static final ProfileName EMPTY = new ProfileName("", "");
|
||||||
|
public static final int MAX_PART_LENGTH = (ProfileCipher.NAME_PADDED_LENGTH - 1) / 2;
|
||||||
private static final int MAX_PART_LENGTH = (ProfileCipher.NAME_PADDED_LENGTH - 1) / 2;
|
|
||||||
|
|
||||||
private final String givenName;
|
private final String givenName;
|
||||||
private final String familyName;
|
private final String familyName;
|
||||||
|
@ -94,31 +92,12 @@ public final class ProfileName implements Parcelable {
|
||||||
givenName = givenName == null ? "" : givenName;
|
givenName = givenName == null ? "" : givenName;
|
||||||
familyName = familyName == null ? "" : familyName;
|
familyName = familyName == null ? "" : familyName;
|
||||||
|
|
||||||
givenName = trimToFit(givenName .trim());
|
givenName = StringUtil.trimToFit(givenName.trim(), ProfileName.MAX_PART_LENGTH);
|
||||||
familyName = trimToFit(familyName.trim());
|
familyName = StringUtil.trimToFit(familyName.trim(), ProfileName.MAX_PART_LENGTH);
|
||||||
|
|
||||||
return new ProfileName(givenName, familyName);
|
return new ProfileName(givenName, familyName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Trims a name string to fit into the byte length requirement.
|
|
||||||
*/
|
|
||||||
public static @NonNull String trimToFit(@Nullable String name) {
|
|
||||||
if (name == null) return "";
|
|
||||||
|
|
||||||
// At least one byte per char, so shorten string to reduce loop
|
|
||||||
if (name.length() > ProfileName.MAX_PART_LENGTH) {
|
|
||||||
name = name.substring(0, ProfileName.MAX_PART_LENGTH);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove one char at a time until fits in byte allowance
|
|
||||||
while (name.getBytes(StandardCharsets.UTF_8).length > ProfileName.MAX_PART_LENGTH) {
|
|
||||||
name = name.substring(0, name.length() - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static @NonNull String getJoinedName(@NonNull String givenName, @NonNull String familyName) {
|
private static @NonNull String getJoinedName(@NonNull String givenName, @NonNull String familyName) {
|
||||||
if (givenName.isEmpty() && familyName.isEmpty()) return "";
|
if (givenName.isEmpty() && familyName.isEmpty()) return "";
|
||||||
else if (givenName.isEmpty()) return familyName;
|
else if (givenName.isEmpty()) return familyName;
|
||||||
|
|
|
@ -46,6 +46,7 @@ import org.thoughtcrime.securesms.profiles.ProfileName;
|
||||||
import org.thoughtcrime.securesms.providers.BlobProvider;
|
import org.thoughtcrime.securesms.providers.BlobProvider;
|
||||||
import org.thoughtcrime.securesms.registration.RegistrationUtil;
|
import org.thoughtcrime.securesms.registration.RegistrationUtil;
|
||||||
import org.thoughtcrime.securesms.util.FeatureFlags;
|
import org.thoughtcrime.securesms.util.FeatureFlags;
|
||||||
|
import org.thoughtcrime.securesms.util.StringUtil;
|
||||||
import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
|
import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
|
||||||
import org.thoughtcrime.securesms.util.text.AfterTextChanged;
|
import org.thoughtcrime.securesms.util.text.AfterTextChanged;
|
||||||
import org.whispersystems.libsignal.util.guava.Optional;
|
import org.whispersystems.libsignal.util.guava.Optional;
|
||||||
|
@ -66,6 +67,7 @@ public class EditProfileFragment extends Fragment {
|
||||||
private static final String TAG = Log.tag(EditProfileFragment.class);
|
private static final String TAG = Log.tag(EditProfileFragment.class);
|
||||||
private static final String AVATAR_STATE = "avatar";
|
private static final String AVATAR_STATE = "avatar";
|
||||||
private static final short REQUEST_CODE_SELECT_AVATAR = 31726;
|
private static final short REQUEST_CODE_SELECT_AVATAR = 31726;
|
||||||
|
private static final int MAX_GROUP_NAME_LENGTH = 32;
|
||||||
|
|
||||||
private Toolbar toolbar;
|
private Toolbar toolbar;
|
||||||
private View title;
|
private View title;
|
||||||
|
@ -130,7 +132,9 @@ public class EditProfileFragment extends Fragment {
|
||||||
initializeProfileName();
|
initializeProfileName();
|
||||||
initializeUsername();
|
initializeUsername();
|
||||||
|
|
||||||
requireActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
|
if (groupId == null) {
|
||||||
|
requireActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -234,7 +238,7 @@ public class EditProfileFragment extends Fragment {
|
||||||
.execute());
|
.execute());
|
||||||
|
|
||||||
this.givenName .addTextChangedListener(new AfterTextChanged(s -> {
|
this.givenName .addTextChangedListener(new AfterTextChanged(s -> {
|
||||||
trimInPlace(s);
|
trimInPlace(s, isEditingGroup);
|
||||||
viewModel.setGivenName(s.toString());
|
viewModel.setGivenName(s.toString());
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
@ -248,7 +252,7 @@ public class EditProfileFragment extends Fragment {
|
||||||
view.<ImageView>findViewById(R.id.avatar_placeholder).setImageResource(R.drawable.ic_group_outline_40);
|
view.<ImageView>findViewById(R.id.avatar_placeholder).setImageResource(R.drawable.ic_group_outline_40);
|
||||||
} else {
|
} else {
|
||||||
this.familyName.addTextChangedListener(new AfterTextChanged(s -> {
|
this.familyName.addTextChangedListener(new AfterTextChanged(s -> {
|
||||||
trimInPlace(s);
|
trimInPlace(s, false);
|
||||||
viewModel.setFamilyName(s.toString());
|
viewModel.setFamilyName(s.toString());
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
@ -389,8 +393,10 @@ public class EditProfileFragment extends Fragment {
|
||||||
animation.start();
|
animation.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void trimInPlace(Editable s) {
|
private static void trimInPlace(Editable s, boolean isGroup) {
|
||||||
int trimmedLength = ProfileName.trimToFit(s.toString()).length();
|
int trimmedLength = isGroup ? StringUtil.trimToFit(s.toString(), MAX_GROUP_NAME_LENGTH).length()
|
||||||
|
: StringUtil.trimToFit(s.toString(), ProfileName.MAX_PART_LENGTH).length();
|
||||||
|
|
||||||
if (s.length() > trimmedLength) {
|
if (s.length() > trimmedLength) {
|
||||||
s.delete(trimmedLength, s.length());
|
s.delete(trimmedLength, s.length());
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
package org.thoughtcrime.securesms.util;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
public final class StringUtil {
|
||||||
|
|
||||||
|
private StringUtil() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trims a name string to fit into the byte length requirement.
|
||||||
|
*/
|
||||||
|
public static @NonNull String trimToFit(@Nullable String name, int maxLength) {
|
||||||
|
if (name == null) return "";
|
||||||
|
|
||||||
|
// At least one byte per char, so shorten string to reduce loop
|
||||||
|
if (name.length() > maxLength) {
|
||||||
|
name = name.substring(0, maxLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove one char at a time until fits in byte allowance
|
||||||
|
while (name.getBytes(StandardCharsets.UTF_8).length > maxLength) {
|
||||||
|
name = name.substring(0, name.length() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
9
app/src/main/res/drawable/ic_add_members_20.xml
Normal file
9
app/src/main/res/drawable/ic_add_members_20.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="20dp"
|
||||||
|
android:height="20dp"
|
||||||
|
android:viewportWidth="20"
|
||||||
|
android:viewportHeight="20">
|
||||||
|
<path
|
||||||
|
android:pathData="M16,9.3H10.8V4H9.3V9.3H4V10.8H9.3V16H10.8V10.8H16V9.3Z"
|
||||||
|
android:fillColor="@color/core_ultramarine"/>
|
||||||
|
</vector>
|
|
@ -7,7 +7,7 @@
|
||||||
</item>
|
</item>
|
||||||
<item
|
<item
|
||||||
android:bottom="12dp"
|
android:bottom="12dp"
|
||||||
android:drawable="@drawable/ic_plus_24_ultramarine"
|
android:drawable="@drawable/ic_add_members_20"
|
||||||
android:left="12dp"
|
android:left="12dp"
|
||||||
android:right="12dp"
|
android:right="12dp"
|
||||||
android:top="12dp" />
|
android:top="12dp" />
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
</item>
|
</item>
|
||||||
<item
|
<item
|
||||||
android:bottom="12dp"
|
android:bottom="12dp"
|
||||||
android:drawable="@drawable/ic_plus_24_ultramarine"
|
android:drawable="@drawable/ic_add_members_20"
|
||||||
android:left="12dp"
|
android:left="12dp"
|
||||||
android:right="12dp"
|
android:right="12dp"
|
||||||
android:top="12dp" />
|
android:top="12dp" />
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="24dp"
|
|
||||||
android:height="24dp"
|
|
||||||
android:viewportWidth="24"
|
|
||||||
android:viewportHeight="24">
|
|
||||||
<path
|
|
||||||
android:fillColor="@color/core_ultramarine"
|
|
||||||
android:pathData="M21,11.25l-8.25,0l0,-8.25l-1.5,0l0,8.25l-8.25,0l0,1.5l8.25,0l0,8.25l1.5,0l0,-8.25l8.25,0l0,-1.5z" />
|
|
||||||
</vector>
|
|
9
app/src/main/res/drawable/ic_view_all_20.xml
Normal file
9
app/src/main/res/drawable/ic_view_all_20.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="20dp"
|
||||||
|
android:height="20dp"
|
||||||
|
android:viewportWidth="20"
|
||||||
|
android:viewportHeight="20">
|
||||||
|
<path
|
||||||
|
android:pathData="M10,15.1L3.5,8.5L4.5,7.5L10,12.9L15.5,7.5L16.5,8.5L10,15.1Z"
|
||||||
|
android:fillColor="?attr/icon_tint"/>
|
||||||
|
</vector>
|
14
app/src/main/res/drawable/ic_view_all_circle_dark.xml
Normal file
14
app/src/main/res/drawable/ic_view_all_circle_dark.xml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item>
|
||||||
|
<shape android:shape="oval">
|
||||||
|
<solid android:color="@color/core_grey_80" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
<item
|
||||||
|
android:bottom="12dp"
|
||||||
|
android:drawable="@drawable/ic_view_all_20"
|
||||||
|
android:left="12dp"
|
||||||
|
android:right="12dp"
|
||||||
|
android:top="12dp" />
|
||||||
|
</layer-list>
|
14
app/src/main/res/drawable/ic_view_all_circle_light.xml
Normal file
14
app/src/main/res/drawable/ic_view_all_circle_light.xml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item>
|
||||||
|
<shape android:shape="oval">
|
||||||
|
<solid android:color="@color/core_grey_05" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
<item
|
||||||
|
android:bottom="12dp"
|
||||||
|
android:drawable="@drawable/ic_view_all_20"
|
||||||
|
android:left="12dp"
|
||||||
|
android:right="12dp"
|
||||||
|
android:top="12dp" />
|
||||||
|
</layer-list>
|
|
@ -27,13 +27,13 @@
|
||||||
|
|
||||||
<org.thoughtcrime.securesms.components.AvatarImageView
|
<org.thoughtcrime.securesms.components.AvatarImageView
|
||||||
android:id="@+id/group_avatar"
|
android:id="@+id/group_avatar"
|
||||||
android:layout_width="96dp"
|
android:layout_width="128dp"
|
||||||
android:layout_height="96dp"
|
android:layout_height="128dp"
|
||||||
android:layout_gravity="center_horizontal" />
|
android:layout_gravity="center_horizontal" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/group_title"
|
android:id="@+id/group_title"
|
||||||
style="@style/TextAppearance.Signal.Title2"
|
style="@style/TextAppearance.Signal.Body1.Bold"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_gravity="center_horizontal"
|
||||||
|
@ -45,7 +45,8 @@
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_gravity="center_horizontal"
|
||||||
android:textSize="14sp"
|
android:textAppearance="@style/TextAppearance.Signal.Body2"
|
||||||
|
android:textColor="?title_text_color_secondary"
|
||||||
tools:text="12 members (4 invited)" />
|
tools:text="12 members (4 invited)" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
@ -56,28 +57,37 @@
|
||||||
android:id="@+id/group_disappearing_messages_card"
|
android:id="@+id/group_disappearing_messages_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="@dimen/group_manage_fragment_card_vertical_padding"
|
||||||
app:cardBackgroundColor="?android:attr/windowBackground"
|
app:cardBackgroundColor="?android:attr/windowBackground"
|
||||||
app:layout_constraintTop_toBottomOf="@id/group_title_card">
|
app:layout_constraintTop_toBottomOf="@id/group_title_card">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
android:id="@+id/disappearing_messages_row"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="@dimen/group_manage_fragment_row_height"
|
||||||
android:orientation="horizontal">
|
android:background="?selectableItemBackground"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingStart="@dimen/group_manage_fragment_row_horizontal_padding"
|
||||||
|
android:paddingEnd="@dimen/group_manage_fragment_row_horizontal_padding">
|
||||||
|
|
||||||
<Button
|
<TextView
|
||||||
style="@style/Widget.Signal.Button.TextButton"
|
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="match_parent"
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_gravity="center_horizontal"
|
||||||
android:text="@string/ManageGroupActivity_disappearing_messages" />
|
android:gravity="center_vertical"
|
||||||
|
android:text="@string/ManageGroupActivity_disappearing_messages"
|
||||||
|
android:textAppearance="@style/TextAppearance.Signal.Body2" />
|
||||||
|
|
||||||
<Button
|
<TextView
|
||||||
android:id="@+id/disappearing_messages"
|
android:id="@+id/disappearing_messages"
|
||||||
style="@style/Widget.Signal.Button.TextButton.Ultramarine"
|
android:layout_width="0dp"
|
||||||
android:layout_width="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_weight="1"
|
||||||
android:textAlignment="textEnd"
|
android:gravity="center_vertical|end"
|
||||||
|
android:textAppearance="@style/TextAppearance.Signal.Body2"
|
||||||
|
android:textColor="@color/ultramarine_text_button"
|
||||||
tools:text="Off" />
|
tools:text="Off" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
@ -88,81 +98,99 @@
|
||||||
android:id="@+id/group_notifications_card"
|
android:id="@+id/group_notifications_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="@dimen/group_manage_fragment_card_vertical_padding"
|
||||||
app:cardBackgroundColor="?android:attr/windowBackground"
|
app:cardBackgroundColor="?android:attr/windowBackground"
|
||||||
app:layout_constraintTop_toBottomOf="@id/group_disappearing_messages_card">
|
app:layout_constraintTop_toBottomOf="@id/group_disappearing_messages_card">
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
<TextView
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:id="@+id/group_mute_notifications"
|
android:id="@+id/group_mute_notifications_row"
|
||||||
android:layout_width="0dp"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="@dimen/group_manage_fragment_row_height"
|
||||||
android:gravity="start|center_vertical"
|
android:background="?selectableItemBackground"
|
||||||
android:paddingStart="12dp"
|
android:clickable="true"
|
||||||
android:paddingEnd="12dp"
|
android:focusable="true"
|
||||||
android:text="@string/ManageGroupActivity_mute_notifications"
|
android:paddingStart="@dimen/group_manage_fragment_row_horizontal_padding"
|
||||||
android:textAppearance="@style/TextAppearance.Signal.Body1"
|
android:paddingEnd="@dimen/group_manage_fragment_row_horizontal_padding">
|
||||||
app:layout_constraintBottom_toTopOf="@id/group_mute_notifications_until"
|
|
||||||
app:layout_constraintEnd_toStartOf="@id/group_mute_notifications_switch"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
|
||||||
app:layout_goneMarginBottom="8dp" />
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/group_mute_notifications_until"
|
android:id="@+id/group_mute_notifications"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:paddingStart="12dp"
|
android:gravity="start|center_vertical"
|
||||||
android:paddingEnd="12dp"
|
android:text="@string/ManageGroupActivity_mute_notifications"
|
||||||
android:visibility="gone"
|
android:textAppearance="@style/TextAppearance.Signal.Body2"
|
||||||
app:layout_constraintBottom_toTopOf="@id/group_custom_notifications"
|
app:layout_constraintBottom_toTopOf="@id/group_mute_notifications_until"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintEnd_toStartOf="@id/group_mute_notifications_switch"
|
||||||
app:layout_constraintTop_toBottomOf="@id/group_mute_notifications"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
tools:text="Until 12:42 PM" />
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
<Switch
|
<TextView
|
||||||
android:id="@+id/group_mute_notifications_switch"
|
android:id="@+id/group_mute_notifications_until"
|
||||||
android:layout_width="0dp"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="48dp"
|
android:layout_height="wrap_content"
|
||||||
android:enabled="false"
|
android:visibility="gone"
|
||||||
app:layout_constraintBottom_toTopOf="@id/group_custom_notifications_button"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintStart_toEndOf="@id/group_mute_notifications"
|
app:layout_constraintTop_toBottomOf="@id/group_mute_notifications"
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
tools:text="Until 12:42 PM"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<Button
|
<Switch
|
||||||
android:id="@+id/group_custom_notifications"
|
android:id="@+id/group_mute_notifications_switch"
|
||||||
style="@style/Widget.Signal.Button.TextButton"
|
android:layout_width="0dp"
|
||||||
android:layout_width="0dp"
|
android:layout_height="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:clickable="false"
|
||||||
android:gravity="start|center_vertical"
|
android:enabled="false"
|
||||||
android:text="@string/ManageGroupActivity_custom_notifications"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintEnd_toStartOf="@id/group_mute_notifications_switch"
|
app:layout_constraintStart_toEndOf="@id/group_mute_notifications"
|
||||||
app:layout_constraintStart_toStartOf="parent" />
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
<Button
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
android:id="@+id/group_custom_notifications_button"
|
|
||||||
style="@style/Widget.Signal.Button.TextButton.Ultramarine"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="48dp"
|
|
||||||
android:textAlignment="textEnd"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintStart_toEndOf="@id/group_custom_notifications"
|
|
||||||
app:layout_constraintTop_toBottomOf="@id/group_mute_notifications_switch"
|
|
||||||
tools:text="Off" />
|
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.Group
|
<LinearLayout
|
||||||
android:id="@+id/group_custom_notifications_controls"
|
android:id="@+id/group_custom_notifications_row"
|
||||||
android:layout_width="0dp"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="@dimen/group_manage_fragment_row_height"
|
||||||
app:constraint_referenced_ids="group_custom_notifications,group_custom_notifications_button" />
|
android:background="?selectableItemBackground"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:paddingStart="@dimen/group_manage_fragment_row_horizontal_padding"
|
||||||
|
android:paddingEnd="@dimen/group_manage_fragment_row_horizontal_padding">
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
<TextView
|
||||||
|
android:id="@+id/group_custom_notifications"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:gravity="start|center_vertical"
|
||||||
|
android:text="@string/ManageGroupActivity_custom_notifications"
|
||||||
|
android:textAppearance="@style/TextAppearance.Signal.Body2"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/group_mute_notifications_switch"
|
||||||
|
app:layout_constraintStart_toStartOf="parent" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/group_custom_notifications_button"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:gravity="center_vertical|end"
|
||||||
|
android:textAppearance="@style/TextAppearance.Signal.Body2"
|
||||||
|
android:textColor="@color/ultramarine_text_button"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/group_custom_notifications"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/group_mute_notifications_switch"
|
||||||
|
tools:text="Off" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
</androidx.cardview.widget.CardView>
|
</androidx.cardview.widget.CardView>
|
||||||
|
|
||||||
|
@ -170,7 +198,7 @@
|
||||||
android:id="@+id/group_media_card"
|
android:id="@+id/group_media_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="@dimen/group_manage_fragment_card_vertical_padding"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
app:cardBackgroundColor="?android:attr/windowBackground"
|
app:cardBackgroundColor="?android:attr/windowBackground"
|
||||||
app:layout_constraintTop_toBottomOf="@id/group_notifications_card"
|
app:layout_constraintTop_toBottomOf="@id/group_notifications_card"
|
||||||
|
@ -204,7 +232,7 @@
|
||||||
android:id="@+id/group_access_control_card"
|
android:id="@+id/group_access_control_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="@dimen/group_manage_fragment_card_vertical_padding"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
app:cardBackgroundColor="?android:attr/windowBackground"
|
app:cardBackgroundColor="?android:attr/windowBackground"
|
||||||
app:layout_constraintTop_toBottomOf="@id/group_media_card"
|
app:layout_constraintTop_toBottomOf="@id/group_media_card"
|
||||||
|
@ -216,43 +244,59 @@
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
android:id="@+id/edit_group_membership_row"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="@dimen/group_manage_fragment_row_height"
|
||||||
|
android:background="?selectableItemBackground"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:paddingStart="@dimen/group_manage_fragment_row_horizontal_padding"
|
||||||
|
android:paddingEnd="@dimen/group_manage_fragment_row_horizontal_padding">
|
||||||
|
|
||||||
<Button
|
<TextView
|
||||||
android:id="@+id/edit_group_membership_title"
|
android:id="@+id/edit_group_membership_title"
|
||||||
style="@style/Widget.Signal.Button.TextButton"
|
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="match_parent"
|
||||||
android:text="@string/ManageGroupActivity_who_can_edit_group_membership" />
|
android:gravity="center_vertical|start"
|
||||||
|
android:text="@string/ManageGroupActivity_who_can_edit_group_membership"
|
||||||
|
android:textAppearance="@style/TextAppearance.Signal.Body2" />
|
||||||
|
|
||||||
<Button
|
<TextView
|
||||||
android:id="@+id/edit_group_membership_value"
|
android:id="@+id/edit_group_membership_value"
|
||||||
style="@style/Widget.Signal.Button.TextButton.Ultramarine"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="match_parent"
|
||||||
android:textAlignment="textEnd"
|
android:gravity="center_vertical|end"
|
||||||
|
android:textAppearance="@style/TextAppearance.Signal.Body2"
|
||||||
|
android:textColor="@color/ultramarine_text_button"
|
||||||
tools:text="Only admin" />
|
tools:text="Only admin" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
android:id="@+id/edit_group_access_row"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="@dimen/group_manage_fragment_row_height"
|
||||||
|
android:background="?selectableItemBackground"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:paddingStart="@dimen/group_manage_fragment_row_horizontal_padding"
|
||||||
|
android:paddingEnd="@dimen/group_manage_fragment_row_horizontal_padding">
|
||||||
|
|
||||||
<Button
|
<TextView
|
||||||
android:id="@+id/edit_group_access_title"
|
android:id="@+id/edit_group_access_title"
|
||||||
style="@style/Widget.Signal.Button.TextButton"
|
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="match_parent"
|
||||||
android:text="@string/ManageGroupActivity_who_can_edit_group_info" />
|
android:gravity="center_vertical|start"
|
||||||
|
android:text="@string/ManageGroupActivity_who_can_edit_group_info"
|
||||||
|
android:textAppearance="@style/TextAppearance.Signal.Body2" />
|
||||||
|
|
||||||
<Button
|
<TextView
|
||||||
android:id="@+id/edit_group_access_value"
|
android:id="@+id/edit_group_access_value"
|
||||||
style="@style/Widget.Signal.Button.TextButton.Ultramarine"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="match_parent"
|
||||||
android:textAlignment="textEnd"
|
android:gravity="center_vertical|end"
|
||||||
|
android:textAppearance="@style/TextAppearance.Signal.Body2"
|
||||||
|
android:textColor="@color/ultramarine_text_button"
|
||||||
tools:text="All members" />
|
tools:text="All members" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
@ -264,7 +308,7 @@
|
||||||
android:id="@+id/group_membership_card"
|
android:id="@+id/group_membership_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="@dimen/group_manage_fragment_card_vertical_padding"
|
||||||
app:cardBackgroundColor="?android:attr/windowBackground"
|
app:cardBackgroundColor="?android:attr/windowBackground"
|
||||||
app:layout_constraintTop_toBottomOf="@id/group_access_control_card">
|
app:layout_constraintTop_toBottomOf="@id/group_access_control_card">
|
||||||
|
|
||||||
|
@ -275,32 +319,53 @@
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/member_count_2"
|
android:id="@+id/member_count_2"
|
||||||
style="@style/TextAppearance.Signal.Body2"
|
style="@style/TextAppearance.Signal.Subtitle2"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="16dp"
|
android:layout_marginStart="16dp"
|
||||||
android:layout_marginTop="12dp"
|
android:layout_marginTop="12dp"
|
||||||
|
android:layout_marginBottom="4dp"
|
||||||
|
android:textColor="?title_text_color_secondary"
|
||||||
tools:text="12 members" />
|
tools:text="12 members" />
|
||||||
|
|
||||||
<Button
|
<TextView
|
||||||
android:id="@+id/add_members"
|
android:id="@+id/add_members"
|
||||||
style="@style/Widget.Signal.Button.TextButton.Drawable.Ultramarine"
|
android:layout_width="match_parent"
|
||||||
android:layout_width="wrap_content"
|
android:layout_height="64dp"
|
||||||
android:layout_height="wrap_content"
|
android:background="?selectableItemBackground"
|
||||||
android:layout_marginStart="4dp"
|
|
||||||
android:drawableStart="?attr/manage_group_add_members_icon"
|
android:drawableStart="?attr/manage_group_add_members_icon"
|
||||||
android:drawablePadding="8dp"
|
android:drawablePadding="8dp"
|
||||||
|
android:gravity="center_vertical|start"
|
||||||
|
android:paddingStart="@dimen/group_manage_fragment_row_horizontal_padding"
|
||||||
|
android:paddingEnd="@dimen/group_manage_fragment_row_horizontal_padding"
|
||||||
android:text="@string/ManageGroupActivity_add_members"
|
android:text="@string/ManageGroupActivity_add_members"
|
||||||
|
android:textAppearance="@style/TextAppearance.Signal.Body2"
|
||||||
|
android:textColor="@color/ultramarine_text_button"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<org.thoughtcrime.securesms.groups.ui.GroupMemberListView
|
<org.thoughtcrime.securesms.groups.ui.GroupMemberListView
|
||||||
android:id="@+id/group_members"
|
android:id="@+id/group_members"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="wrap_content"
|
||||||
app:maxHeight="280dp"
|
|
||||||
tools:listitem="@layout/group_recipient_list_item" />
|
tools:listitem="@layout/group_recipient_list_item" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/toggle_all_members"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="64dp"
|
||||||
|
android:background="?selectableItemBackground"
|
||||||
|
android:drawableStart="?attr/manage_group_view_all_icon"
|
||||||
|
android:drawablePadding="8dp"
|
||||||
|
android:gravity="center_vertical|start"
|
||||||
|
android:paddingStart="@dimen/group_manage_fragment_row_horizontal_padding"
|
||||||
|
android:paddingEnd="@dimen/group_manage_fragment_row_horizontal_padding"
|
||||||
|
android:text="@string/ManageGroupActivity_view_all_members"
|
||||||
|
android:textAppearance="@style/TextAppearance.Signal.Body2"
|
||||||
|
android:textColor="@color/ultramarine_text_button"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</androidx.cardview.widget.CardView>
|
</androidx.cardview.widget.CardView>
|
||||||
|
@ -309,7 +374,7 @@
|
||||||
android:id="@+id/group_pending_card"
|
android:id="@+id/group_pending_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="@dimen/group_manage_fragment_card_vertical_padding"
|
||||||
app:cardBackgroundColor="?android:attr/windowBackground"
|
app:cardBackgroundColor="?android:attr/windowBackground"
|
||||||
app:layout_constraintTop_toBottomOf="@id/group_membership_card">
|
app:layout_constraintTop_toBottomOf="@id/group_membership_card">
|
||||||
|
|
||||||
|
@ -326,7 +391,7 @@
|
||||||
android:id="@+id/group_block_and_leave_card"
|
android:id="@+id/group_block_and_leave_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="@dimen/group_manage_fragment_card_vertical_padding"
|
||||||
app:cardBackgroundColor="?android:attr/windowBackground"
|
app:cardBackgroundColor="?android:attr/windowBackground"
|
||||||
app:layout_constraintTop_toBottomOf="@id/group_pending_card">
|
app:layout_constraintTop_toBottomOf="@id/group_pending_card">
|
||||||
|
|
||||||
|
@ -335,19 +400,29 @@
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
<Button
|
<TextView
|
||||||
android:id="@+id/blockGroup"
|
android:id="@+id/blockGroup"
|
||||||
style="@style/Widget.Signal.Button.TextButton.Red"
|
android:layout_width="match_parent"
|
||||||
android:layout_width="wrap_content"
|
android:layout_height="@dimen/group_manage_fragment_row_height"
|
||||||
android:layout_height="wrap_content"
|
android:background="?selectableItemBackground"
|
||||||
android:text="@string/ManageGroupActivity_block_group" />
|
android:gravity="center_vertical|start"
|
||||||
|
android:paddingStart="@dimen/group_manage_fragment_row_horizontal_padding"
|
||||||
|
android:paddingEnd="@dimen/group_manage_fragment_row_horizontal_padding"
|
||||||
|
android:text="@string/ManageGroupActivity_block_group"
|
||||||
|
android:textAppearance="@style/TextAppearance.Signal.Body2"
|
||||||
|
android:textColor="@color/core_red" />
|
||||||
|
|
||||||
<Button
|
<TextView
|
||||||
android:id="@+id/leaveGroup"
|
android:id="@+id/leaveGroup"
|
||||||
style="@style/Widget.Signal.Button.TextButton.Red"
|
android:layout_width="match_parent"
|
||||||
android:layout_width="wrap_content"
|
android:layout_height="@dimen/group_manage_fragment_row_height"
|
||||||
android:layout_height="wrap_content"
|
android:background="?selectableItemBackground"
|
||||||
android:text="@string/ManageGroupActivity_leave_group" />
|
android:gravity="center_vertical|start"
|
||||||
|
android:paddingStart="@dimen/group_manage_fragment_row_horizontal_padding"
|
||||||
|
android:paddingEnd="@dimen/group_manage_fragment_row_horizontal_padding"
|
||||||
|
android:text="@string/ManageGroupActivity_leave_group"
|
||||||
|
android:textAppearance="@style/TextAppearance.Signal.Body2"
|
||||||
|
android:textColor="@color/core_red" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,10 @@
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="64dp">
|
android:layout_height="64dp"
|
||||||
|
android:background="?selectableItemBackground"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true">
|
||||||
|
|
||||||
<org.thoughtcrime.securesms.components.AvatarImageView
|
<org.thoughtcrime.securesms.components.AvatarImageView
|
||||||
android:id="@+id/recipient_avatar"
|
android:id="@+id/recipient_avatar"
|
||||||
|
@ -37,8 +40,8 @@
|
||||||
android:layout_marginEnd="16dp"
|
android:layout_marginEnd="16dp"
|
||||||
android:gravity="start|center_vertical"
|
android:gravity="start|center_vertical"
|
||||||
android:text="@string/GroupRecipientListItem_admin"
|
android:text="@string/GroupRecipientListItem_admin"
|
||||||
android:textColor="?attr/title_text_color_secondary"
|
|
||||||
android:textAppearance="@style/TextAppearance.Signal.Body2"
|
android:textAppearance="@style/TextAppearance.Signal.Body2"
|
||||||
|
android:textColor="?attr/title_text_color_secondary"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
app:layout_constraintBottom_toBottomOf="@+id/recipient_name"
|
app:layout_constraintBottom_toBottomOf="@+id/recipient_name"
|
||||||
app:layout_constraintEnd_toStartOf="@+id/popupMenuProgressContainer"
|
app:layout_constraintEnd_toStartOf="@+id/popupMenuProgressContainer"
|
||||||
|
|
|
@ -225,6 +225,7 @@
|
||||||
android:layout_marginStart="32dp"
|
android:layout_marginStart="32dp"
|
||||||
android:layout_marginEnd="32dp"
|
android:layout_marginEnd="32dp"
|
||||||
android:layout_marginBottom="16dp"
|
android:layout_marginBottom="16dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
android:background="@color/core_ultramarine"
|
android:background="@color/core_ultramarine"
|
||||||
android:enabled="false"
|
android:enabled="false"
|
||||||
android:textAllCaps="true"
|
android:textAllCaps="true"
|
||||||
|
|
|
@ -55,19 +55,21 @@
|
||||||
tools:text="\@shibatabread +1 555-654-6657" />
|
tools:text="\@shibatabread +1 555-654-6657" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:paddingBottom="16dp"
|
android:paddingBottom="16dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/username_number">
|
app:layout_constraintTop_toBottomOf="@+id/username_number">
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/message_button"
|
android:id="@+id/message_button"
|
||||||
style="@style/Widget.Signal.Button.TextButton.Drawable"
|
style="@style/Widget.Signal.Button.TextButton.Drawable"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="16dp"
|
android:paddingStart="22dp"
|
||||||
|
android:paddingEnd="22dp"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="16dp"
|
||||||
android:text="@string/RecipientBottomSheet_message"
|
android:text="@string/RecipientBottomSheet_message"
|
||||||
app:drawableStartCompat="?attr/recipient_message_icon" />
|
app:drawableStartCompat="?attr/recipient_message_icon" />
|
||||||
|
@ -75,18 +77,20 @@
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/secure_call_button"
|
android:id="@+id/secure_call_button"
|
||||||
style="@style/Widget.Signal.Button.TextButton.Drawable"
|
style="@style/Widget.Signal.Button.TextButton.Drawable"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="16dp"
|
android:paddingStart="22dp"
|
||||||
|
android:paddingEnd="22dp"
|
||||||
android:text="@string/RecipientBottomSheet_call"
|
android:text="@string/RecipientBottomSheet_call"
|
||||||
app:drawableStartCompat="?attr/recipient_call_icon" />
|
app:drawableStartCompat="?attr/recipient_call_icon" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/block_button"
|
android:id="@+id/block_button"
|
||||||
style="@style/Widget.Signal.Button.TextButton.Drawable"
|
style="@style/Widget.Signal.Button.TextButton.Drawable"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="16dp"
|
android:paddingStart="22dp"
|
||||||
|
android:paddingEnd="22dp"
|
||||||
android:text="@string/RecipientBottomSheet_block"
|
android:text="@string/RecipientBottomSheet_block"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
app:drawableStartCompat="?attr/recipient_block_icon"
|
app:drawableStartCompat="?attr/recipient_block_icon"
|
||||||
|
@ -95,9 +99,10 @@
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/unblock_button"
|
android:id="@+id/unblock_button"
|
||||||
style="@style/Widget.Signal.Button.TextButton.Drawable"
|
style="@style/Widget.Signal.Button.TextButton.Drawable"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="16dp"
|
android:paddingStart="22dp"
|
||||||
|
android:paddingEnd="22dp"
|
||||||
android:text="@string/RecipientBottomSheet_unblock"
|
android:text="@string/RecipientBottomSheet_unblock"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
app:drawableStartCompat="?attr/recipient_block_icon"
|
app:drawableStartCompat="?attr/recipient_block_icon"
|
||||||
|
@ -106,18 +111,20 @@
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/view_safety_number_button"
|
android:id="@+id/view_safety_number_button"
|
||||||
style="@style/Widget.Signal.Button.TextButton.Drawable"
|
style="@style/Widget.Signal.Button.TextButton.Drawable"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="16dp"
|
android:paddingStart="22dp"
|
||||||
|
android:paddingEnd="22dp"
|
||||||
android:text="@string/RecipientBottomSheet_view_safety_number"
|
android:text="@string/RecipientBottomSheet_view_safety_number"
|
||||||
app:drawableStartCompat="?attr/recipient_view_safety_icon" />
|
app:drawableStartCompat="?attr/recipient_view_safety_icon" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/make_group_admin_button"
|
android:id="@+id/make_group_admin_button"
|
||||||
style="@style/Widget.Signal.Button.TextButton.Drawable"
|
style="@style/Widget.Signal.Button.TextButton.Drawable"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="16dp"
|
android:paddingStart="22dp"
|
||||||
|
android:paddingEnd="22dp"
|
||||||
android:text="@string/RecipientBottomSheet_make_group_admin"
|
android:text="@string/RecipientBottomSheet_make_group_admin"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
app:drawableStartCompat="?attr/recipient_make_admin_icon"
|
app:drawableStartCompat="?attr/recipient_make_admin_icon"
|
||||||
|
@ -126,19 +133,22 @@
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/remove_group_admin_button"
|
android:id="@+id/remove_group_admin_button"
|
||||||
style="@style/Widget.Signal.Button.TextButton.Drawable"
|
style="@style/Widget.Signal.Button.TextButton.Drawable"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="16dp"
|
android:paddingStart="22dp"
|
||||||
|
android:paddingEnd="22dp"
|
||||||
android:text="@string/RecipientBottomSheet_remove_as_admin"
|
android:text="@string/RecipientBottomSheet_remove_as_admin"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
app:drawableStartCompat="?attr/recipient_make_admin_icon"
|
app:drawableStartCompat="?attr/recipient_make_admin_icon"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/remove_from_group_button"
|
android:id="@+id/remove_from_group_button"
|
||||||
style="@style/Widget.Signal.Button.TextButton.Drawable"
|
style="@style/Widget.Signal.Button.TextButton.Drawable"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="16dp"
|
android:paddingStart="22dp"
|
||||||
|
android:paddingEnd="22dp"
|
||||||
android:text="@string/RecipientBottomSheet_remove_from_group"
|
android:text="@string/RecipientBottomSheet_remove_from_group"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
app:drawableStartCompat="?attr/recipient_remove_icon"
|
app:drawableStartCompat="?attr/recipient_remove_icon"
|
||||||
|
|
|
@ -228,6 +228,7 @@
|
||||||
|
|
||||||
<attr name="group_members_dialog_icon" format="reference"/>
|
<attr name="group_members_dialog_icon" format="reference"/>
|
||||||
<attr name="manage_group_add_members_icon" format="reference"/>
|
<attr name="manage_group_add_members_icon" format="reference"/>
|
||||||
|
<attr name="manage_group_view_all_icon" format="reference"/>
|
||||||
<attr name="lockscreen_watermark" format="reference" />
|
<attr name="lockscreen_watermark" format="reference" />
|
||||||
|
|
||||||
<attr name="recipient_preference_blocked" format="color"/>
|
<attr name="recipient_preference_blocked" format="color"/>
|
||||||
|
|
|
@ -159,4 +159,7 @@
|
||||||
<dimen name="react_with_any_emoji_bottom_sheet_dialog_fragment_min_height">340dp</dimen>
|
<dimen name="react_with_any_emoji_bottom_sheet_dialog_fragment_min_height">340dp</dimen>
|
||||||
<dimen name="react_with_any_emoji_bottom_sheet_dialog_fragment_tabs_height">36dp</dimen>
|
<dimen name="react_with_any_emoji_bottom_sheet_dialog_fragment_tabs_height">36dp</dimen>
|
||||||
|
|
||||||
|
<dimen name="group_manage_fragment_card_vertical_padding">12dp</dimen>
|
||||||
|
<dimen name="group_manage_fragment_row_height">52dp</dimen>
|
||||||
|
<dimen name="group_manage_fragment_row_horizontal_padding">16dp</dimen>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -500,6 +500,7 @@
|
||||||
<string name="ManageGroupActivity_off">Off</string>
|
<string name="ManageGroupActivity_off">Off</string>
|
||||||
<string name="ManageGroupActivity_on">On</string>
|
<string name="ManageGroupActivity_on">On</string>
|
||||||
<string name="ManageGroupActivity_add_members">Add members</string>
|
<string name="ManageGroupActivity_add_members">Add members</string>
|
||||||
|
<string name="ManageGroupActivity_view_all_members">View all members</string>
|
||||||
|
|
||||||
<string name="ManageGroupActivity_you_dont_have_the_rights_to_do_this">You don\'t have the rights to do this</string>
|
<string name="ManageGroupActivity_you_dont_have_the_rights_to_do_this">You don\'t have the rights to do this</string>
|
||||||
<string name="ManageGroupActivity_not_capable">Someone you added does not support new groups and needs to update Signal</string>
|
<string name="ManageGroupActivity_not_capable">Someone you added does not support new groups and needs to update Signal</string>
|
||||||
|
|
|
@ -416,12 +416,13 @@
|
||||||
</declare-styleable>
|
</declare-styleable>
|
||||||
|
|
||||||
<style name="Widget.Signal.Button.TextButton" parent="Widget.AppCompat.Button.Borderless">
|
<style name="Widget.Signal.Button.TextButton" parent="Widget.AppCompat.Button.Borderless">
|
||||||
<item name="android:textAppearance">@style/TextAppearance.Signal.Body1</item>
|
<item name="android:textAppearance">@style/TextAppearance.Signal.Body2</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Widget.Signal.Button.TextButton.Drawable">
|
<style name="Widget.Signal.Button.TextButton.Drawable">
|
||||||
<item name="android:textAlignment">viewStart</item>
|
<item name="android:textAlignment">viewStart</item>
|
||||||
<item name="android:drawablePadding">16dp</item>
|
<item name="android:drawablePadding">16dp</item>
|
||||||
|
<item name="android:background">?attr/selectableItemBackground</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Widget.Signal.Button.TextButton.Red" >
|
<style name="Widget.Signal.Button.TextButton.Red" >
|
||||||
|
|
|
@ -102,10 +102,13 @@
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="TextAppearance.Signal.Body2" parent="@style/TextAppearance.AppCompat.Body2">
|
<style name="TextAppearance.Signal.Body2" parent="@style/TextAppearance.AppCompat.Body2">
|
||||||
|
<item name="android:textSize">14sp</item>
|
||||||
|
<item name="android:textStyle">normal</item>
|
||||||
|
<item name="fontFamily">sans-serif</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="TextAppearance.Signal.Body1.Bold">
|
<style name="TextAppearance.Signal.Body1.Bold">
|
||||||
<item name="android:textStyle">bold</item>
|
<item name="fontFamily">sans-serif-medium</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="TextAppearance.Signal.Caption" parent="@style/TextAppearance.AppCompat.Caption">
|
<style name="TextAppearance.Signal.Caption" parent="@style/TextAppearance.AppCompat.Caption">
|
||||||
|
|
|
@ -406,6 +406,7 @@
|
||||||
|
|
||||||
<item name="group_members_dialog_icon">@drawable/ic_group_outline_24</item>
|
<item name="group_members_dialog_icon">@drawable/ic_group_outline_24</item>
|
||||||
<item name="manage_group_add_members_icon">@drawable/ic_add_members_circle_light</item>
|
<item name="manage_group_add_members_icon">@drawable/ic_add_members_circle_light</item>
|
||||||
|
<item name="manage_group_view_all_icon">@drawable/ic_view_all_circle_light</item>
|
||||||
<item name="preferenceTheme">@style/PreferenceThemeOverlay.Fix</item>
|
<item name="preferenceTheme">@style/PreferenceThemeOverlay.Fix</item>
|
||||||
|
|
||||||
<item name="search_toolbar_background">@color/white</item>
|
<item name="search_toolbar_background">@color/white</item>
|
||||||
|
@ -691,6 +692,7 @@
|
||||||
|
|
||||||
<item name="group_members_dialog_icon">@drawable/ic_group_solid_24</item>
|
<item name="group_members_dialog_icon">@drawable/ic_group_solid_24</item>
|
||||||
<item name="manage_group_add_members_icon">@drawable/ic_add_members_circle_dark</item>
|
<item name="manage_group_add_members_icon">@drawable/ic_add_members_circle_dark</item>
|
||||||
|
<item name="manage_group_view_all_icon">@drawable/ic_view_all_circle_dark</item>
|
||||||
<item name="preferenceTheme">@style/PreferenceThemeOverlay.Fix</item>
|
<item name="preferenceTheme">@style/PreferenceThemeOverlay.Fix</item>
|
||||||
<item name="search_toolbar_background">@color/core_grey_95</item>
|
<item name="search_toolbar_background">@color/core_grey_95</item>
|
||||||
<item name="search_background">@color/black</item>
|
<item name="search_background">@color/black</item>
|
||||||
|
|
Loading…
Add table
Reference in a new issue