package org.tm.archive.conversation; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import org.tm.archive.R; import org.tm.archive.components.InputAwareLayout; import org.tm.archive.mediasend.Media; import org.tm.archive.util.StorageUtil; import java.util.Arrays; import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; public class AttachmentKeyboard extends FrameLayout implements InputAwareLayout.InputView { private static final List DEFAULT_BUTTONS = Arrays.asList( AttachmentKeyboardButton.GALLERY, AttachmentKeyboardButton.FILE, AttachmentKeyboardButton.CONTACT, AttachmentKeyboardButton.LOCATION, AttachmentKeyboardButton.PAYMENT ); private View container; private AttachmentKeyboardMediaAdapter mediaAdapter; private AttachmentKeyboardButtonAdapter buttonAdapter; private Callback callback; private RecyclerView mediaList; private View permissionText; private View permissionButton; public AttachmentKeyboard(@NonNull Context context) { super(context); init(context); } public AttachmentKeyboard(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(context); } private void init(@NonNull Context context) { inflate(context, R.layout.attachment_keyboard, this); this.container = findViewById(R.id.attachment_keyboard_container); this.mediaList = findViewById(R.id.attachment_keyboard_media_list); this.permissionText = findViewById(R.id.attachment_keyboard_permission_text); this.permissionButton = findViewById(R.id.attachment_keyboard_permission_button); RecyclerView buttonList = findViewById(R.id.attachment_keyboard_button_list); buttonList.setItemAnimator(null); mediaAdapter = new AttachmentKeyboardMediaAdapter(Glide.with(this), media -> { if (callback != null) { callback.onAttachmentMediaClicked(media); } }); buttonAdapter = new AttachmentKeyboardButtonAdapter(button -> { if (callback != null) { callback.onAttachmentSelectorClicked(button); } }); mediaList.setAdapter(mediaAdapter); buttonList.setAdapter(buttonAdapter); buttonAdapter.registerAdapterDataObserver(new AttachmentButtonCenterHelper(buttonList)); mediaList.setLayoutManager(new GridLayoutManager(context, 1, GridLayoutManager.HORIZONTAL, false)); buttonList.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)); buttonAdapter.setButtons(DEFAULT_BUTTONS); } public void setCallback(@NonNull Callback callback) { this.callback = callback; } public void filterAttachmentKeyboardButtons(@Nullable Predicate buttonPredicate) { if (buttonPredicate == null) { buttonAdapter.setButtons(DEFAULT_BUTTONS); } else { buttonAdapter.setButtons(DEFAULT_BUTTONS.stream().filter(buttonPredicate).collect(Collectors.toList())); } } public void onMediaChanged(@NonNull List media) { if (StorageUtil.canReadFromMediaStore()) { mediaAdapter.setMedia(media); permissionButton.setVisibility(GONE); permissionText.setVisibility(GONE); } else { permissionButton.setVisibility(VISIBLE); permissionText.setVisibility(VISIBLE); permissionButton.setOnClickListener(v -> { if (callback != null) { callback.onAttachmentPermissionsRequested(); } }); } } public void setWallpaperEnabled(boolean wallpaperEnabled) { if (wallpaperEnabled) { container.setBackgroundColor(getContext().getResources().getColor(R.color.wallpaper_compose_background)); } else { container.setBackgroundColor(getContext().getResources().getColor(R.color.signal_background_primary)); } buttonAdapter.setWallpaperEnabled(wallpaperEnabled); } @Override public void show(int height, boolean immediate) { ViewGroup.LayoutParams params = getLayoutParams(); params.height = height; setLayoutParams(params); setVisibility(VISIBLE); } @Override public void hide(boolean immediate) { setVisibility(GONE); } @Override public boolean isShowing() { return getVisibility() == VISIBLE; } public interface Callback { void onAttachmentMediaClicked(@NonNull Media media); void onAttachmentSelectorClicked(@NonNull AttachmentKeyboardButton button); void onAttachmentPermissionsRequested(); } }