• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }