From 844dec06b14dd6473e203ac433569922744fb81e Mon Sep 17 00:00:00 2001 From: Jeffrey Starke Date: Fri, 2 May 2025 16:21:24 -0400 Subject: [PATCH] Delete old/unused sticker management v1 code. Deletes the old code related to sticker management v1 and removes the v2 prefix from the new classes. --- app/src/main/AndroidManifest.xml | 7 - .../conversation/v2/ConversationFragment.kt | 4 +- .../ImageEditorStickerSelectActivity.java | 4 +- .../stickers/StickerManagementActivity.java | 153 -------- ...vityV2.kt => StickerManagementActivity.kt} | 8 +- .../stickers/StickerManagementAdapter.java | 357 ------------------ .../StickerManagementItemTouchHelper.java | 58 --- .../stickers/StickerManagementRepository.kt | 24 +- .../stickers/StickerManagementViewModel.java | 83 ---- ...delV2.kt => StickerManagementViewModel.kt} | 2 +- .../sticker_management_empty_background.xml | 5 - .../drawable/symbol_check_circle_fill_24.xml | 9 - .../layout/sticker_management_activity.xml | 16 - .../layout/sticker_management_empty_item.xml | 33 -- .../layout/sticker_management_header_item.xml | 15 - .../sticker_management_sticker_item.xml | 125 ------ app/src/main/res/values/dimens.xml | 2 - app/src/main/res/values/strings.xml | 16 +- 18 files changed, 16 insertions(+), 905 deletions(-) delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivity.java rename app/src/main/java/org/thoughtcrime/securesms/stickers/{StickerManagementActivityV2.kt => StickerManagementActivity.kt} (99%) delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementAdapter.java delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementItemTouchHelper.java delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModel.java rename app/src/main/java/org/thoughtcrime/securesms/stickers/{StickerManagementViewModelV2.kt => StickerManagementViewModel.kt} (99%) delete mode 100644 app/src/main/res/drawable/sticker_management_empty_background.xml delete mode 100644 app/src/main/res/drawable/symbol_check_circle_fill_24.xml delete mode 100644 app/src/main/res/layout/sticker_management_activity.xml delete mode 100644 app/src/main/res/layout/sticker_management_empty_item.xml delete mode 100644 app/src/main/res/layout/sticker_management_header_item.xml delete mode 100644 app/src/main/res/layout/sticker_management_sticker_item.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e8a6e3ca87..51faee0eeb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -878,13 +878,6 @@ android:exported="false"/> - - diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index 116110f96d..c9647774f9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -298,7 +298,7 @@ import org.thoughtcrime.securesms.safety.SafetyNumberBottomSheet import org.thoughtcrime.securesms.sms.MessageSender import org.thoughtcrime.securesms.stickers.StickerEventListener import org.thoughtcrime.securesms.stickers.StickerLocator -import org.thoughtcrime.securesms.stickers.StickerManagementActivityV2 +import org.thoughtcrime.securesms.stickers.StickerManagementActivity import org.thoughtcrime.securesms.stickers.StickerPackInstallEvent import org.thoughtcrime.securesms.stickers.StickerPackPreviewActivity import org.thoughtcrime.securesms.stories.StoryViewerArgs @@ -828,7 +828,7 @@ class ConversationFragment : } override fun onStickerManagementClicked() { - startActivity(StickerManagementActivityV2.createIntent(requireContext())) + startActivity(StickerManagementActivity.createIntent(requireContext())) container.hideInput() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorStickerSelectActivity.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorStickerSelectActivity.java index 48c5b5e7e9..c250415580 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorStickerSelectActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorStickerSelectActivity.java @@ -21,7 +21,7 @@ import org.thoughtcrime.securesms.keyboard.sticker.StickerSearchDialogFragment; import org.thoughtcrime.securesms.scribbles.stickers.FeatureSticker; import org.thoughtcrime.securesms.scribbles.stickers.ScribbleStickersFragment; import org.thoughtcrime.securesms.stickers.StickerEventListener; -import org.thoughtcrime.securesms.stickers.StickerManagementActivityV2; +import org.thoughtcrime.securesms.stickers.StickerManagementActivity; import org.thoughtcrime.securesms.util.ViewUtil; public final class ImageEditorStickerSelectActivity extends AppCompatActivity implements StickerEventListener, MediaKeyboard.MediaKeyboardListener, StickerKeyboardPageFragment.Callback, ScribbleStickersFragment.Callback { @@ -66,7 +66,7 @@ public final class ImageEditorStickerSelectActivity extends AppCompatActivity im @Override public void onStickerManagementClicked() { - startActivity(StickerManagementActivityV2.createIntent(ImageEditorStickerSelectActivity.this)); + startActivity(StickerManagementActivity.createIntent(ImageEditorStickerSelectActivity.this)); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivity.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivity.java deleted file mode 100644 index 9f675efed4..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivity.java +++ /dev/null @@ -1,153 +0,0 @@ -package org.thoughtcrime.securesms.stickers; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.view.MenuItem; - -import androidx.annotation.NonNull; -import androidx.lifecycle.ViewModelProvider; -import androidx.recyclerview.widget.ItemTouchHelper; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.bumptech.glide.Glide; - -import org.thoughtcrime.securesms.PassphraseRequiredActivity; -import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment; -import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragmentArgs; -import org.thoughtcrime.securesms.sharing.MultiShareArgs; -import org.thoughtcrime.securesms.util.DeviceProperties; -import org.thoughtcrime.securesms.util.DynamicTheme; - -import java.util.Collections; - -/** - * Allows the user to view and manage (install, uninstall, etc) their stickers. - */ -public final class StickerManagementActivity extends PassphraseRequiredActivity implements StickerManagementAdapter.EventListener { - - private final DynamicTheme dynamicTheme = new DynamicTheme(); - - private RecyclerView list; - private StickerManagementAdapter adapter; - private StickerManagementViewModel viewModel; - - public static Intent getIntent(@NonNull Context context) { - return new Intent(context, StickerManagementActivity.class); - } - - @Override - protected void onPreCreate() { - super.onPreCreate(); - dynamicTheme.onCreate(this); - } - - @Override - protected void onCreate(Bundle savedInstanceState, boolean ready) { - setContentView(R.layout.sticker_management_activity); - - initView(); - initToolbar(); - initViewModel(); - - getSupportFragmentManager().setFragmentResultListener(MultiselectForwardFragment.RESULT_KEY, this, (requestKey, result) -> { - if (result.getBoolean(MultiselectForwardFragment.RESULT_SENT, false)) { - finish(); - } - }); - } - - @Override - protected void onStart() { - super.onStart(); - viewModel.onVisible(); - } - - @Override - protected void onResume() { - super.onResume(); - dynamicTheme.onResume(this); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == android.R.id.home) { - onBackPressed(); - return true; - } - return super.onOptionsItemSelected(item); - } - - @Override - public void onStickerPackClicked(@NonNull String packId, @NonNull String packKey) { - startActivity(StickerPackPreviewActivity.getIntent(packId, packKey)); - } - - @Override - public void onStickerPackUninstallClicked(@NonNull String packId, @NonNull String packKey) { - viewModel.onStickerPackUninstallClicked(packId, packKey); - } - - @Override - public void onStickerPackInstallClicked(@NonNull String packId, @NonNull String packKey) { - viewModel.onStickerPackInstallClicked(packId, packKey); - } - - @Override - public void onStickerPackShareClicked(@NonNull String packId, @NonNull String packKey) { - MultiselectForwardFragment.showBottomSheet( - getSupportFragmentManager(), - new MultiselectForwardFragmentArgs( - Collections.singletonList(new MultiShareArgs.Builder() - .withDraftText(StickerUrl.createShareLink(packId, packKey)) - .build()), - R.string.MultiselectForwardFragment__share_with - ) - ); - } - - private void initView() { - this.list = findViewById(R.id.sticker_management_list); - this.adapter = new StickerManagementAdapter(Glide.with(this), this, DeviceProperties.shouldAllowApngStickerAnimation(this)); - - list.setLayoutManager(new LinearLayoutManager(this)); - list.setAdapter(adapter); - new ItemTouchHelper(new StickerManagementItemTouchHelper(new ItemTouchCallback())).attachToRecyclerView(list); - } - - private void initToolbar() { - getSupportActionBar().setTitle(R.string.StickerManagementActivity_stickers); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } - - private void initViewModel() { - StickerManagementRepository repository = StickerManagementRepository.INSTANCE; - viewModel = new ViewModelProvider(this, new StickerManagementViewModel.Factory(getApplication(), repository)).get(StickerManagementViewModel.class); - - viewModel.init(); - viewModel.getStickerPacks().observe(this, packResult -> { - if (packResult == null) return; - - adapter.setPackLists(packResult.getInstalledPacks(), packResult.getAvailablePacks(), packResult.getBlessedPacks()); - }); - } - - private class ItemTouchCallback implements StickerManagementItemTouchHelper.Callback { - @Override - public boolean onMove(int start, int end) { - return adapter.onMove(start, end); - } - - @Override - public boolean isMovable(int position) { - return adapter.isMovable(position); - } - - @Override - public void onMoveCommitted() { - viewModel.onOrderChanged(adapter.getInstalledPacksInOrder()); - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivity.kt similarity index 99% rename from app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivityV2.kt rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivity.kt index 0fccec7f81..53c821ea7d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivity.kt @@ -98,13 +98,13 @@ import java.text.NumberFormat /** * Displays all of the available and installed sticker packs, enabling installation, uninstallation, and sorting. */ -class StickerManagementActivityV2 : PassphraseRequiredActivity() { +class StickerManagementActivity : PassphraseRequiredActivity() { companion object { @JvmStatic - fun createIntent(context: Context): Intent = Intent(context, StickerManagementActivityV2::class.java) + fun createIntent(context: Context): Intent = Intent(context, StickerManagementActivity::class.java) } - private val viewModel by viewModel { StickerManagementViewModelV2() } + private val viewModel by viewModel { StickerManagementViewModel() } override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) { super.onCreate(savedInstanceState, ready) @@ -311,7 +311,7 @@ private fun TopAppBar( onSetMultiSelectModeEnabled: (Boolean) -> Unit ) { Scaffolds.DefaultTopAppBar( - title = stringResource(R.string.StickerManagementActivity_stickers), + title = stringResource(R.string.StickerManagement_title_stickers), titleContent = { _, title -> Text(text = title, style = MaterialTheme.typography.titleLarge) }, navigationIconPainter = painterResource(R.drawable.symbol_arrow_start_24), navigationContentDescription = stringResource(R.string.DefaultTopAppBar__navigate_up_content_description), diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementAdapter.java deleted file mode 100644 index 9be3242b0f..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementAdapter.java +++ /dev/null @@ -1,357 +0,0 @@ -package org.thoughtcrime.securesms.stickers; - -import android.content.Context; -import android.graphics.PorterDuff; -import android.graphics.drawable.Drawable; -import android.text.SpannableString; -import android.text.SpannableStringBuilder; -import android.text.style.ImageSpan; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.StringRes; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.bumptech.glide.RequestManager; -import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; - -import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.components.emoji.EmojiTextView; -import org.thoughtcrime.securesms.database.model.StickerPackRecord; -import org.thoughtcrime.securesms.glide.cache.ApngOptions; -import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; -import org.thoughtcrime.securesms.util.DrawableUtil; -import org.thoughtcrime.securesms.util.ViewUtil; -import org.thoughtcrime.securesms.util.adapter.SectionedRecyclerViewAdapter; -import org.thoughtcrime.securesms.util.adapter.StableIdGenerator; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -final class StickerManagementAdapter extends SectionedRecyclerViewAdapter { - - private static final String TAG_YOUR_STICKERS = "YourStickers"; - private static final String TAG_MESSAGE_STICKERS = "MessageStickers"; - private static final String TAG_BLESSED_STICKERS = "BlessedStickers"; - - private final RequestManager requestManager; - private final EventListener eventListener; - private final boolean allowApngAnimation; - - private final List sections = new ArrayList(3) {{ - StickerSection yourStickers = new StickerSection(TAG_YOUR_STICKERS, - R.string.StickerManagement_installed_stickers_header, - R.string.StickerManagementAdapter_no_stickers_installed, - new ArrayList<>(), - 0); - StickerSection messageStickers = new StickerSection(TAG_MESSAGE_STICKERS, - R.string.StickerManagement_stickers_you_received_header, - R.string.StickerManagementAdapter_stickers_from_incoming_messages_will_appear_here, - new ArrayList<>(), - yourStickers.size()); - - add(yourStickers); - add(messageStickers); - }}; - - StickerManagementAdapter(@NonNull RequestManager requestManager, @NonNull EventListener eventListener, boolean allowApngAnimation) { - this.requestManager = requestManager; - this.eventListener = eventListener; - this.allowApngAnimation = allowApngAnimation; - } - - @Override - protected @NonNull List getSections() { - return sections; - } - - @Override - protected @NonNull RecyclerView.ViewHolder createHeaderViewHolder(@NonNull ViewGroup parent) { - return new HeaderViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.sticker_management_header_item, parent, false)); - } - - @Override - protected @NonNull RecyclerView.ViewHolder createContentViewHolder(@NonNull ViewGroup parent) { - return new StickerViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.sticker_management_sticker_item, parent, false)); - } - - @Override - protected @NonNull RecyclerView.ViewHolder createEmptyViewHolder(@NonNull ViewGroup viewGroup) { - return new EmptyViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.sticker_management_empty_item, viewGroup, false)); - } - - @Override - public void bindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, @NonNull StickerSection section, int localPosition) { - section.bindViewHolder(viewHolder, localPosition, requestManager, eventListener, allowApngAnimation); - } - - @Override - public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) { - if (holder instanceof StickerViewHolder) { - ((StickerViewHolder) holder).recycle(); - } - } - - boolean onMove(int start, int end) { - StickerSection installed = sections.get(0); - - if (!installed.isContent(start)) { - return false; - } - - if (!installed.isContent(end)) { - return false; - } - - installed.swap(start, end); - notifyItemMoved(start, end); - return true; - } - - boolean isMovable(int position) { - return sections.get(0).isContent(position); - } - - @NonNull List getInstalledPacksInOrder() { - return sections.get(0).records; - } - - void setPackLists(@NonNull List installedPacks, - @NonNull List availablePacks, - @NonNull List blessedPacks) - { - StickerSection yourStickers = new StickerSection(TAG_YOUR_STICKERS, - R.string.StickerManagement_installed_stickers_header, - R.string.StickerManagementAdapter_no_stickers_installed, - installedPacks, - 0); - StickerSection blessedStickers = new StickerSection(TAG_BLESSED_STICKERS, - R.string.StickerManagement_signal_artist_series_header, - 0, - blessedPacks, - yourStickers.size()); - StickerSection messageStickers = new StickerSection(TAG_MESSAGE_STICKERS, - R.string.StickerManagement_stickers_you_received_header, - R.string.StickerManagementAdapter_stickers_from_incoming_messages_will_appear_here, - availablePacks, - yourStickers.size() + (blessedPacks.isEmpty() ? 0 : blessedStickers.size())); - - sections.clear(); - sections.add(yourStickers); - - if (!blessedPacks.isEmpty()) { - sections.add(blessedStickers); - } - - sections.add(messageStickers); - - notifyDataSetChanged(); - } - - public static class StickerSection extends SectionedRecyclerViewAdapter.Section { - - private static final String STABLE_ID_HEADER = "header"; - private static final String STABLE_ID_TEXT = "text"; - - private final String tag; - private final int titleResId; - private final int emptyResId; - private final List records; - - StickerSection(@NonNull String tag, - @StringRes int titleResId, - @StringRes int emptyResId, - @NonNull List records, - int offset) - { - super(offset); - - this.tag = tag; - this.titleResId = titleResId; - this.emptyResId = emptyResId; - this.records = records; - } - - @Override - public boolean hasEmptyState() { - return true; - } - - @Override - public int getContentSize() { - return records.size(); - } - - @Override - public long getItemId(@NonNull StableIdGenerator idGenerator, int globalPosition) { - int localPosition = getLocalPosition(globalPosition); - - if (localPosition == 0) { - return idGenerator.getId(tag + "_" + STABLE_ID_HEADER); - } else if (records.isEmpty()) { - return idGenerator.getId(tag + "_" + STABLE_ID_TEXT); - } else { - return idGenerator.getId(records.get(localPosition - 1).packId); - } - } - - void bindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, - int localPosition, - @NonNull RequestManager requestManager, - @NonNull EventListener eventListener, - boolean allowApngAnimation) - { - if (localPosition == 0) { - ((HeaderViewHolder) viewHolder).bind(titleResId); - } else if (records.isEmpty()) { - ((EmptyViewHolder) viewHolder).bind(emptyResId); - } else { - ((StickerViewHolder) viewHolder).bind(requestManager, eventListener, records.get(localPosition - 1), localPosition == records.size(), allowApngAnimation); - } - } - - void swap(int start, int end) { - int localStart = getLocalPosition(start) - 1; - int localEnd = getLocalPosition(end) - 1; - - if (localStart < localEnd) { - for (int i = localStart; i < localEnd; i++) { - Collections.swap(records, i, i + 1); - } - } else { - for (int i = localStart; i > localEnd; i--) { - Collections.swap(records, i, i - 1); - } - } - } - } - - static class StickerViewHolder extends RecyclerView.ViewHolder { - - private final ImageView cover; - private final EmojiTextView title; - private final TextView author; - private final View divider; - private final View actionButton; - private final ImageView actionButtonImage; - private final View shareButton; - private final ImageView shareButtonImage; - private final CharSequence blessedBadge; - - StickerViewHolder(@NonNull View itemView) { - super(itemView); - - this.cover = itemView.findViewById(R.id.sticker_management_cover); - this.title = itemView.findViewById(R.id.sticker_management_title); - this.author = itemView.findViewById(R.id.sticker_management_author); - this.divider = itemView.findViewById(R.id.sticker_management_divider); - this.actionButton = itemView.findViewById(R.id.sticker_management_action_button); - this.actionButtonImage = itemView.findViewById(R.id.sticker_management_action_button_image); - this.shareButton = itemView.findViewById(R.id.sticker_management_share_button); - this.shareButtonImage = itemView.findViewById(R.id.sticker_management_share_button_image); - this.blessedBadge = buildBlessedBadge(itemView.getContext()); - } - - void bind(@NonNull RequestManager requestManager, - @NonNull EventListener eventListener, - @NonNull StickerPackRecord stickerPack, - boolean lastInList, - boolean allowApngAnimation) - { - SpannableStringBuilder titleBuilder = new SpannableStringBuilder(stickerPack.titleOptional.orElse(itemView.getResources().getString(R.string.StickerManagementAdapter_untitled))); - if (BlessedPacks.contains(stickerPack.packId)) { - titleBuilder.append(blessedBadge); - } - - title.setText(titleBuilder); - author.setText(stickerPack.authorOptional.orElse(itemView.getResources().getString(R.string.StickerManagement_author_unknown))); - divider.setVisibility(lastInList ? View.GONE : View.VISIBLE); - - requestManager.load(new DecryptableUri(stickerPack.cover.uri)) - .transition(DrawableTransitionOptions.withCrossFade()) - .fitCenter() - .set(ApngOptions.ANIMATE, allowApngAnimation) - .into(cover); - - if (stickerPack.isInstalled) { - actionButtonImage.setImageResource(R.drawable.ic_x); - actionButton.setOnClickListener(v -> eventListener.onStickerPackUninstallClicked(stickerPack.packId, stickerPack.packKey)); - - shareButton.setVisibility(View.VISIBLE); - shareButtonImage.setVisibility(View.VISIBLE); - shareButton.setOnClickListener(v -> eventListener.onStickerPackShareClicked(stickerPack.packId, stickerPack.packKey)); - } else { - actionButtonImage.setImageResource(R.drawable.symbol_arrow_down_24); - actionButton.setOnClickListener(v -> eventListener.onStickerPackInstallClicked(stickerPack.packId, stickerPack.packKey)); - - shareButton.setVisibility(View.GONE); - shareButtonImage.setVisibility(View.GONE); - shareButton.setOnClickListener(null); - } - - itemView.setOnClickListener(v -> eventListener.onStickerPackClicked(stickerPack.packId, stickerPack.packKey)); - } - - void recycle() { - actionButton.setOnClickListener(null); - shareButton.setOnClickListener(null); - itemView.setOnClickListener(null); - } - - private static @NonNull CharSequence buildBlessedBadge(@NonNull Context context) { - SpannableString badgeSpan = new SpannableString(" "); - Drawable badge = ContextCompat.getDrawable(context, R.drawable.symbol_check_circle_fill_24); - - badge.setBounds(0, 0, ViewUtil.dpToPx(18), ViewUtil.dpToPx(18)); - DrawableUtil.tint(badge, ContextCompat.getColor(context, R.color.core_ultramarine)); - badgeSpan.setSpan(new ImageSpan(badge), 1, badgeSpan.length(), 0); - - return badgeSpan; - } - } - - static class HeaderViewHolder extends RecyclerView.ViewHolder { - - private final TextView titleView; - - HeaderViewHolder(@NonNull View itemView) { - super(itemView); - - this.titleView = itemView.findViewById(R.id.sticker_management_header); - } - - void bind(@StringRes int title) { - titleView.setText(title); - } - } - - static class EmptyViewHolder extends RecyclerView.ViewHolder { - - private final TextView text; - - EmptyViewHolder(@NonNull View itemView) { - super(itemView); - - this.text = itemView.findViewById(R.id.sticker_management_empty_text); - } - - void bind(@StringRes int title) { - text.setText(title); - } - } - - interface EventListener { - void onStickerPackClicked(@NonNull String packId, @NonNull String packKey); - void onStickerPackUninstallClicked(@NonNull String packId, @NonNull String packKey); - void onStickerPackInstallClicked(@NonNull String packId, @NonNull String packKey); - void onStickerPackShareClicked(@NonNull String packId, @NonNull String packKey); - } - - private static class NoSectionException extends IllegalStateException {} -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementItemTouchHelper.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementItemTouchHelper.java deleted file mode 100644 index 186402d6ef..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementItemTouchHelper.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.thoughtcrime.securesms.stickers; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.ItemTouchHelper; -import androidx.recyclerview.widget.RecyclerView; - -public class StickerManagementItemTouchHelper extends ItemTouchHelper.Callback { - - private final Callback callback; - - public StickerManagementItemTouchHelper(Callback callback) { - this.callback = callback; - } - - @Override - public boolean isLongPressDragEnabled() { - return true; - } - - @Override - public boolean isItemViewSwipeEnabled() { - return false; - } - - @Override - public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { - if (callback.isMovable(viewHolder.getAdapterPosition())) { - int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; - return makeMovementFlags(dragFlags, 0); - } else { - return 0; - } - } - - @Override - public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { - return callback.onMove(viewHolder.getAdapterPosition(), target.getAdapterPosition()); - } - - @Override - public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { - super.clearView(recyclerView, viewHolder); - callback.onMoveCommitted(); - } - - @Override - public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { - } - - public interface Callback { - /** - * @return True if both the start and end positions are valid, and therefore the move will occur. - */ - boolean onMove(int start, int end); - void onMoveCommitted(); - boolean isMovable(int position); - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementRepository.kt index f59237efa4..8bae4cb676 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementRepository.kt @@ -6,7 +6,6 @@ package org.thoughtcrime.securesms.stickers import androidx.annotation.Discouraged -import androidx.annotation.WorkerThread import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.awaitClose @@ -39,14 +38,6 @@ object StickerManagementRepository { private val attachmentsDbTable: AttachmentTable = SignalDatabase.attachments private val coroutineScope: CoroutineScope = CoroutineScope(Dispatchers.IO) - @Discouraged("For Java use only. In Kotlin, use the getStickerPacks() overload that returns a Flow instead.") - @WorkerThread - fun getStickerPacks(callback: Callback) { - coroutineScope.launch { - callback.onComplete(loadStickerPacks()) - } - } - /** * Emits the sticker packs along with any updates. */ @@ -91,13 +82,6 @@ object StickerManagementRepository { } } - @Discouraged("For Java use only. In Kotlin, use deleteOrphanedStickerPacks() instead.") - fun deleteOrphanedStickerPacksAsync() { - coroutineScope.launch { - deleteOrphanedStickerPacks() - } - } - suspend fun deleteOrphanedStickerPacks() = withContext(Dispatchers.IO) { stickersDbTable.deleteOrphanedPacks() } @@ -112,6 +96,7 @@ object StickerManagementRepository { } } + @Discouraged("For Java use only. In Kotlin, use installStickerPack() instead.") fun installStickerPackAsync(packId: String, packKey: String, notify: Boolean) { coroutineScope.launch { installStickerPack(StickerPackId(packId), StickerPackKey(packKey), notify) @@ -145,13 +130,6 @@ object StickerManagementRepository { } } - @Discouraged("For Java use only. In Kotlin, use setStickerPackOrder() instead.") - fun setStickerPacksOrderAsync(packsInOrder: List) { - coroutineScope.launch { - setStickerPacksOrder(packsInOrder) - } - } - suspend fun setStickerPacksOrder(packsInOrder: List) = withContext(Dispatchers.IO) { stickersDbTable.updatePackOrder(packsInOrder) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModel.java deleted file mode 100644 index 71b1dbe891..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModel.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.thoughtcrime.securesms.stickers; - -import android.app.Application; - -import androidx.annotation.NonNull; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; -import androidx.lifecycle.ViewModelProvider; - -import org.thoughtcrime.securesms.database.DatabaseObserver; -import org.thoughtcrime.securesms.database.model.StickerPackRecord; -import org.thoughtcrime.securesms.dependencies.AppDependencies; - -import java.util.List; - -final class StickerManagementViewModel extends ViewModel { - - private final Application application; - private final StickerManagementRepository repository; - private final MutableLiveData packs; - private final DatabaseObserver.Observer observer; - - private StickerManagementViewModel(@NonNull Application application, @NonNull StickerManagementRepository repository) { - this.application = application; - this.repository = repository; - this.packs = new MutableLiveData<>(); - this.observer = () -> { - repository.deleteOrphanedStickerPacksAsync(); - repository.getStickerPacks(packs::postValue); - }; - - AppDependencies.getDatabaseObserver().registerStickerPackObserver(observer); - } - - void init() { - repository.deleteOrphanedStickerPacksAsync(); - repository.fetchUnretrievedReferencePacks(); - } - - void onVisible() { - repository.deleteOrphanedStickerPacksAsync(); - } - - @NonNull LiveData getStickerPacks() { - repository.getStickerPacks(packs::postValue); - return packs; - } - - void onStickerPackUninstallClicked(@NonNull String packId, @NonNull String packKey) { - repository.uninstallStickerPackAsync(packId, packKey); - } - - void onStickerPackInstallClicked(@NonNull String packId, @NonNull String packKey) { - repository.installStickerPackAsync(packId, packKey, false); - } - - void onOrderChanged(List packsInOrder) { - repository.setStickerPacksOrderAsync(packsInOrder); - } - - @Override - protected void onCleared() { - AppDependencies.getDatabaseObserver().unregisterObserver(observer); - } - - static class Factory extends ViewModelProvider.NewInstanceFactory { - - private final Application application; - private final StickerManagementRepository repository; - - Factory(@NonNull Application application, @NonNull StickerManagementRepository repository) { - this.application = application; - this.repository = repository; - } - - @Override - public @NonNull T create(@NonNull Class modelClass) { - //noinspection ConstantConditions - return modelClass.cast(new StickerManagementViewModel(application, repository)); - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModelV2.kt b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModel.kt similarity index 99% rename from app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModelV2.kt rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModel.kt index 17b5c28dfb..f0c8cb3c36 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModelV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModel.kt @@ -21,7 +21,7 @@ import org.thoughtcrime.securesms.database.model.StickerPackKey import org.thoughtcrime.securesms.database.model.StickerPackRecord import org.thoughtcrime.securesms.stickers.AvailableStickerPack.DownloadStatus -class StickerManagementViewModelV2 : ViewModel() { +class StickerManagementViewModel : ViewModel() { private val stickerManagementRepo = StickerManagementRepository private val _uiState = MutableStateFlow(StickerManagementUiState()) diff --git a/app/src/main/res/drawable/sticker_management_empty_background.xml b/app/src/main/res/drawable/sticker_management_empty_background.xml deleted file mode 100644 index 63855710d8..0000000000 --- a/app/src/main/res/drawable/sticker_management_empty_background.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/symbol_check_circle_fill_24.xml b/app/src/main/res/drawable/symbol_check_circle_fill_24.xml deleted file mode 100644 index 424b509e30..0000000000 --- a/app/src/main/res/drawable/symbol_check_circle_fill_24.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/layout/sticker_management_activity.xml b/app/src/main/res/layout/sticker_management_activity.xml deleted file mode 100644 index cb86910410..0000000000 --- a/app/src/main/res/layout/sticker_management_activity.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/sticker_management_empty_item.xml b/app/src/main/res/layout/sticker_management_empty_item.xml deleted file mode 100644 index 23258536b4..0000000000 --- a/app/src/main/res/layout/sticker_management_empty_item.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/layout/sticker_management_header_item.xml b/app/src/main/res/layout/sticker_management_header_item.xml deleted file mode 100644 index f320ffc273..0000000000 --- a/app/src/main/res/layout/sticker_management_header_item.xml +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/app/src/main/res/layout/sticker_management_sticker_item.xml b/app/src/main/res/layout/sticker_management_sticker_item.xml deleted file mode 100644 index d2bcb3167c..0000000000 --- a/app/src/main/res/layout/sticker_management_sticker_item.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index c454c6e43a..bf8b255101 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -107,8 +107,6 @@ 16dp 72dp - 16dp - 96dp 16dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c687862a18..b219b64a8c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2798,10 +2798,9 @@ %s reset the secure session. Duplicate message. - - Stickers - - + + Stickers + %1$s selected %1$s selected @@ -2810,11 +2809,11 @@ Available Installed - + No sticker packs are available - + No sticker packs are installed - + Unknown Installed stickers @@ -2845,7 +2844,6 @@ %1$s sticker packs removed. - Forward @@ -2873,8 +2871,6 @@ Exit selection mode and clear selections - No stickers installed - Stickers from incoming messages will appear here Untitled