Localize Conversation Intent creation.

This commit is contained in:
Alex Hart
2020-11-25 11:36:33 -04:00
parent 13c014215d
commit e57a35ab3e
18 changed files with 473 additions and 170 deletions

View File

@@ -20,32 +20,29 @@ package org.thoughtcrime.securesms.sharing;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.lifecycle.ViewModelProviders;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.lifecycle.ViewModelProviders;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.thoughtcrime.securesms.ContactSelectionListFragment;
import org.thoughtcrime.securesms.PassphraseRequiredActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.SearchToolbar;
import org.thoughtcrime.securesms.contacts.ContactsCursorLoader.DisplayMode;
import org.thoughtcrime.securesms.conversation.ConversationActivity;
import org.thoughtcrime.securesms.conversation.ConversationIntents;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.ThreadDatabase;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.mediasend.Media;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.stickers.StickerLocator;
import org.thoughtcrime.securesms.util.DynamicLanguage;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.DynamicTheme;
@@ -56,7 +53,6 @@ import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;
import org.whispersystems.libsignal.util.Pair;
import org.whispersystems.libsignal.util.guava.Optional;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
@@ -300,37 +296,30 @@ public class ShareActivity extends PassphraseRequiredActivity
}
private void openConversation(long threadId, @NonNull RecipientId recipientId, @Nullable ShareData shareData) {
Intent intent = new Intent(this, ConversationActivity.class);
CharSequence textExtra = getIntent().getCharSequenceExtra(Intent.EXTRA_TEXT);
ArrayList<Media> mediaExtra = getIntent().getParcelableArrayListExtra(ConversationActivity.MEDIA_EXTRA);
StickerLocator stickerExtra = getIntent().getParcelableExtra(ConversationActivity.STICKER_EXTRA);
boolean borderlessExtra = getIntent().getBooleanExtra(ConversationActivity.BORDERLESS_EXTRA, false);
intent.putExtra(ConversationActivity.TEXT_EXTRA, textExtra);
intent.putExtra(ConversationActivity.MEDIA_EXTRA, mediaExtra);
intent.putExtra(ConversationActivity.STICKER_EXTRA, stickerExtra);
intent.putExtra(ConversationActivity.BORDERLESS_EXTRA, borderlessExtra);
ShareIntents.Args args = ShareIntents.Args.from(getIntent());
ConversationIntents.Builder builder = ConversationIntents.createBuilder(this, recipientId, threadId)
.withMedia(args.getExtraMedia())
.withDraftText(args.getExtraText() != null ? args.getExtraText().toString() : null)
.withStickerLocator(args.getExtraSticker())
.asBorderless(args.isBorderless());
if (shareData != null && shareData.isForIntent()) {
Log.i(TAG, "Shared data is a single file.");
intent.setDataAndType(shareData.getUri(), shareData.getMimeType());
builder.withDataUri(shareData.getUri())
.withDataType(shareData.getMimeType());
} else if (shareData != null && shareData.isForMedia()) {
Log.i(TAG, "Shared data is set of media.");
intent.putExtra(ConversationActivity.MEDIA_EXTRA, shareData.getMedia());
builder.withMedia(shareData.getMedia());
} else if (shareData != null && shareData.isForPrimitive()) {
Log.i(TAG, "Shared data is a primitive type.");
} else if (shareData == null && stickerExtra != null) {
intent.setType(getIntent().getType());
} else if (shareData == null && args.getExtraSticker() != null) {
builder.withDataType(getIntent().getType());
} else {
Log.i(TAG, "Shared data was not external.");
}
intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, recipientId.serialize());
intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, threadId);
intent.putExtra(ConversationActivity.DISTRIBUTION_TYPE_EXTRA, ThreadDatabase.DistributionTypes.DEFAULT);
viewModel.onSuccessulShare();
startActivity(intent);
startActivity(builder.build());
}
}

View File

@@ -0,0 +1,120 @@
package org.thoughtcrime.securesms.sharing;
import android.content.Context;
import android.content.Intent;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.mediasend.Media;
import org.thoughtcrime.securesms.mms.Slide;
import org.thoughtcrime.securesms.stickers.StickerLocator;
import java.util.ArrayList;
import java.util.Collection;
public final class ShareIntents {
private static final String EXTRA_MEDIA = "extra_media";
private static final String EXTRA_BORDERLESS = "extra_borderless";
private static final String EXTRA_STICKER = "extra_sticker";
private ShareIntents() {
}
public static final class Args {
private final CharSequence extraText;
private final ArrayList<Media> extraMedia;
private final StickerLocator extraSticker;
private final boolean isBorderless;
public static Args from(@NonNull Intent intent) {
return new Args(intent.getStringExtra(Intent.EXTRA_TEXT),
intent.getParcelableArrayListExtra(EXTRA_MEDIA),
intent.getParcelableExtra(EXTRA_STICKER),
intent.getBooleanExtra(EXTRA_BORDERLESS, false));
}
private Args(@Nullable CharSequence extraText,
@Nullable ArrayList<Media> extraMedia,
@Nullable StickerLocator extraSticker,
boolean isBorderless)
{
this.extraText = extraText;
this.extraMedia = extraMedia;
this.extraSticker = extraSticker;
this.isBorderless = isBorderless;
}
public @Nullable ArrayList<Media> getExtraMedia() {
return extraMedia;
}
public @Nullable CharSequence getExtraText() {
return extraText;
}
public @Nullable StickerLocator getExtraSticker() {
return extraSticker;
}
public boolean isBorderless() {
return isBorderless;
}
}
public static final class Builder {
private final Context context;
private String extraText;
private ArrayList<Media> extraMedia;
private Slide slide;
public Builder(@NonNull Context context) {
this.context = context;
}
public @NonNull Builder setText(@NonNull CharSequence extraText) {
this.extraText = extraText.toString();
return this;
}
public @NonNull Builder setMedia(@NonNull Collection<Media> extraMedia) {
this.extraMedia = new ArrayList<>(extraMedia);
return this;
}
public @NonNull Builder setSlide(@NonNull Slide slide) {
this.slide = slide;
return this;
}
public @NonNull Intent build() {
if (slide != null && extraMedia != null) {
throw new IllegalStateException("Cannot create intent with both Slide and [Media]");
}
Intent intent = new Intent(context, ShareActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, extraText);
if (extraMedia != null) {
intent.putParcelableArrayListExtra(EXTRA_MEDIA, extraMedia);
} else if (slide != null) {
intent.putExtra(Intent.EXTRA_STREAM, slide.getUri());
intent.putExtra(EXTRA_BORDERLESS, slide.isBorderless());
if (slide.hasSticker()) {
intent.putExtra(EXTRA_STICKER, slide.asAttachment().getSticker());
intent.setType(slide.asAttachment().getContentType());
} else {
intent.setType(slide.getContentType());
}
}
return intent;
}
}
}