• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.documentsui.sidebar;
18 
19 import androidx.annotation.Nullable;
20 import android.content.Context;
21 import android.graphics.drawable.Drawable;
22 import android.provider.DocumentsProvider;
23 import android.text.TextUtils;
24 import android.text.format.Formatter;
25 import android.view.DragEvent;
26 import android.view.Menu;
27 import android.view.MenuInflater;
28 import android.view.View;
29 import android.widget.ImageView;
30 import android.widget.TextView;
31 
32 import com.android.documentsui.ActionHandler;
33 import com.android.documentsui.IconUtils;
34 import com.android.documentsui.MenuManager;
35 import com.android.documentsui.R;
36 import com.android.documentsui.base.DocumentInfo;
37 import com.android.documentsui.base.RootInfo;
38 
39 /**
40  * An {@link Item} for each root provided by {@link DocumentsProvider}s.
41  */
42 public class RootItem extends Item {
43     private static final String STRING_ID_FORMAT = "RootItem{%s/%s}";
44 
45     public final RootInfo root;
46     public @Nullable DocumentInfo docInfo;
47 
48     protected final ActionHandler mActionHandler;
49     private final String mPackageName;
50 
RootItem(RootInfo root, ActionHandler actionHandler)51     public RootItem(RootInfo root, ActionHandler actionHandler) {
52         this(root, actionHandler, "" /* packageName */);
53     }
54 
RootItem(RootInfo root, ActionHandler actionHandler, String packageName)55     public RootItem(RootInfo root, ActionHandler actionHandler, String packageName) {
56         super(R.layout.item_root, root.title, getStringId(root));
57         this.root = root;
58         mActionHandler = actionHandler;
59         mPackageName = packageName;
60     }
61 
getStringId(RootInfo root)62     private static String getStringId(RootInfo root) {
63         // Empty URI authority is invalid, so we can use empty string if root.authority is null.
64         // Directly passing null to String.format() will write "null" which can be a valid URI
65         // authority.
66         String authority = (root.authority == null ? "" : root.authority);
67         return String.format(STRING_ID_FORMAT, authority, root.rootId);
68     }
69 
70     @Override
bindView(View convertView)71     public void bindView(View convertView) {
72         final Context context = convertView.getContext();
73         if (root.supportsEject()) {
74             bindAction(convertView, View.VISIBLE, R.drawable.ic_eject,
75                     context.getResources().getString(R.string.menu_eject_root));
76         } else {
77             bindAction(convertView, View.GONE, -1 /* iconResource */, null /* description */);
78         }
79         // Show available space if no summary
80         String summaryText = root.summary;
81         if (TextUtils.isEmpty(summaryText) && root.availableBytes >= 0) {
82             summaryText = context.getString(R.string.root_available_bytes,
83                     Formatter.formatFileSize(context, root.availableBytes));
84         }
85 
86         bindIconAndTitle(convertView);
87         bindSummary(convertView, summaryText);
88     }
89 
bindAction(View view, int visibility, int iconId, String description)90     protected final void bindAction(View view, int visibility, int iconId, String description) {
91         final ImageView actionIcon = (ImageView) view.findViewById(R.id.action_icon);
92         final View verticalDivider = view.findViewById(R.id.vertical_divider);
93         final View actionIconArea = view.findViewById(R.id.action_icon_area);
94 
95         verticalDivider.setVisibility(visibility);
96         actionIconArea.setVisibility(visibility);
97         actionIconArea.setOnClickListener(visibility == View.VISIBLE ? this::onActionClick : null);
98         if (description != null) {
99             actionIconArea.setContentDescription(description);
100         }
101         if (iconId > 0) {
102             actionIcon.setImageDrawable(IconUtils.applyTintColor(view.getContext(), iconId,
103                     R.color.item_action_icon));
104         }
105     }
106 
onActionClick(View view)107     protected void onActionClick(View view) {
108         RootsFragment.ejectClicked(view, root, mActionHandler);
109     }
110 
bindIconAndTitle(View view)111     protected final void bindIconAndTitle(View view) {
112         bindIcon(view, root.loadDrawerIcon(view.getContext()));
113         bindTitle(view);
114     }
115 
bindSummary(View view, String summary)116     protected void bindSummary(View view, String summary) {
117         final TextView summaryView = (TextView) view.findViewById(android.R.id.summary);
118         summaryView.setText(summary);
119         summaryView.setVisibility(TextUtils.isEmpty(summary) ? View.GONE : View.VISIBLE);
120     }
121 
bindIcon(View view, Drawable drawable)122     private void bindIcon(View view, Drawable drawable) {
123         final ImageView icon = (ImageView) view.findViewById(android.R.id.icon);
124         icon.setImageDrawable(drawable);
125     }
126 
bindTitle(View view)127     private void bindTitle(View view) {
128         final TextView titleView = (TextView) view.findViewById(android.R.id.title);
129         titleView.setText(title);
130     }
131 
132     @Override
isRoot()133     boolean isRoot() {
134         return true;
135     }
136 
137     @Override
open()138     void open() {
139         mActionHandler.openRoot(root);
140     }
141 
142     @Override
getPackageName()143     String getPackageName() {
144         return mPackageName;
145     }
146 
147     @Override
isDropTarget()148     boolean isDropTarget() {
149         return root.supportsCreate();
150     }
151 
152     @Override
dropOn(DragEvent event)153     boolean dropOn(DragEvent event) {
154         return mActionHandler.dropOn(event, root);
155     }
156 
157     @Override
createContextMenu(Menu menu, MenuInflater inflater, MenuManager menuManager)158     void createContextMenu(Menu menu, MenuInflater inflater, MenuManager menuManager) {
159         inflater.inflate(R.menu.root_context_menu, menu);
160         menuManager.updateRootContextMenu(menu, root, docInfo);
161     }
162 
163     @Override
toString()164     public String toString() {
165         return "RootItem{"
166                 + "id=" + stringId
167                 + ", root=" + root
168                 + ", docInfo=" + docInfo
169                 + "}";
170     }
171 }
172