Signal-Android/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/invite/GroupLinkInviteFriendsBotto...

174 wiersze
7.0 KiB
Java

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);
}
}