diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/Material3SearchToolbar.kt b/app/src/main/java/org/thoughtcrime/securesms/components/Material3SearchToolbar.kt deleted file mode 100644 index e9503f7d34..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/components/Material3SearchToolbar.kt +++ /dev/null @@ -1,92 +0,0 @@ -package org.thoughtcrime.securesms.components - -import android.content.Context -import android.graphics.PointF -import android.util.AttributeSet -import android.view.View -import android.view.ViewAnimationUtils -import android.widget.EditText -import androidx.annotation.StringRes -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.animation.addListener -import androidx.core.widget.addTextChangedListener -import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.util.TextSecurePreferences -import org.thoughtcrime.securesms.util.ViewUtil -import org.thoughtcrime.securesms.util.setIncognitoKeyboardEnabled -import org.thoughtcrime.securesms.util.visible - -/** - * Search Toolbar following the Signal Material3 design spec. - */ -class Material3SearchToolbar @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null -) : ConstraintLayout(context, attrs) { - - var listener: Listener? = null - - private val input: EditText - - private val circularRevealPoint = PointF() - - init { - inflate(context, R.layout.material3_serarch_toolbar, this) - - input = findViewById(R.id.search_input) - - val close = findViewById(R.id.search_close) - val clear = findViewById(R.id.search_clear) - - close.setOnClickListener { collapse() } - clear.setOnClickListener { input.setText("") } - - input.setIncognitoKeyboardEnabled(TextSecurePreferences.isIncognitoKeyboardEnabled(context)) - - input.addTextChangedListener(afterTextChanged = { - clear.visible = !it.isNullOrBlank() - listener?.onSearchTextChange(it?.toString() ?: "") - }) - } - - fun setSearchInputHint(@StringRes hintStringRes: Int) { - input.setHint(hintStringRes) - } - - fun display(x: Float, y: Float) { - if (!visible) { - circularRevealPoint.set(x, y) - - val animator = ViewAnimationUtils.createCircularReveal(this, x.toInt(), y.toInt(), 0f, width.toFloat()) - animator.duration = 400 - - visibility = VISIBLE - ViewUtil.focusAndShowKeyboard(input) - animator.start() - } - } - - fun collapse() { - if (visibility == VISIBLE) { - listener?.onSearchClosed() - ViewUtil.hideKeyboard(context, input) - - val animator = ViewAnimationUtils.createCircularReveal(this, circularRevealPoint.x.toInt(), circularRevealPoint.y.toInt(), width.toFloat(), 0f) - animator.duration = 400 - - animator.addListener(onEnd = { - visibility = INVISIBLE - }) - animator.start() - } - } - - fun clearText() { - input.setText("") - } - - interface Listener { - fun onSearchTextChange(text: String) - fun onSearchClosed() - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java b/app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java deleted file mode 100644 index f92aaa1bd0..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java +++ /dev/null @@ -1,167 +0,0 @@ -package org.thoughtcrime.securesms.components; - - -import android.content.ContentUris; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.os.Bundle; -import android.provider.MediaStore; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.FrameLayout; -import android.widget.ImageView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.loader.app.LoaderManager; -import androidx.loader.content.Loader; -import androidx.recyclerview.widget.DefaultItemAnimator; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.load.Key; -import com.bumptech.glide.load.engine.DiskCacheStrategy; -import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; -import com.bumptech.glide.signature.MediaStoreSignature; - -import org.signal.core.util.logging.Log; -import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.database.CursorRecyclerViewAdapter; -import org.thoughtcrime.securesms.database.loaders.RecentPhotosLoader; - -public class RecentPhotoViewRail extends FrameLayout implements LoaderManager.LoaderCallbacks { - - @NonNull private final RecyclerView recyclerView; - @Nullable private OnItemClickedListener listener; - - public RecentPhotoViewRail(Context context) { - this(context, null); - } - - public RecentPhotoViewRail(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public RecentPhotoViewRail(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - - inflate(context, R.layout.recent_photo_view, this); - - this.recyclerView = findViewById(R.id.photo_list); - this.recyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)); - this.recyclerView.setItemAnimator(new DefaultItemAnimator()); - } - - public void setListener(@Nullable OnItemClickedListener listener) { - this.listener = listener; - - if (this.recyclerView.getAdapter() != null) { - ((RecentPhotoAdapter)this.recyclerView.getAdapter()).setListener(listener); - } - } - - @Override - public @NonNull Loader onCreateLoader(int id, Bundle args) { - return new RecentPhotosLoader(getContext()); - } - - @Override - public void onLoadFinished(@NonNull Loader loader, Cursor data) { - this.recyclerView.setAdapter(new RecentPhotoAdapter(getContext(), data, RecentPhotosLoader.BASE_URL, listener)); - } - - @Override - public void onLoaderReset(@NonNull Loader loader) { - ((CursorRecyclerViewAdapter)this.recyclerView.getAdapter()).changeCursor(null); - } - - private static class RecentPhotoAdapter extends CursorRecyclerViewAdapter { - - @SuppressWarnings("unused") - private static final String TAG = Log.tag(RecentPhotoAdapter.class); - - @NonNull private final Uri baseUri; - @Nullable private OnItemClickedListener clickedListener; - - private RecentPhotoAdapter(@NonNull Context context, @NonNull Cursor cursor, @NonNull Uri baseUri, @Nullable OnItemClickedListener listener) { - super(context, cursor); - this.baseUri = baseUri; - this.clickedListener = listener; - } - - @Override - public RecentPhotoViewHolder onCreateItemViewHolder(ViewGroup parent, int viewType) { - View itemView = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.recent_photo_view_item, parent, false); - - return new RecentPhotoViewHolder(itemView); - } - - @Override - public void onBindItemViewHolder(RecentPhotoViewHolder viewHolder, @NonNull Cursor cursor) { - viewHolder.imageView.setImageDrawable(null); - - long rowId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns._ID)); - long dateTaken = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATE_TAKEN)); - long dateModified = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATE_MODIFIED)); - String mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.MIME_TYPE)); - String bucketId = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.BUCKET_ID)); - int orientation = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.ORIENTATION)); - long size = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.SIZE)); - int width = cursor.getInt(cursor.getColumnIndexOrThrow(getWidthColumn(orientation))); - int height = cursor.getInt(cursor.getColumnIndexOrThrow(getHeightColumn(orientation))); - - final Uri uri = ContentUris.withAppendedId(RecentPhotosLoader.BASE_URL, rowId); - - Key signature = new MediaStoreSignature(mimeType, dateModified, orientation); - - Glide.with(getContext().getApplicationContext()) - .load(uri) - .signature(signature) - .diskCacheStrategy(DiskCacheStrategy.NONE) - .transition(DrawableTransitionOptions.withCrossFade()) - .centerCrop() - .into(viewHolder.imageView); - - viewHolder.imageView.setOnClickListener(v -> { - if (clickedListener != null) clickedListener.onItemClicked(uri, mimeType, bucketId, dateTaken, width, height, size); - }); - - } - - @SuppressWarnings("SuspiciousNameCombination") - private String getWidthColumn(int orientation) { - if (orientation == 0 || orientation == 180) return MediaStore.Images.ImageColumns.WIDTH; - else return MediaStore.Images.ImageColumns.HEIGHT; - } - - @SuppressWarnings("SuspiciousNameCombination") - private String getHeightColumn(int orientation) { - if (orientation == 0 || orientation == 180) return MediaStore.Images.ImageColumns.HEIGHT; - else return MediaStore.Images.ImageColumns.WIDTH; - } - - public void setListener(@Nullable OnItemClickedListener listener) { - this.clickedListener = listener; - } - - static class RecentPhotoViewHolder extends RecyclerView.ViewHolder { - - ImageView imageView; - - RecentPhotoViewHolder(View itemView) { - super(itemView); - - this.imageView = itemView.findViewById(R.id.thumbnail); - } - } - } - - public interface OnItemClickedListener { - void onItemClicked(Uri uri, String mimeType, String bucketId, long dateTaken, int width, int height, long size); - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/SearchToolbar.java b/app/src/main/java/org/thoughtcrime/securesms/components/SearchToolbar.java deleted file mode 100644 index c0092cfe69..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/components/SearchToolbar.java +++ /dev/null @@ -1,157 +0,0 @@ -package org.thoughtcrime.securesms.components; - - -import android.animation.Animator; -import android.content.Context; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.util.AttributeSet; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewAnimationUtils; -import android.widget.EditText; -import android.widget.LinearLayout; - -import androidx.annotation.MainThread; -import androidx.annotation.Nullable; -import androidx.appcompat.widget.SearchView; -import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; - -import org.signal.core.ui.compose.SignalIcons; -import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.animation.AnimationCompleteListener; -import org.thoughtcrime.securesms.util.EditTextExtensionsKt; -import org.thoughtcrime.securesms.util.TextSecurePreferences; - -import java.util.Objects; - -public class SearchToolbar extends LinearLayout { - - private float x, y; - private MenuItem searchItem; - private SearchListener listener; - - public SearchToolbar(Context context) { - super(context); - initialize(); - } - - public SearchToolbar(Context context, @Nullable AttributeSet attrs) { - super(context, attrs); - initialize(); - } - - public SearchToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - initialize(); - } - - private void initialize() { - inflate(getContext(), R.layout.search_toolbar, this); - setOrientation(VERTICAL); - - Toolbar toolbar = findViewById(R.id.toolbar); - - Drawable drawable = ContextCompat.getDrawable(getContext(), org.signal.core.ui.R.drawable.symbol_arrow_start_24); - toolbar.setNavigationIcon(drawable); - toolbar.setCollapseIcon(drawable); - toolbar.inflateMenu(R.menu.conversation_list_search); - - this.searchItem = toolbar.getMenu().findItem(R.id.action_filter_search); - SearchView searchView = (SearchView) searchItem.getActionView(); - EditText searchText = searchView.findViewById(androidx.appcompat.R.id.search_src_text); - - EditTextExtensionsKt.setIncognitoKeyboardEnabled(searchText, TextSecurePreferences.isIncognitoKeyboardEnabled(getContext())); - - searchView.setSubmitButtonEnabled(false); - searchView.setMaxWidth(Integer.MAX_VALUE); - - if (searchText != null) searchText.setHint(R.string.SearchToolbar_search); - else searchView.setQueryHint(getResources().getString(R.string.SearchToolbar_search)); - - searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { - @Override - public boolean onQueryTextSubmit(String query) { - if (listener != null) { - listener.onSearchTextChange(query); - } - return true; - } - - @Override - public boolean onQueryTextChange(String newText) { - return onQueryTextSubmit(newText); - } - }); - - searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { - @Override - public boolean onMenuItemActionExpand(MenuItem item) { - return true; - } - - @Override - public boolean onMenuItemActionCollapse(MenuItem item) { - hide(); - return true; - } - }); - - toolbar.setNavigationOnClickListener(v -> hide()); - } - - @MainThread - public void display(float x, float y) { - if (getVisibility() != View.VISIBLE) { - this.x = x; - this.y = y; - - searchItem.expandActionView(); - - Animator animator = ViewAnimationUtils.createCircularReveal(this, (int)x, (int)y, 0, getWidth()); - animator.setDuration(400); - - setVisibility(View.VISIBLE); - animator.start(); - } - } - - public void collapse() { - searchItem.collapseActionView(); - } - - @MainThread - private void hide() { - if (getVisibility() == View.VISIBLE) { - - - if (listener != null) listener.onSearchClosed(); - - Animator animator = ViewAnimationUtils.createCircularReveal(this, (int)x, (int)y, getWidth(), 0); - animator.setDuration(400); - animator.addListener(new AnimationCompleteListener() { - @Override - public void onAnimationEnd(Animator animation) { - setVisibility(View.INVISIBLE); - } - }); - animator.start(); - } - } - - public boolean isVisible() { - return getVisibility() == View.VISIBLE; - } - - @MainThread - public void setListener(SearchListener listener) { - this.listener = listener; - } - - public interface SearchListener { - void onSearchTextChange(String text); - void onSearchClosed(); - } - -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/InternalPreference.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/InternalPreference.kt deleted file mode 100644 index a7cfd5a876..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/InternalPreference.kt +++ /dev/null @@ -1,35 +0,0 @@ -package org.thoughtcrime.securesms.components.settings.conversation.preferences - -import android.view.View -import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.components.settings.PreferenceModel -import org.thoughtcrime.securesms.recipients.Recipient -import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory -import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter -import org.thoughtcrime.securesms.util.adapter.mapping.MappingViewHolder - -object InternalPreference { - - fun register(adapter: MappingAdapter) { - adapter.registerFactory(Model::class.java, LayoutFactory(::ViewHolder, R.layout.conversation_settings_internal_preference)) - } - - class Model( - private val recipient: Recipient, - val onInternalDetailsClicked: () -> Unit - ) : PreferenceModel() { - - override fun areItemsTheSame(newItem: Model): Boolean { - return recipient == newItem.recipient - } - } - - private class ViewHolder(itemView: View) : MappingViewHolder(itemView) { - - private val internalDetails: View = itemView.findViewById(R.id.internal_details) - - override fun bind(model: Model) { - internalDetails.setOnClickListener { model.onInternalDetailsClicked() } - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/models/Banner.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/models/Banner.kt index 9254258c0a..d6cb588d59 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/models/Banner.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/models/Banner.kt @@ -5,7 +5,6 @@ package org.thoughtcrime.securesms.components.settings.models -import androidx.annotation.StringRes import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth @@ -23,44 +22,8 @@ import androidx.compose.ui.unit.dp import org.signal.core.ui.compose.DayNightPreviews import org.signal.core.ui.compose.Previews import org.signal.core.ui.compose.horizontalGutters -import org.thoughtcrime.securesms.databinding.DslBannerBinding -import org.thoughtcrime.securesms.util.adapter.mapping.BindingFactory -import org.thoughtcrime.securesms.util.adapter.mapping.BindingViewHolder -import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter -import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel import org.signal.core.ui.R as CoreUiR -/** - * Displays a banner to notify the user of certain state or action that needs to be taken. - */ -object Banner { - fun register(mappingAdapter: MappingAdapter) { - mappingAdapter.registerFactory(Model::class.java, BindingFactory(::ViewHolder, DslBannerBinding::inflate)) - } - - class Model( - @StringRes val textId: Int, - @StringRes val actionId: Int, - val onClick: () -> Unit - ) : MappingModel { - override fun areItemsTheSame(newItem: Model): Boolean { - return true - } - - override fun areContentsTheSame(newItem: Model): Boolean { - return textId == newItem.textId && actionId == newItem.actionId - } - } - - private class ViewHolder(binding: DslBannerBinding) : BindingViewHolder(binding) { - override fun bind(model: Model) { - binding.bannerText.setText(model.textId) - binding.bannerAction.setText(model.actionId) - binding.bannerAction.setOnClickListener { model.onClick() } - } - } -} - /** * Replicates the Banner DSL preference for use in compose components. */ diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/models/OutlinedLearnMore.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/models/OutlinedLearnMore.kt deleted file mode 100644 index 62bc0fc843..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/models/OutlinedLearnMore.kt +++ /dev/null @@ -1,35 +0,0 @@ -package org.thoughtcrime.securesms.components.settings.models - -import org.thoughtcrime.securesms.components.settings.DSLSettingsText -import org.thoughtcrime.securesms.components.settings.PreferenceModel -import org.thoughtcrime.securesms.databinding.DslOutlinedLearnMoreBinding -import org.thoughtcrime.securesms.util.adapter.mapping.BindingFactory -import org.thoughtcrime.securesms.util.adapter.mapping.BindingViewHolder -import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter - -/** - * Show a informational text message in an outlined bubble. - */ -object OutlinedLearnMore { - - fun register(mappingAdapter: MappingAdapter) { - mappingAdapter.registerFactory(Model::class.java, BindingFactory(::ViewHolder, DslOutlinedLearnMoreBinding::inflate)) - } - - class Model( - summary: DSLSettingsText, - val learnMoreUrl: String - ) : PreferenceModel(summary = summary) { - override fun areContentsTheSame(newItem: Model): Boolean { - return super.areContentsTheSame(newItem) && learnMoreUrl == newItem.learnMoreUrl - } - } - - private class ViewHolder(binding: DslOutlinedLearnMoreBinding) : BindingViewHolder(binding) { - override fun bind(model: Model) { - binding.root.text = model.summary!!.resolve(context) - binding.root.setLearnMoreVisible(true) - binding.root.setLink(model.learnMoreUrl) - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/models/Progress.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/models/Progress.kt deleted file mode 100644 index 86ea48a45d..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/models/Progress.kt +++ /dev/null @@ -1,32 +0,0 @@ -package org.thoughtcrime.securesms.components.settings.models - -import android.view.View -import android.widget.TextView -import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.components.settings.DSLSettingsText -import org.thoughtcrime.securesms.components.settings.PreferenceModel -import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory -import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter -import org.thoughtcrime.securesms.util.adapter.mapping.MappingViewHolder -import org.thoughtcrime.securesms.util.visible - -object Progress { - - fun register(mappingAdapter: MappingAdapter) { - mappingAdapter.registerFactory(Model::class.java, LayoutFactory(::ViewHolder, R.layout.dsl_progress_pref)) - } - - data class Model( - override val title: DSLSettingsText? - ) : PreferenceModel() - - private class ViewHolder(itemView: View) : MappingViewHolder(itemView) { - - private val title: TextView = itemView.findViewById(R.id.dsl_progress_pref_title) - - override fun bind(model: Model) { - title.text = model.title?.resolve(context) - title.visible = model.title != null - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/AudioOutputAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/AudioOutputAdapter.java deleted file mode 100644 index f4ff690fcb..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/AudioOutputAdapter.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.thoughtcrime.securesms.components.webrtc; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CompoundButton; -import android.widget.RadioButton; - -import androidx.annotation.CallSuper; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.util.Consumer; -import androidx.recyclerview.widget.RecyclerView; - -import org.thoughtcrime.securesms.R; - -import java.util.List; - -final class AudioOutputAdapter extends RecyclerView.Adapter { - - private final OnAudioOutputChangedListener onAudioOutputChangedListener; - private final List audioOutputs; - - private WebRtcAudioOutput selected; - - AudioOutputAdapter(@NonNull OnAudioOutputChangedListener onAudioOutputChangedListener, - @NonNull List audioOutputs) { - this.audioOutputs = audioOutputs; - this.onAudioOutputChangedListener = onAudioOutputChangedListener; - } - - public void setSelectedOutput(@NonNull WebRtcAudioOutput selected) { - this.selected = selected; - - notifyDataSetChanged(); - } - - @Override - public @NonNull ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.audio_output_adapter_radio_item, parent, false); - - return new ViewHolder(view, this::handlePositionSelected); - } - - @Override - public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - holder.bind(audioOutputs.get(position), selected); - } - - @Override - public int getItemCount() { - return audioOutputs.size(); - } - - private void handlePositionSelected(int position) { - WebRtcAudioOutput mode = audioOutputs.get(position); - - if (mode != selected) { - setSelectedOutput(mode); - onAudioOutputChangedListener.audioOutputChanged(new WebRtcAudioDevice(selected, null)); - } - } - - static class ViewHolder extends RecyclerView.ViewHolder implements CompoundButton.OnCheckedChangeListener { - - private final RadioButton radioButton; - private final Consumer onPressed; - - - public ViewHolder(@NonNull View itemView, @NonNull Consumer onPressed) { - super(itemView); - - this.radioButton = itemView.findViewById(R.id.radio); - this.onPressed = onPressed; - } - - @CallSuper - void bind(@NonNull WebRtcAudioOutput audioOutput, @Nullable WebRtcAudioOutput selected) { - radioButton.setText(audioOutput.getLabelRes()); - radioButton.setCompoundDrawablesRelativeWithIntrinsicBounds(audioOutput.getIconRes(), 0, 0, 0); - radioButton.setOnCheckedChangeListener(null); - radioButton.setChecked(audioOutput == selected); - radioButton.setOnCheckedChangeListener(this); - } - - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - int adapterPosition = getAdapterPosition(); - if (adapterPosition != RecyclerView.NO_POSITION) { - onPressed.accept(adapterPosition); - } - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/AudioStateUpdater.kt b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/AudioStateUpdater.kt index 1690547e29..82f4a4355f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/AudioStateUpdater.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/AudioStateUpdater.kt @@ -1,7 +1,7 @@ package org.thoughtcrime.securesms.components.webrtc /** - * This is an interface for [WebRtcAudioPicker31] and [WebRtcAudioPickerLegacy] as a callback for [org.thoughtcrime.securesms.components.webrtc.v2.CallAudioToggleButton] + * This is an interface for [WebRtcAudioPicker31] as a callback for [org.thoughtcrime.securesms.components.webrtc.v2.CallAudioToggleButton] */ interface AudioStateUpdater { fun updateAudioOutputState(audioOutput: WebRtcAudioOutput) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcAudioPickerLegacy.kt b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcAudioPickerLegacy.kt deleted file mode 100644 index adfb1e1716..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcAudioPickerLegacy.kt +++ /dev/null @@ -1,36 +0,0 @@ -package org.thoughtcrime.securesms.components.webrtc - -import android.content.Context -import android.content.DialogInterface -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.thoughtcrime.securesms.R - -/** - * This launches the bottom sheet on Android 11 and below devices for selecting which audio device to use during a call. - * In cases where there are only [SHOW_PICKER_THRESHOLD] devices, it will cycle through them without presenting a bottom sheet. - */ -class WebRtcAudioPickerLegacy(private val audioOutputChangedListener: OnAudioOutputChangedListener, private val outputState: ToggleButtonOutputState, private val stateUpdater: AudioStateUpdater) { - - fun showPicker(context: Context, availableModes: List, dismissListener: DialogInterface.OnDismissListener): DialogInterface? { - val rv = RecyclerView(context) - val adapter = AudioOutputAdapter( - fun(audioDevice: WebRtcAudioDevice) { - audioOutputChangedListener.audioOutputChanged(audioDevice) - stateUpdater.updateAudioOutputState(audioDevice.webRtcAudioOutput) - stateUpdater.hidePicker() - }, - availableModes - ) - adapter.setSelectedOutput(outputState.getCurrentOutput()) - rv.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) - rv.adapter = adapter - return MaterialAlertDialogBuilder(context) - .setTitle(R.string.WebRtcAudioOutputToggle__audio_output) - .setView(rv) - .setCancelable(true) - .setOnDismissListener(dismissListener) - .show() - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/push/IasTrustStore.java b/app/src/main/java/org/thoughtcrime/securesms/push/IasTrustStore.java deleted file mode 100644 index ef933c7819..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/push/IasTrustStore.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.thoughtcrime.securesms.push; - -import android.content.Context; - -import org.thoughtcrime.securesms.R; -import org.signal.network.config.TrustStore; - -import java.io.InputStream; - -public class IasTrustStore implements TrustStore { - - private final Context context; - - public IasTrustStore(Context context) { - this.context = context.getApplicationContext(); - } - - @Override - public InputStream getKeyStoreInputStream() { - return context.getResources().openRawResource(R.raw.ias); - } - - @Override - public String getKeyStorePassword() { - return "whisper"; - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/TestFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/TestFragment.kt deleted file mode 100644 index 9f9d855eca..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/TestFragment.kt +++ /dev/null @@ -1,15 +0,0 @@ -package org.thoughtcrime.securesms.stories.viewer.page - -import android.graphics.drawable.ColorDrawable -import android.os.Bundle -import android.view.View -import androidx.appcompat.widget.AppCompatImageView -import androidx.fragment.app.Fragment -import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.conversation.colors.AvatarColor - -class TestFragment : Fragment(R.layout.test_fragment) { - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - (view as AppCompatImageView).setImageDrawable(ColorDrawable(AvatarColor.random().colorInt())) - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/composer/StoryReactionBar.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/composer/StoryReactionBar.kt deleted file mode 100644 index a0d89f8e8b..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/composer/StoryReactionBar.kt +++ /dev/null @@ -1,89 +0,0 @@ -package org.thoughtcrime.securesms.stories.viewer.reply.composer - -import android.animation.AnimatorSet -import android.animation.ObjectAnimator -import android.annotation.SuppressLint -import android.content.Context -import android.util.AttributeSet -import android.view.View -import androidx.constraintlayout.widget.ConstraintLayout -import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.components.emoji.EmojiImageView -import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.util.visible - -class StoryReactionBar @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null -) : ConstraintLayout(context, attrs) { - - var callback: Callback? = null - - private var animatorSet: AnimatorSet? = null - - init { - inflate(context, R.layout.stories_reaction_bar, this) - alpha = 0f - setBackgroundResource(R.drawable.conversation_reaction_overlay_background) - } - - private val emojiViews: List = listOf( - findViewById(R.id.reaction_1), - findViewById(R.id.reaction_2), - findViewById(R.id.reaction_3), - findViewById(R.id.reaction_4), - findViewById(R.id.reaction_5), - findViewById(R.id.reaction_6), - findViewById(R.id.reaction_7) - ) - - init { - if (!isInEditMode) { - val emojis = SignalStore.emoji.reactions - emojiViews.forEachIndexed { index, emojiImageView -> - if (index == emojiViews.lastIndex) { - emojiImageView.setImageResource(R.drawable.ic_any_emoji_32) - emojiImageView.setOnClickListener { onOpenReactionPicker() } - } else { - val emoji = SignalStore.emoji.getPreferredVariation(emojis[index]) - emojiImageView.setImageEmoji(emoji) - emojiImageView.setOnClickListener { onEmojiSelected(emoji) } - } - } - } - - setOnClickListener { - callback?.onTouchOutsideOfReactionBar() - } - } - - @SuppressLint("Recycle") - fun animateIn() { - visible = true - - animatorSet?.cancel() - animatorSet = AnimatorSet().apply { - playTogether( - emojiViews.flatMap { - listOf(ObjectAnimator.ofFloat(it, View.ALPHA, 1f), ObjectAnimator.ofFloat(it, View.TRANSLATION_Y, 0f)) - } + ObjectAnimator.ofFloat(this@StoryReactionBar, View.ALPHA, 1f) - ) - - start() - } - } - - private fun onEmojiSelected(emoji: String) { - callback?.onReactionSelected(emoji) - } - - private fun onOpenReactionPicker() { - callback?.onOpenReactionPicker() - } - - interface Callback { - fun onTouchOutsideOfReactionBar() - fun onReactionSelected(emoji: String) - fun onOpenReactionPicker() - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/reaction/MultiReactionBurstLayout.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/reaction/MultiReactionBurstLayout.kt deleted file mode 100644 index 4bb224ceda..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/reaction/MultiReactionBurstLayout.kt +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2023 Signal Messenger, LLC - * SPDX-License-Identifier: AGPL-3.0-only - */ - -package org.thoughtcrime.securesms.stories.viewer.reply.reaction - -import android.content.Context -import android.util.AttributeSet -import android.widget.FrameLayout -import androidx.core.view.children -import org.signal.emoji.EmojiUtil -import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.events.GroupCallReactionEvent -import kotlin.time.Duration.Companion.seconds - -class MultiReactionBurstLayout @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null -) : FrameLayout(context, attrs) { - private val cooldownTimes = mutableMapOf() - - private var nextViewIndex = 0 - - init { - repeat(MAX_SIMULTANEOUS_REACTIONS) { - val view = OnReactionSentView(context, layoutRes = R.layout.reaction_burst_view) - addView(view) - } - } - - fun displayReactions(reactions: List) { - if (children.count() == 0) { - throw IllegalStateException("You must add views before displaying reactions!") - } - - reactions.filter { - if (it.getExpirationTimestamp() < System.currentTimeMillis()) { - return@filter false - } - - val cutoffTimestamp = cooldownTimes[EmojiUtil.getCanonicalRepresentation(it.reaction)] ?: return@filter true - - return@filter cutoffTimestamp < it.timestamp - } - .groupBy { EmojiUtil.getCanonicalRepresentation(it.reaction) } - .filter { it.value.groupBy { event -> event.sender }.size >= REACTION_COUNT_THRESHOLD } - .values - .map { it.sortedBy { event -> event.timestamp } } - .sortedBy { it.last().timestamp } - .take(MAX_SIMULTANEOUS_REACTIONS - cooldownTimes.filter { it.value > System.currentTimeMillis() }.size) - .forEach { - val reactionView = getNextReactionView() - reactionView.playForEmoji(it.map { event -> event.reaction }) - val lastEvent = it.last() - cooldownTimes[EmojiUtil.getCanonicalRepresentation(lastEvent.reaction)] = lastEvent.timestamp + cooldownDuration.inWholeMilliseconds - } - } - - private fun getNextReactionView(): OnReactionSentView { - val v = getChildAt(nextViewIndex) as OnReactionSentView - - nextViewIndex = (nextViewIndex + 1) % MAX_SIMULTANEOUS_REACTIONS - - return v - } - - companion object { - private const val REACTION_COUNT_THRESHOLD = 3 - private const val MAX_SIMULTANEOUS_REACTIONS = 3 - private val cooldownDuration = 2.seconds - } -} diff --git a/app/src/main/res/anim-v21/camera_fab_cubic_easing_interpolator.xml b/app/src/main/res/anim-v21/camera_fab_cubic_easing_interpolator.xml deleted file mode 100644 index 870b232171..0000000000 --- a/app/src/main/res/anim-v21/camera_fab_cubic_easing_interpolator.xml +++ /dev/null @@ -1,6 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/anim/camera_fab_cubic_easing_interpolator.xml b/app/src/main/res/anim/camera_fab_cubic_easing_interpolator.xml deleted file mode 100644 index dc1428476c..0000000000 --- a/app/src/main/res/anim/camera_fab_cubic_easing_interpolator.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/color/transfer_option_stroke_color_selector.xml b/app/src/main/res/color/transfer_option_stroke_color_selector.xml deleted file mode 100644 index a3edc5e38a..0000000000 --- a/app/src/main/res/color/transfer_option_stroke_color_selector.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_transfer_local_48.xml b/app/src/main/res/drawable/ic_transfer_local_48.xml deleted file mode 100644 index b290196c53..0000000000 --- a/app/src/main/res/drawable/ic_transfer_local_48.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_transfer_phone_48.xml b/app/src/main/res/drawable/ic_transfer_phone_48.xml deleted file mode 100644 index 87c8d7771e..0000000000 --- a/app/src/main/res/drawable/ic_transfer_phone_48.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/selected_page_dot_indicator.xml b/app/src/main/res/drawable/selected_page_dot_indicator.xml deleted file mode 100644 index 1e0c1cd96c..0000000000 --- a/app/src/main/res/drawable/selected_page_dot_indicator.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/symbol_bell_ring_fill_disabled_24.xml b/app/src/main/res/drawable/symbol_bell_ring_fill_disabled_24.xml deleted file mode 100644 index 9b44579435..0000000000 --- a/app/src/main/res/drawable/symbol_bell_ring_fill_disabled_24.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/symbol_switch_white_24.xml b/app/src/main/res/drawable/symbol_switch_white_24.xml deleted file mode 100644 index 54189e6a03..0000000000 --- a/app/src/main/res/drawable/symbol_switch_white_24.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/unselected_page_dot_indicator.xml b/app/src/main/res/drawable/unselected_page_dot_indicator.xml deleted file mode 100644 index 3d6eba0572..0000000000 --- a/app/src/main/res/drawable/unselected_page_dot_indicator.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/webrtc_call_screen_circle_checked.xml b/app/src/main/res/drawable/webrtc_call_screen_circle_checked.xml deleted file mode 100644 index 1e7f8ffe78..0000000000 --- a/app/src/main/res/drawable/webrtc_call_screen_circle_checked.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/webrtc_call_screen_circle_green.xml b/app/src/main/res/drawable/webrtc_call_screen_circle_green.xml deleted file mode 100644 index 815fb508e2..0000000000 --- a/app/src/main/res/drawable/webrtc_call_screen_circle_green.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/app/src/main/res/drawable/webrtc_call_screen_circle_grey_disabled.xml b/app/src/main/res/drawable/webrtc_call_screen_circle_grey_disabled.xml deleted file mode 100644 index 348b2a3ffe..0000000000 --- a/app/src/main/res/drawable/webrtc_call_screen_circle_grey_disabled.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/webrtc_call_screen_circle_grey_selector.xml b/app/src/main/res/drawable/webrtc_call_screen_circle_grey_selector.xml deleted file mode 100644 index 616e6e3cd4..0000000000 --- a/app/src/main/res/drawable/webrtc_call_screen_circle_grey_selector.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/webrtc_call_screen_circle_red.xml b/app/src/main/res/drawable/webrtc_call_screen_circle_red.xml deleted file mode 100644 index 22dac3f6b1..0000000000 --- a/app/src/main/res/drawable/webrtc_call_screen_circle_red.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/webrtc_call_screen_circle_unchecked.xml b/app/src/main/res/drawable/webrtc_call_screen_circle_unchecked.xml deleted file mode 100644 index 06e1367691..0000000000 --- a/app/src/main/res/drawable/webrtc_call_screen_circle_unchecked.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/app/src/main/res/layout/audio_output_adapter_radio_item.xml b/app/src/main/res/layout/audio_output_adapter_radio_item.xml deleted file mode 100644 index a50a8d9f10..0000000000 --- a/app/src/main/res/layout/audio_output_adapter_radio_item.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - diff --git a/app/src/main/res/layout/conversation_settings_internal_preference.xml b/app/src/main/res/layout/conversation_settings_internal_preference.xml deleted file mode 100644 index c5b2182374..0000000000 --- a/app/src/main/res/layout/conversation_settings_internal_preference.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dsl_banner.xml b/app/src/main/res/layout/dsl_banner.xml deleted file mode 100644 index d884a505ba..0000000000 --- a/app/src/main/res/layout/dsl_banner.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dsl_outlined_learn_more.xml b/app/src/main/res/layout/dsl_outlined_learn_more.xml deleted file mode 100644 index 48cccfa096..0000000000 --- a/app/src/main/res/layout/dsl_outlined_learn_more.xml +++ /dev/null @@ -1,12 +0,0 @@ - - diff --git a/app/src/main/res/layout/dsl_progress_pref.xml b/app/src/main/res/layout/dsl_progress_pref.xml deleted file mode 100644 index 293bc8db03..0000000000 --- a/app/src/main/res/layout/dsl_progress_pref.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/material3_serarch_toolbar.xml b/app/src/main/res/layout/material3_serarch_toolbar.xml deleted file mode 100644 index 2a50dc1c58..0000000000 --- a/app/src/main/res/layout/material3_serarch_toolbar.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/reaction_burst_view.xml b/app/src/main/res/layout/reaction_burst_view.xml deleted file mode 100644 index 9f4ab07ec6..0000000000 --- a/app/src/main/res/layout/reaction_burst_view.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/recent_photo_view.xml b/app/src/main/res/layout/recent_photo_view.xml deleted file mode 100644 index 48148d7deb..0000000000 --- a/app/src/main/res/layout/recent_photo_view.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/recent_photo_view_item.xml b/app/src/main/res/layout/recent_photo_view_item.xml deleted file mode 100644 index df52cc12e8..0000000000 --- a/app/src/main/res/layout/recent_photo_view_item.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/layout/search_toolbar.xml b/app/src/main/res/layout/search_toolbar.xml deleted file mode 100644 index fb77d49e2a..0000000000 --- a/app/src/main/res/layout/search_toolbar.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/stories_reaction_bar.xml b/app/src/main/res/layout/stories_reaction_bar.xml deleted file mode 100644 index 420d7565b7..0000000000 --- a/app/src/main/res/layout/stories_reaction_bar.xml +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/test_fragment.xml b/app/src/main/res/layout/test_fragment.xml deleted file mode 100644 index 42fb6ab0a9..0000000000 --- a/app/src/main/res/layout/test_fragment.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/conversation_list_search.xml b/app/src/main/res/menu/conversation_list_search.xml deleted file mode 100644 index 49214715db..0000000000 --- a/app/src/main/res/menu/conversation_list_search.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/raw/ias.store b/app/src/main/res/raw/ias.store deleted file mode 100644 index e0b8ec8cca..0000000000 Binary files a/app/src/main/res/raw/ias.store and /dev/null differ