1 /* 2 * Copyright (C) 2017 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 package com.android.documentsui.inspector; 17 18 import android.app.Activity; 19 import android.content.Context; 20 import android.graphics.Bitmap; 21 import android.graphics.Point; 22 import android.graphics.drawable.Drawable; 23 import android.text.Selection; 24 import android.text.Spannable; 25 import android.util.AttributeSet; 26 import android.view.LayoutInflater; 27 import android.view.View; 28 import android.widget.ImageView; 29 import android.widget.ImageView.ScaleType; 30 import android.widget.RelativeLayout; 31 import android.widget.TextView; 32 33 import com.android.documentsui.ProviderExecutor; 34 import com.android.documentsui.R; 35 import com.android.documentsui.ThumbnailLoader; 36 import com.android.documentsui.base.Display; 37 import com.android.documentsui.base.DocumentInfo; 38 import com.android.documentsui.inspector.InspectorController.HeaderDisplay; 39 40 import java.util.function.Consumer; 41 42 import javax.annotation.Nullable; 43 44 /** 45 * Organizes and displays the title and thumbnail for a given document 46 */ 47 public final class HeaderView extends RelativeLayout implements HeaderDisplay { 48 49 private final Context mContext; 50 private final View mHeader; 51 private ImageView mThumbnail; 52 private final TextView mTitle; 53 private Point mImageDimensions; 54 HeaderView(Context context)55 public HeaderView(Context context) { 56 this(context, null); 57 } 58 HeaderView(Context context, AttributeSet attrs)59 public HeaderView(Context context, AttributeSet attrs) { 60 this(context, attrs, 0); 61 } 62 HeaderView(Context context, AttributeSet attrs, int defStyleAttr)63 public HeaderView(Context context, AttributeSet attrs, int defStyleAttr) { 64 super(context, attrs, defStyleAttr); 65 LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( 66 Context.LAYOUT_INFLATER_SERVICE); 67 mContext = context; 68 mHeader = inflater.inflate(R.layout.inspector_header, null); 69 mThumbnail = (ImageView) mHeader.findViewById(R.id.inspector_thumbnail); 70 mTitle = (TextView) mHeader.findViewById(R.id.inspector_file_title); 71 72 int width = (int) Display.screenWidth((Activity)context); 73 int height = mContext.getResources().getDimensionPixelSize(R.dimen.inspector_header_height); 74 mImageDimensions = new Point(width, height); 75 addView(mHeader); 76 } 77 78 @Override accept(DocumentInfo info, String displayName)79 public void accept(DocumentInfo info, String displayName) { 80 loadHeaderImage(info); 81 mTitle.setText(displayName); 82 mTitle.setCustomSelectionActionModeCallback( 83 new HeaderTextSelector(mTitle, this::selectText)); 84 } 85 selectText(Spannable text, int start, int stop)86 private void selectText(Spannable text, int start, int stop) { 87 Selection.setSelection(text, start, stop); 88 } 89 loadHeaderImage(DocumentInfo doc)90 private void loadHeaderImage(DocumentInfo doc) { 91 if (!doc.isThumbnailSupported()) { 92 showImage(doc, null); 93 } else { 94 Consumer<Bitmap> callback = new Consumer<Bitmap>() { 95 @Override 96 public void accept(Bitmap thumbnail) { 97 showImage(doc, thumbnail); 98 } 99 }; 100 // load the thumbnail async. 101 final ThumbnailLoader task = new ThumbnailLoader(doc.derivedUri, mThumbnail, 102 mImageDimensions, doc.lastModified, callback, false); 103 task.executeOnExecutor(ProviderExecutor.forAuthority(doc.derivedUri.getAuthority()), 104 doc.derivedUri); 105 } 106 } 107 108 /** 109 * Shows the supplied image, falling back to a mimetype icon if the image is null. 110 */ showImage(DocumentInfo info, @Nullable Bitmap thumbnail)111 private void showImage(DocumentInfo info, @Nullable Bitmap thumbnail) { 112 if (thumbnail != null) { 113 mThumbnail.resetPaddingToInitialValues(); 114 mThumbnail.setScaleType(ScaleType.CENTER_CROP); 115 mThumbnail.setImageBitmap(thumbnail); 116 } else { 117 mThumbnail.setPadding(0, 0, 0, mTitle.getHeight()); 118 119 Drawable mimeIcon = 120 mContext.getContentResolver().getTypeDrawable(info.mimeType); 121 mThumbnail.setScaleType(ScaleType.FIT_CENTER); 122 mThumbnail.setImageDrawable(mimeIcon); 123 } 124 mThumbnail.animate().alpha(1.0f).start(); 125 } 126 }