blob: 8e9b07f501f35d1bff0bcb2bfb079cd8b931628f [file] [log] [blame]
Ben Linb8c54e72016-06-10 12:13:27 -07001/*
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
17package com.android.documentsui;
18
19import android.content.Context;
20import android.util.AttributeSet;
21import android.view.LayoutInflater;
22import android.view.View;
23import android.view.ViewGroup;
Tony Huangcd456612019-04-15 16:50:10 +080024import android.view.accessibility.AccessibilityEvent;
Ben Linb8c54e72016-06-10 12:13:27 -070025import android.widget.AdapterView;
26import android.widget.BaseAdapter;
27import android.widget.Spinner;
28import android.widget.TextView;
29
30import com.android.documentsui.NavigationViewManager.Breadcrumb;
31import com.android.documentsui.NavigationViewManager.Environment;
Steve McKayd0805062016-09-15 14:30:38 -070032import com.android.documentsui.base.DocumentInfo;
33import com.android.documentsui.base.RootInfo;
Steve McKayd9caa6a2016-09-15 16:36:45 -070034import com.android.documentsui.base.State;
Ben Linb8c54e72016-06-10 12:13:27 -070035
Ben Lin62442452017-01-19 15:10:49 -080036import java.util.function.IntConsumer;
Ben Linb8c54e72016-06-10 12:13:27 -070037
38/**
39 * Dropdown implementation of breadcrumb used for phone device layouts
40 */
41
42public final class DropdownBreadcrumb extends Spinner implements Breadcrumb {
43
44 private DropdownAdapter mAdapter;
45
46 public DropdownBreadcrumb(
47 Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
48 super(context, attrs, defStyleAttr, defStyleRes);
49 }
50
51 public DropdownBreadcrumb(Context context, AttributeSet attrs, int defStyleAttr) {
52 super(context, attrs, defStyleAttr);
53 }
54
55 public DropdownBreadcrumb(Context context, AttributeSet attrs) {
56 super(context, attrs);
57 }
58
59 public DropdownBreadcrumb(Context context) {
60 super(context);
61 }
62
63 @Override
Ben Lin62442452017-01-19 15:10:49 -080064 public void setup(Environment env, State state, IntConsumer listener) {
Ben Linb8c54e72016-06-10 12:13:27 -070065 mAdapter = new DropdownAdapter(state, env);
66 setOnItemSelectedListener(
67 new OnItemSelectedListener() {
68 @Override
69 public void onItemSelected(
70 AdapterView<?> parent, View view, int position, long id) {
71 listener.accept(position);
72 }
73
74 @Override
75 public void onNothingSelected(AdapterView<?> parent) {}
76 });
Tony Huangcd456612019-04-15 16:50:10 +080077 setAccessibilityDelegate(new AccessibilityDelegate() {
78 @Override
79 public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
80 if (event.getEventType() != AccessibilityEvent.TYPE_VIEW_SELECTED) {
81 super.onInitializeAccessibilityEvent(host, event);
82 }
83 }
84 });
Ben Linb8c54e72016-06-10 12:13:27 -070085 }
86
87 @Override
88 public void show(boolean visibility) {
89 if (visibility) {
90 setVisibility(VISIBLE);
91 setAdapter(mAdapter);
92 } else {
93 setVisibility(GONE);
94 setAdapter(null);
95 }
96 }
97
98 @Override
99 public void postUpdate() {
100 setSelection(mAdapter.getCount() - 1, false);
101 }
102
103 private static final class DropdownAdapter extends BaseAdapter {
104 private Environment mEnv;
105 private State mState;
106
107 public DropdownAdapter(State state, Environment env) {
108 mState = state;
109 mEnv = env;
110 }
111
112 @Override
113 public int getCount() {
114 return mState.stack.size();
115 }
116
117 @Override
118 public DocumentInfo getItem(int position) {
Garfield Tan2a837422016-10-19 11:50:45 -0700119 return mState.stack.get(position);
Ben Linb8c54e72016-06-10 12:13:27 -0700120 }
121
122 @Override
123 public long getItemId(int position) {
124 return position;
125 }
126
127 @Override
128 public View getView(int position, View convertView, ViewGroup parent) {
129 if (convertView == null) {
130 convertView = LayoutInflater.from(parent.getContext())
131 .inflate(R.layout.item_subdir_title, parent, false);
132 }
133
134 final TextView title = (TextView) convertView.findViewById(android.R.id.title);
135 final DocumentInfo doc = getItem(position);
136
137 if (position == 0) {
138 final RootInfo root = mEnv.getCurrentRoot();
139 title.setText(root.title);
140 } else {
141 title.setText(doc.displayName);
142 }
143
144 return convertView;
145 }
146
147 @Override
148 public View getDropDownView(int position, View convertView, ViewGroup parent) {
149 if (convertView == null) {
150 convertView = LayoutInflater.from(parent.getContext())
151 .inflate(R.layout.item_subdir, parent, false);
152 }
153
154 final TextView title = (TextView) convertView.findViewById(android.R.id.title);
155 final DocumentInfo doc = getItem(position);
156
157 if (position == 0) {
158 final RootInfo root = mEnv.getCurrentRoot();
159 title.setText(root.title);
160 } else {
161 title.setText(doc.displayName);
162 }
163
164 return convertView;
165 }
166 }
167
168}