/* * Copyright (C) 2015 The Android Open Source Project * Copyright (C) 2024 The LineageOS Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.messaging.ui.attachmentchooser; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.TouchDelegate; import android.view.View; import android.widget.CheckBox; import android.widget.FrameLayout; import com.android.messaging.R; import com.android.messaging.datamodel.data.MessagePartData; import com.android.messaging.ui.AttachmentPreviewFactory; import com.android.messaging.util.Assert; /** * Shows an item in the attachment picker grid. */ public class AttachmentGridItemView extends FrameLayout { public interface HostInterface { boolean isItemSelected(MessagePartData attachment); void onItemCheckedChanged(AttachmentGridItemView view, MessagePartData attachment); void onItemClicked(AttachmentGridItemView view, MessagePartData attachment); } MessagePartData mAttachmentData; private FrameLayout mAttachmentViewContainer; private CheckBox mCheckBox; private HostInterface mHostInterface; public AttachmentGridItemView(final Context context, final AttributeSet attrs) { super(context, attrs); } @Override protected void onFinishInflate() { super.onFinishInflate(); mAttachmentViewContainer = findViewById(R.id.attachment_container); mCheckBox = findViewById(R.id.checkbox); mCheckBox.setOnClickListener(v -> mHostInterface.onItemCheckedChanged( AttachmentGridItemView.this, mAttachmentData)); setOnClickListener(v -> mHostInterface.onItemClicked(AttachmentGridItemView.this, mAttachmentData)); addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { // Enlarge the clickable region for the checkbox. final int touchAreaIncrease = getResources().getDimensionPixelOffset( R.dimen.attachment_grid_checkbox_area_increase); final Rect region = new Rect(); mCheckBox.getHitRect(region); region.inset(-touchAreaIncrease, -touchAreaIncrease); setTouchDelegate(new TouchDelegate(region, mCheckBox)); }); } @Override protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { // The grid view auto-fits the columns, so we want to let the height match the width // to make the attachment preview square. super.onMeasure(widthMeasureSpec, widthMeasureSpec); } public void bind(final MessagePartData attachment, final HostInterface hostInterface) { Assert.isTrue(attachment.isAttachment()); mHostInterface = hostInterface; updateSelectedState(); if (mAttachmentData == null || !mAttachmentData.equals(attachment)) { mAttachmentData = attachment; updateAttachmentView(); } } public void updateSelectedState() { mCheckBox.setChecked(mHostInterface.isItemSelected(mAttachmentData)); } private void updateAttachmentView() { mAttachmentViewContainer.removeAllViews(); final LayoutInflater inflater = LayoutInflater.from(getContext()); final View attachmentView = AttachmentPreviewFactory.createAttachmentPreview(inflater, mAttachmentData, mAttachmentViewContainer, AttachmentPreviewFactory.TYPE_CHOOSER_GRID, true /* startImageRequest */, null); mAttachmentViewContainer.addView(attachmentView); } }