123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- package com.owncloud.android.ui.dialog;
- import android.content.ComponentName;
- import android.content.Intent;
- import android.content.pm.ResolveInfo;
- import android.graphics.PorterDuff;
- import android.graphics.drawable.Drawable;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import android.widget.TextView;
- import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
- import com.google.android.material.snackbar.Snackbar;
- import com.owncloud.android.R;
- import com.owncloud.android.datamodel.OCFile;
- import com.owncloud.android.lib.common.utils.Log_OC;
- import com.owncloud.android.lib.resources.status.OCCapability;
- import com.owncloud.android.ui.activity.FileActivity;
- import com.owncloud.android.ui.activity.FileDisplayActivity;
- import com.owncloud.android.ui.adapter.SendButtonAdapter;
- import com.owncloud.android.ui.components.SendButtonData;
- import com.owncloud.android.ui.helpers.FileOperationsHelper;
- import com.owncloud.android.utils.MimeTypeUtil;
- import com.owncloud.android.utils.ThemeUtils;
- import java.util.ArrayList;
- import java.util.List;
- import androidx.annotation.NonNull;
- import androidx.annotation.Nullable;
- import androidx.recyclerview.widget.GridLayoutManager;
- import androidx.recyclerview.widget.RecyclerView;
- public class SendShareDialog extends BottomSheetDialogFragment {
- private static final String KEY_OCFILE = "KEY_OCFILE";
- private static final String KEY_SHARING_PUBLIC_PASSWORD_ENFORCED = "KEY_SHARING_PUBLIC_PASSWORD_ENFORCED";
- private static final String KEY_SHARING_PUBLIC_ASK_FOR_PASSWORD = "KEY_SHARING_PUBLIC_ASK_FOR_PASSWORD";
- private static final String KEY_HIDE_NCSHARING_OPTIONS = "KEY_HIDE_NCSHARING_OPTIONS";
- private static final String TAG = SendShareDialog.class.getSimpleName();
- public static final String PACKAGE_NAME = "PACKAGE_NAME";
- public static final String ACTIVITY_NAME = "ACTIVITY_NAME";
- private View view;
- private OCFile file;
- private boolean hideNcSharingOptions;
- private boolean sharingPublicPasswordEnforced;
- private boolean sharingPublicAskForPassword;
- private FileOperationsHelper fileOperationsHelper;
- public static SendShareDialog newInstance(OCFile file, boolean hideNcSharingOptions, OCCapability capability) {
- SendShareDialog dialogFragment = new SendShareDialog();
- Bundle args = new Bundle();
- args.putParcelable(KEY_OCFILE, file);
- args.putBoolean(KEY_HIDE_NCSHARING_OPTIONS, hideNcSharingOptions);
- args.putBoolean(KEY_SHARING_PUBLIC_PASSWORD_ENFORCED,
- capability.getFilesSharingPublicPasswordEnforced().isTrue());
- args.putBoolean(KEY_SHARING_PUBLIC_ASK_FOR_PASSWORD,
- capability.getFilesSharingPublicAskForOptionalPassword().isTrue());
- dialogFragment.setArguments(args);
- return dialogFragment;
- }
- @Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setRetainInstance(true);
- file = getArguments().getParcelable(KEY_OCFILE);
- hideNcSharingOptions = getArguments().getBoolean(KEY_HIDE_NCSHARING_OPTIONS, false);
- sharingPublicPasswordEnforced = getArguments().getBoolean(KEY_SHARING_PUBLIC_PASSWORD_ENFORCED, false);
- sharingPublicAskForPassword = getArguments().getBoolean(KEY_SHARING_PUBLIC_ASK_FOR_PASSWORD);
- }
- @Nullable
- @Override
- public View onCreateView(@NonNull LayoutInflater inflater,
- @Nullable ViewGroup container,
- @Nullable Bundle savedInstanceState) {
- view = inflater.inflate(R.layout.send_share_fragment, container, false);
- LinearLayout sendShareButtons = view.findViewById(R.id.send_share_buttons);
- View divider = view.findViewById(R.id.divider);
-
- TextView sharePeopleText = view.findViewById(R.id.share_people_button);
- sharePeopleText.setOnClickListener(v -> shareFile(file));
- ImageView sharePeopleImageView = view.findViewById(R.id.share_people_icon);
- themeShareButtonImage(sharePeopleImageView);
- sharePeopleImageView.setOnClickListener(v -> shareFile(file));
-
- TextView shareLinkText = view.findViewById(R.id.share_link_button);
- shareLinkText.setOnClickListener(v -> shareByLink());
- ImageView shareLinkImageView = view.findViewById(R.id.share_link_icon);
- themeShareButtonImage(shareLinkImageView);
- shareLinkImageView.setOnClickListener(v -> shareByLink());
- if (hideNcSharingOptions) {
- sendShareButtons.setVisibility(View.GONE);
- divider.setVisibility(View.GONE);
- } else if (file.isSharedWithMe() && !file.canReshare()) {
- showResharingNotAllowedSnackbar();
- if (file.isFolder()) {
- shareLinkText.setVisibility(View.GONE);
- shareLinkImageView.setVisibility(View.GONE);
- sharePeopleText.setVisibility(View.GONE);
- sharePeopleImageView.setVisibility(View.GONE);
- getDialog().hide();
- } else {
- shareLinkText.setEnabled(false);
- shareLinkText.setAlpha(0.3f);
- shareLinkImageView.setEnabled(false);
- shareLinkImageView.setAlpha(0.3f);
- sharePeopleText.setEnabled(false);
- sharePeopleText.setAlpha(0.3f);
- sharePeopleImageView.setEnabled(false);
- sharePeopleImageView.setAlpha(0.3f);
- }
- }
-
- Intent sendIntent = createSendIntent();
- List<SendButtonData> sendButtonDataList = setupSendButtonData(sendIntent);
- if ("off".equalsIgnoreCase(getContext().getString(R.string.send_files_to_other_apps))) {
- sharePeopleText.setVisibility(View.GONE);
- }
- SendButtonAdapter.ClickListener clickListener = setupSendButtonClickListener(sendIntent);
- RecyclerView sendButtonsView = view.findViewById(R.id.send_button_recycler_view);
- sendButtonsView.setHasFixedSize(true);
- sendButtonsView.setLayoutManager(new GridLayoutManager(getActivity(), 4));
- sendButtonsView.setAdapter(new SendButtonAdapter(sendButtonDataList, clickListener));
- return view;
- }
- private void shareByLink() {
- if (file.isSharedViaLink()) {
- ((FileActivity) getActivity()).getFileOperationsHelper().getFileWithLink(file);
- } else if (sharingPublicPasswordEnforced) {
-
- requestPasswordForShareViaLink();
- } else {
-
- ((FileActivity) getActivity()).getFileOperationsHelper().shareFileViaPublicShare(file, null);
- }
- this.dismiss();
- }
- private void requestPasswordForShareViaLink() {
- SharePasswordDialogFragment dialog = SharePasswordDialogFragment.newInstance(file,
- true,
- sharingPublicAskForPassword);
- dialog.show(getFragmentManager(), SharePasswordDialogFragment.PASSWORD_FRAGMENT);
- }
- private void themeShareButtonImage(ImageView shareImageView) {
- shareImageView.getBackground().setColorFilter(ThemeUtils.primaryColor(getContext()), PorterDuff.Mode.SRC_IN);
- shareImageView.getDrawable().mutate().setColorFilter(ThemeUtils.fontColor(getContext()),
- PorterDuff.Mode.SRC_IN);
- }
- private void showResharingNotAllowedSnackbar() {
- Snackbar snackbar = Snackbar.make(view, R.string.resharing_is_not_allowed, Snackbar.LENGTH_LONG);
- snackbar.addCallback(new Snackbar.Callback() {
- @Override
- public void onDismissed(Snackbar transientBottomBar, int event) {
- super.onDismissed(transientBottomBar, event);
- if (file.isFolder()) {
- dismiss();
- }
- }
- });
- snackbar.show();
- }
- @NonNull
- private SendButtonAdapter.ClickListener setupSendButtonClickListener(Intent sendIntent) {
- return sendButtonDataData -> {
- String packageName = sendButtonDataData.getPackageName();
- String activityName = sendButtonDataData.getActivityName();
- if (MimeTypeUtil.isImage(file) && !file.isDown()) {
- fileOperationsHelper.sendCachedImage(file, packageName, activityName);
- } else {
-
- if (file.isDown()) {
- sendIntent.setComponent(new ComponentName(packageName, activityName));
- getActivity().startActivity(Intent.createChooser(sendIntent, getString(R.string.send)));
- } else {
- Log_OC.d(TAG, file.getRemotePath() + ": File must be downloaded");
- ((SendShareDialog.SendShareDialogDownloader) getActivity()).downloadFile(file, packageName,
- activityName);
- }
- }
- dismiss();
- };
- }
- @NonNull
- private List<SendButtonData> setupSendButtonData(Intent sendIntent) {
- List<SendButtonData> sendButtonDataList = new ArrayList<>();
- for (ResolveInfo match : getActivity().getPackageManager().queryIntentActivities(sendIntent, 0)) {
- Drawable icon = match.loadIcon(getActivity().getPackageManager());
- CharSequence label = match.loadLabel(getActivity().getPackageManager());
- SendButtonData sendButtonData = new SendButtonData(icon, label,
- match.activityInfo.packageName,
- match.activityInfo.name);
- sendButtonDataList.add(sendButtonData);
- }
- return sendButtonDataList;
- }
- @NonNull
- private Intent createSendIntent() {
- Intent sendIntent = new Intent(Intent.ACTION_SEND);
- sendIntent.setType(file.getMimeType());
- sendIntent.putExtra(Intent.EXTRA_STREAM, file.getExposedFileUri(getActivity()));
- sendIntent.putExtra(Intent.ACTION_SEND, true);
- return sendIntent;
- }
- private void shareFile(OCFile file) {
- if (getActivity() instanceof FileDisplayActivity) {
- ((FileDisplayActivity) getActivity()).showDetails(file, 1);
- } else {
- fileOperationsHelper.showShareFile(file);
- }
- dismiss();
- }
- public void setFileOperationsHelper(FileOperationsHelper fileOperationsHelper) {
- this.fileOperationsHelper = fileOperationsHelper;
- }
- public interface SendShareDialogDownloader {
- void downloadFile(OCFile file, String packageName, String activityName);
- }
- }
|