1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/* 2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2016 The Android Open Source Project 3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License. 6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at 7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software 11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and 14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License. 15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.dialer.callcomposer; 18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.Context; 20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.database.Cursor; 21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.util.AttributeSet; 22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.View; 23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.FrameLayout; 24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.ImageView; 25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.ImageView.ScaleType; 26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.bumptech.glide.Glide; 27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.bumptech.glide.load.resource.bitmap.DownsampleStrategy; 28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; 29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.bumptech.glide.request.RequestOptions; 30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.concurrent.TimeUnit; 31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/** Shows an item in the gallery picker grid view. Hosts an FileImageView with a checkbox. */ 33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class GalleryGridItemView extends FrameLayout { 34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final GalleryGridItemData data = new GalleryGridItemData(); 36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private ImageView image; 38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private View checkbox; 39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private View gallery; 40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private String currentFilePath; 41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private boolean isGallery; 42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public GalleryGridItemView(Context context, AttributeSet attrs) { 44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian super(context, attrs); 45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian protected void onFinishInflate() { 49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian super.onFinishInflate(); 50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian image = (ImageView) findViewById(R.id.image); 51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian checkbox = findViewById(R.id.checkbox); 52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian gallery = findViewById(R.id.gallery); 53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian image.setClipToOutline(true); 55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian checkbox.setClipToOutline(true); 56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian gallery.setClipToOutline(true); 57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // The grid view auto-fit the columns, so we want to let the height match the width 62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // to make the image square. 63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian super.onMeasure(widthMeasureSpec, widthMeasureSpec); 64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public GalleryGridItemData getData() { 67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return data; 68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void setSelected(boolean selected) { 72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (selected) { 73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian checkbox.setVisibility(VISIBLE); 74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian int paddingPx = getResources().getDimensionPixelSize(R.dimen.gallery_item_selected_padding); 75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian setPadding(paddingPx, paddingPx, paddingPx, paddingPx); 76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else { 77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian checkbox.setVisibility(GONE); 78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian int paddingPx = getResources().getDimensionPixelOffset(R.dimen.gallery_item_padding); 79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian setPadding(paddingPx, paddingPx, paddingPx, paddingPx); 80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public boolean isGallery() { 84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return isGallery; 85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void showGallery(boolean show) { 88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian isGallery = show; 89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian gallery.setVisibility(show ? VISIBLE : INVISIBLE); 90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void bind(Cursor cursor) { 93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian data.bind(cursor); 94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian showGallery(false); 95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian updateImageView(); 96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private void updateImageView() { 99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian image.setScaleType(ScaleType.CENTER_CROP); 100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (currentFilePath == null || !currentFilePath.equals(data.getFilePath())) { 102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian currentFilePath = data.getFilePath(); 103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // Downloads/loads an image from the given URI so that the image's largest dimension is 105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // between 1/2 the given dimensions and the given dimensions, with no restrictions on the 106ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // image's smallest dimension. We skip the memory cache, but glide still applies it's disk 107ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // cache to optimize loads. 108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Glide.with(getContext()) 109ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian .load(data.getFileUri()) 110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian .apply(RequestOptions.downsampleOf(DownsampleStrategy.AT_MOST).skipMemoryCache(true)) 111ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian .transition(DrawableTransitionOptions.withCrossFade()) 112ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian .into(image); 113ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 114ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian long dateModifiedSeconds = data.getDateModifiedSeconds(); 115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (dateModifiedSeconds > 0) { 116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian image.setContentDescription( 117ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian getResources() 118ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian .getString( 119ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian R.string.gallery_item_description, 120ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian TimeUnit.SECONDS.toMillis(dateModifiedSeconds))); 121ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else { 122ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian image.setContentDescription( 123ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian getResources().getString(R.string.gallery_item_description_no_date)); 124ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 125ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 126ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian} 127