package org.thoughtcrime.securesms.groups.ui.invitesandrequests.invite; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.widget.SwitchCompat; import androidx.constraintlayout.widget.Group; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentManager; import androidx.lifecycle.ViewModelProvider; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.groups.BadGroupIdException; import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.recipients.ui.sharablegrouplink.GroupLinkBottomSheetDialogFragment; import org.thoughtcrime.securesms.util.BottomSheetUtil; import org.thoughtcrime.securesms.util.ThemeUtil; import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; import java.util.Objects; public final class GroupLinkInviteFriendsBottomSheetDialogFragment extends BottomSheetDialogFragment { private static final String TAG = Log.tag(GroupLinkInviteFriendsBottomSheetDialogFragment.class); private static final String ARG_GROUP_ID = "group_id"; private Button groupLinkEnableAndShareButton; private Button groupLinkShareButton; private Group controlGroup; private View controlOutline; private SwitchCompat memberApprovalSwitch; private SimpleProgressDialog.DismissibleDialog busyDialog; public static void show(@NonNull FragmentManager manager, @NonNull GroupId.V2 groupId) { GroupLinkInviteFriendsBottomSheetDialogFragment fragment = new GroupLinkInviteFriendsBottomSheetDialogFragment(); Bundle args = new Bundle(); args.putString(ARG_GROUP_ID, groupId.toString()); fragment.setArguments(args); fragment.show(manager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { setStyle(DialogFragment.STYLE_NORMAL, ThemeUtil.isDarkTheme(requireContext()) ? R.style.Theme_Signal_RoundedBottomSheet : R.style.Theme_Signal_RoundedBottomSheet_Light); super.onCreate(savedInstanceState); } @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.group_invite_link_enable_and_share_bottom_sheet, container, false); groupLinkEnableAndShareButton = view.findViewById(R.id.group_link_enable_and_share_button); groupLinkShareButton = view.findViewById(R.id.group_link_share_button); controlGroup = view.findViewById(R.id.control_group); controlOutline = view.findViewById(R.id.group_link_enable_and_share_approve_outline); memberApprovalSwitch = view.findViewById(R.id.group_link_enable_and_share_approve_new_members_switch); view.findViewById(R.id.group_link_enable_and_share_cancel_button).setOnClickListener(v -> dismiss()); return view; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); GroupId.V2 groupId = getGroupId(); GroupLinkInviteFriendsViewModel.Factory factory = new GroupLinkInviteFriendsViewModel.Factory(requireContext().getApplicationContext(), groupId); GroupLinkInviteFriendsViewModel viewModel = new ViewModelProvider(this, factory).get(GroupLinkInviteFriendsViewModel.class); viewModel.getGroupInviteLinkAndStatus() .observe(getViewLifecycleOwner(), groupLinkUrlAndStatus -> { if (groupLinkUrlAndStatus.isEnabled()) { groupLinkShareButton.setVisibility(View.VISIBLE); groupLinkEnableAndShareButton.setVisibility(View.INVISIBLE); controlGroup.setVisibility(View.GONE); groupLinkShareButton.setOnClickListener(v -> shareGroupLinkAndDismiss(groupId)); } else { controlGroup.setVisibility(View.VISIBLE); groupLinkEnableAndShareButton.setVisibility(View.VISIBLE); groupLinkShareButton.setVisibility(View.INVISIBLE); } }); controlOutline.setOnClickListener(v -> viewModel.toggleMemberApproval()); viewModel.getMemberApproval() .observe(getViewLifecycleOwner(), enabled -> memberApprovalSwitch.setChecked(enabled)); viewModel.isBusy() .observe(getViewLifecycleOwner(), this::setBusy); viewModel.getEnableErrors() .observe(getViewLifecycleOwner(), error -> { Toast.makeText(requireContext(), errorToMessage(error), Toast.LENGTH_SHORT).show(); if (error == EnableInviteLinkError.NOT_IN_GROUP || error == EnableInviteLinkError.INSUFFICIENT_RIGHTS) { dismiss(); } }); groupLinkEnableAndShareButton.setOnClickListener(v -> viewModel.enable()); viewModel.getEnableSuccess() .observe(getViewLifecycleOwner(), joinGroupSuccess -> { Log.i(TAG, "Group link enabled, sharing"); shareGroupLinkAndDismiss(groupId); } ); } protected void shareGroupLinkAndDismiss(@NonNull GroupId.V2 groupId) { dismiss(); GroupLinkBottomSheetDialogFragment.show(requireFragmentManager(), groupId); } protected GroupId.V2 getGroupId() { try { return GroupId.parse(Objects.requireNonNull(requireArguments().getString(ARG_GROUP_ID))) .requireV2(); } catch (BadGroupIdException e) { throw new AssertionError(e); } } private void setBusy(boolean isBusy) { if (isBusy) { if (busyDialog == null) { busyDialog = SimpleProgressDialog.showDelayed(requireContext()); } } else { if (busyDialog != null) { busyDialog.dismiss(); busyDialog = null; } } } private @NonNull String errorToMessage(@NonNull EnableInviteLinkError error) { switch (error) { case NETWORK_ERROR : return getString(R.string.GroupInviteLinkEnableAndShareBottomSheetDialogFragment_encountered_a_network_error); case INSUFFICIENT_RIGHTS : return getString(R.string.GroupInviteLinkEnableAndShareBottomSheetDialogFragment_you_dont_have_the_right_to_enable_group_link); case NOT_IN_GROUP : return getString(R.string.GroupInviteLinkEnableAndShareBottomSheetDialogFragment_you_are_not_currently_a_member_of_the_group); default : return getString(R.string.GroupInviteLinkEnableAndShareBottomSheetDialogFragment_unable_to_enable_group_link_please_try_again_later); } } @Override public void show(@NonNull FragmentManager manager, @Nullable String tag) { BottomSheetUtil.show(manager, tag, this); } }