Add QR group link share.

This commit is contained in:
Alan Evans
2020-08-31 12:35:38 -03:00
committed by GitHub
parent 4714895c59
commit 1a3985d709
7 changed files with 340 additions and 16 deletions

View File

@@ -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())

View File

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

View File

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