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