mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-26 11:51:10 +01:00
Add QR group link share.
This commit is contained in:
@@ -18,6 +18,7 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.groups.GroupId;
|
||||
import org.thoughtcrime.securesms.groups.LiveGroup;
|
||||
import org.thoughtcrime.securesms.recipients.ui.sharablegrouplink.qr.GroupLinkShareQrDialogFragment;
|
||||
import org.thoughtcrime.securesms.util.BottomSheetUtil;
|
||||
import org.thoughtcrime.securesms.util.ThemeUtil;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
@@ -77,8 +78,10 @@ public final class GroupLinkBottomSheetDialogFragment extends BottomSheetDialogF
|
||||
dismiss();
|
||||
});
|
||||
|
||||
viewQrButton.setOnClickListener(v -> dismiss()); // Todo [Alan] GV2 Add share QR within signal
|
||||
viewQrButton.setVisibility(View.GONE);
|
||||
viewQrButton.setOnClickListener(v -> {
|
||||
GroupLinkShareQrDialogFragment.show(requireFragmentManager(), groupId);
|
||||
dismiss();
|
||||
});
|
||||
|
||||
shareBySystemButton.setOnClickListener(v -> {
|
||||
ShareCompat.IntentBuilder.from(requireActivity())
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
package org.thoughtcrime.securesms.recipients.ui.sharablegrouplink.qr;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.lifecycle.ViewModelProviders;
|
||||
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.components.qr.QrView;
|
||||
import org.thoughtcrime.securesms.groups.GroupId;
|
||||
import org.thoughtcrime.securesms.logging.Log;
|
||||
import org.thoughtcrime.securesms.util.BottomSheetUtil;
|
||||
import org.thoughtcrime.securesms.util.ThemeUtil;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class GroupLinkShareQrDialogFragment extends DialogFragment {
|
||||
|
||||
private static final String TAG = Log.tag(GroupLinkShareQrDialogFragment.class);
|
||||
|
||||
private static final String ARG_GROUP_ID = "group_id";
|
||||
|
||||
private GroupLinkShareQrViewModel viewModel;
|
||||
private QrView qrImageView;
|
||||
private View shareCodeButton;
|
||||
|
||||
public static void show(@NonNull FragmentManager manager, @NonNull GroupId.V2 groupId) {
|
||||
DialogFragment fragment = new GroupLinkShareQrDialogFragment();
|
||||
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) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setStyle(STYLE_NO_FRAME, ThemeUtil.isDarkTheme(requireActivity()) ? R.style.TextSecure_DarkTheme
|
||||
: R.style.TextSecure_LightTheme);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable View onCreateView(@NonNull LayoutInflater inflater,
|
||||
@Nullable ViewGroup container,
|
||||
@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
return inflater.inflate(R.layout.group_link_share_qr_dialog_fragment, container, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
||||
initializeViewModel();
|
||||
initializeViews(view);
|
||||
}
|
||||
|
||||
private void initializeViewModel() {
|
||||
Bundle arguments = requireArguments();
|
||||
GroupId.V2 groupId = GroupId.parseOrThrow(Objects.requireNonNull(arguments.getString(ARG_GROUP_ID))).requireV2();
|
||||
GroupLinkShareQrViewModel.Factory factory = new GroupLinkShareQrViewModel.Factory(groupId);
|
||||
|
||||
viewModel = ViewModelProviders.of(this, factory).get(GroupLinkShareQrViewModel.class);
|
||||
}
|
||||
|
||||
private void initializeViews(@NonNull View view) {
|
||||
Toolbar toolbar = view.findViewById(R.id.group_link_share_qr_toolbar);
|
||||
|
||||
qrImageView = view.findViewById(R.id.group_link_share_qr_image);
|
||||
shareCodeButton = view.findViewById(R.id.group_link_share_code_button);
|
||||
|
||||
toolbar.setNavigationOnClickListener(v -> dismissAllowingStateLoss());
|
||||
|
||||
viewModel.getQrUrl().observe(getViewLifecycleOwner(), this::presentUrl);
|
||||
}
|
||||
|
||||
private void presentUrl(@Nullable String url) {
|
||||
qrImageView.setQrText(url);
|
||||
|
||||
shareCodeButton.setOnClickListener(v -> {
|
||||
// TODO [Alan] GV2 Allow qr image share
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package org.thoughtcrime.securesms.recipients.ui.sharablegrouplink.qr;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.Transformations;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import org.thoughtcrime.securesms.groups.GroupId;
|
||||
import org.thoughtcrime.securesms.groups.LiveGroup;
|
||||
import org.thoughtcrime.securesms.groups.v2.GroupLinkUrlAndStatus;
|
||||
|
||||
public final class GroupLinkShareQrViewModel extends ViewModel {
|
||||
|
||||
private final LiveData<String> qrData;
|
||||
|
||||
private GroupLinkShareQrViewModel(@NonNull GroupId.V2 groupId) {
|
||||
LiveGroup liveGroup = new LiveGroup(groupId);
|
||||
|
||||
this.qrData = Transformations.map(liveGroup.getGroupLink(), GroupLinkUrlAndStatus::getUrl);
|
||||
}
|
||||
|
||||
LiveData<String> getQrUrl() {
|
||||
return qrData;
|
||||
}
|
||||
|
||||
public static final class Factory implements ViewModelProvider.Factory {
|
||||
|
||||
private final GroupId.V2 groupId;
|
||||
|
||||
public Factory(@NonNull GroupId.V2 groupId) {
|
||||
this.groupId = groupId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
|
||||
//noinspection ConstantConditions
|
||||
return modelClass.cast(new GroupLinkShareQrViewModel(groupId));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user